5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-15 04:11:41 +00:00

Merge branch 'no-masters' into rails

This commit is contained in:
f 2021-04-21 10:16:31 -03:00
commit 1e60b5f447
2 changed files with 69 additions and 19 deletions

View file

@ -6,16 +6,34 @@ class Site
# que un sitio tiene un solo origen, que siempre se trabaja con la # que un sitio tiene un solo origen, que siempre se trabaja con la
# rama master, etc. # rama master, etc.
class Repository class Repository
attr_reader :rugged, :changes, :path attr_reader :rugged, :path
# @param [String] la ruta del repositorio
def initialize(path) def initialize(path)
@path = path @path = path
@rugged = Rugged::Repository.new(path) @rugged = Rugged::Repository.new(path)
@changes = 0
end end
def remote # Obtiene la rama por defecto a partir de la referencia actual
@remote ||= rugged.remotes.first #
# 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 end
# Trae los cambios del repositorio de origen sin aplicarlos y # 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 # XXX: Prestar atención a la velocidad de respuesta cuando tengamos
# repositorios remotos. # repositorios remotos.
#
# @return [Integer]
def fetch def fetch
if remote.check_connection :fetch if origin.check_connection :fetch
@changes = rugged.fetch(remote)[:received_objects] rugged.fetch(origin)[:received_objects]
else else
0 0
end end
@ -33,8 +53,9 @@ class Site
# Incorpora los cambios en el repositorio actual # Incorpora los cambios en el repositorio actual
# #
# @return [Rugged::Commit]
def merge(usuarie) 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 # No hacemos nada si hay conflictos, pero notificarnos
begin begin
@ -46,7 +67,7 @@ class Site
commit = Rugged::Commit commit = Rugged::Commit
.create(rugged, update_ref: 'HEAD', .create(rugged, update_ref: 'HEAD',
parents: [master, origin_master], parents: [head_commit, remote_head_commit],
tree: merge.write_tree(rugged), tree: merge.write_tree(rugged),
message: I18n.t('sites.fetch.merge.message'), message: I18n.t('sites.fetch.merge.message'),
author: author(usuarie), committer: committer) author: author(usuarie), committer: committer)
@ -57,12 +78,20 @@ class Site
commit commit
end end
def master # El último commit
rugged.branches['master'].target #
# @return [Rugged::Commit]
def head_commit
rugged.branches[default_branch].target
end end
def origin_master # El último commit del repositorio remoto
rugged.branches['origin/master'].target #
# XXX: Realmente no recuerdo por qué esto era necesario ~f
#
# @return [Rugged::Commit]
def remote_head_commit
rugged.branches["origin/#{default_branch}"].target
end end
# Compara los commits entre el repositorio remoto y el actual para # 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 # Obtenemos todos los commits que existen en origin/master que no
# están en la rama master local # están en la rama master local
# walker.push "refs/remotes/origin/#{default_branch}"
# XXX: monitorear esto por performance walker.hide "refs/heads/#{default_branch}"
walker.push 'refs/remotes/origin/master'
walker.hide 'refs/heads/master'
walker.each.to_a walker.each.to_a
end end

View file

@ -18,8 +18,32 @@ class RepositoryTest < ActiveSupport::TestCase
@site.destroy @site.destroy
end 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 test 'se pueden traer cambios' do
assert @site.repository.fetch.is_a?(Integer) assert @site.repository.fetch.zero?
end end
test 'se pueden mergear los cambios' do test 'se pueden mergear los cambios' do
@ -28,8 +52,7 @@ class RepositoryTest < ActiveSupport::TestCase
assert @site.repository.commits.empty? assert @site.repository.commits.empty?
assert_equal @usuarie.name, assert_equal @usuarie.name,
@site.repository.rugged @site.repository.rugged.branches[@site.repository.default_branch].target.author[:name]
.branches['master'].target.author[:name]
Dir.chdir(@site.path) do Dir.chdir(@site.path) do
FileUtils.rm 'migration.csv' FileUtils.rm 'migration.csv'