5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-06-02 05:04:16 +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
# 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

View file

@ -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'