Merge branch 'no-masters' into rails
This commit is contained in:
commit
1e60b5f447
2 changed files with 69 additions and 19 deletions
|
@ -6,16 +6,34 @@ class Site
|
|||
# que un sitio tiene un solo origen, que siempre se trabaja con la
|
||||
# rama master, etc.
|
||||
class Repository
|
||||
attr_reader :rugged, :changes, :path
|
||||
attr_reader :rugged, :path
|
||||
|
||||
# @param [String] la ruta del repositorio
|
||||
def initialize(path)
|
||||
@path = path
|
||||
@rugged = Rugged::Repository.new(path)
|
||||
@changes = 0
|
||||
end
|
||||
|
||||
def remote
|
||||
@remote ||= rugged.remotes.first
|
||||
# Obtiene la rama por defecto a partir de la referencia actual
|
||||
#
|
||||
# Por ejemplo "refs/heads/no-master" => "no-master"
|
||||
#
|
||||
# XXX: No memoizamos para obtener siempre el nombre de la rama
|
||||
# actual, aunque por ahora asumimos que siempre estamos en la misma,
|
||||
# internamente (ej. vía shell) podríamos cambiarla.
|
||||
#
|
||||
# @return [String]
|
||||
def default_branch
|
||||
rugged.head.canonical_name.split('/', 3).last
|
||||
end
|
||||
|
||||
# Obtiene el origin
|
||||
#
|
||||
# @return [Rugged::Remote]
|
||||
def origin
|
||||
@origin ||= rugged.remotes.find do |remote|
|
||||
remote.name == 'origin'
|
||||
end
|
||||
end
|
||||
|
||||
# Trae los cambios del repositorio de origen sin aplicarlos y
|
||||
|
@ -23,9 +41,11 @@ class Site
|
|||
#
|
||||
# XXX: Prestar atención a la velocidad de respuesta cuando tengamos
|
||||
# repositorios remotos.
|
||||
#
|
||||
# @return [Integer]
|
||||
def fetch
|
||||
if remote.check_connection :fetch
|
||||
@changes = rugged.fetch(remote)[:received_objects]
|
||||
if origin.check_connection :fetch
|
||||
rugged.fetch(origin)[:received_objects]
|
||||
else
|
||||
0
|
||||
end
|
||||
|
@ -33,8 +53,9 @@ class Site
|
|||
|
||||
# Incorpora los cambios en el repositorio actual
|
||||
#
|
||||
# @return [Rugged::Commit]
|
||||
def merge(usuarie)
|
||||
merge = rugged.merge_commits(master, origin_master)
|
||||
merge = rugged.merge_commits(head_commit, remote_head_commit)
|
||||
|
||||
# No hacemos nada si hay conflictos, pero notificarnos
|
||||
begin
|
||||
|
@ -46,7 +67,7 @@ class Site
|
|||
|
||||
commit = Rugged::Commit
|
||||
.create(rugged, update_ref: 'HEAD',
|
||||
parents: [master, origin_master],
|
||||
parents: [head_commit, remote_head_commit],
|
||||
tree: merge.write_tree(rugged),
|
||||
message: I18n.t('sites.fetch.merge.message'),
|
||||
author: author(usuarie), committer: committer)
|
||||
|
@ -57,12 +78,20 @@ class Site
|
|||
commit
|
||||
end
|
||||
|
||||
def master
|
||||
rugged.branches['master'].target
|
||||
# El último commit
|
||||
#
|
||||
# @return [Rugged::Commit]
|
||||
def head_commit
|
||||
rugged.branches[default_branch].target
|
||||
end
|
||||
|
||||
def origin_master
|
||||
rugged.branches['origin/master'].target
|
||||
# El último commit del repositorio remoto
|
||||
#
|
||||
# XXX: Realmente no recuerdo por qué esto era necesario ~f
|
||||
#
|
||||
# @return [Rugged::Commit]
|
||||
def remote_head_commit
|
||||
rugged.branches["origin/#{default_branch}"].target
|
||||
end
|
||||
|
||||
# Compara los commits entre el repositorio remoto y el actual para
|
||||
|
@ -72,10 +101,8 @@ class Site
|
|||
|
||||
# Obtenemos todos los commits que existen en origin/master que no
|
||||
# están en la rama master local
|
||||
#
|
||||
# XXX: monitorear esto por performance
|
||||
walker.push 'refs/remotes/origin/master'
|
||||
walker.hide 'refs/heads/master'
|
||||
walker.push "refs/remotes/origin/#{default_branch}"
|
||||
walker.hide "refs/heads/#{default_branch}"
|
||||
|
||||
walker.each.to_a
|
||||
end
|
||||
|
|
|
@ -18,8 +18,32 @@ class RepositoryTest < ActiveSupport::TestCase
|
|||
@site.destroy
|
||||
end
|
||||
|
||||
test 'se puede obtener la rama por defecto' do
|
||||
assert_equal 'master', @site.repository.default_branch
|
||||
|
||||
random_branch = SecureRandom.hex
|
||||
|
||||
Dir.chdir(@site.path) do
|
||||
`git checkout -b #{random_branch} >/dev/null 2>&1`
|
||||
end
|
||||
|
||||
assert_equal random_branch, @site.repository.default_branch
|
||||
end
|
||||
|
||||
test 'los nombres de las ramas pueden tener /' do
|
||||
random_branch = ([SecureRandom.hex] * 2).join('/')
|
||||
|
||||
Dir.chdir(@site.path) do
|
||||
`git checkout -b #{random_branch} >/dev/null 2>&1`
|
||||
end
|
||||
|
||||
assert_equal random_branch, @site.repository.default_branch
|
||||
end
|
||||
|
||||
# XXX: En realidad el git-reset no elimina la caché de fetch entonces
|
||||
# nunca tenemos valores mayores a cero.
|
||||
test 'se pueden traer cambios' do
|
||||
assert @site.repository.fetch.is_a?(Integer)
|
||||
assert @site.repository.fetch.zero?
|
||||
end
|
||||
|
||||
test 'se pueden mergear los cambios' do
|
||||
|
@ -28,8 +52,7 @@ class RepositoryTest < ActiveSupport::TestCase
|
|||
assert @site.repository.commits.empty?
|
||||
|
||||
assert_equal @usuarie.name,
|
||||
@site.repository.rugged
|
||||
.branches['master'].target.author[:name]
|
||||
@site.repository.rugged.branches[@site.repository.default_branch].target.author[:name]
|
||||
|
||||
Dir.chdir(@site.path) do
|
||||
FileUtils.rm 'migration.csv'
|
||||
|
|
Loading…
Reference in a new issue