mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-15 07:11:43 +00:00
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
|
# 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
|
||||||
|
|
|
@ -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'
|
||||||
|
|
Loading…
Reference in a new issue