diff --git a/app/jobs/git_pull_job.rb b/app/jobs/git_pull_job.rb index 72e20be0..30431495 100644 --- a/app/jobs/git_pull_job.rb +++ b/app/jobs/git_pull_job.rb @@ -1,18 +1,29 @@ # frozen_string_literal: true -# Permite traer los cambios desde webhooks - +# Permite traer los cambios desde el repositorio remoto class GitPullJob < ApplicationJob # @param :site [Site] # @param :usuarie [Usuarie] + # @param :message [String] # @return [nil] - def perform(site, usuarie) + def perform(site, usuarie, message) @site = site return unless site.repository.origin - return unless site.repository.fetch.positive? - site.repository.merge(usuarie) + site.repository.fetch + + return if site.repository.up_to_date? + + if site.repository.fast_forward? + site.repository.fast_forward! + else + site.repository.merge(usuarie, message) + end + + site.repository.git_lfs_checkout site.reindex_changes! + + nil end end diff --git a/app/models/site/repository.rb b/app/models/site/repository.rb index 7d06fe55..581b8c87 100644 --- a/app/models/site/repository.rb +++ b/app/models/site/repository.rb @@ -75,13 +75,18 @@ class Site # Forzamos el checkout para mover el HEAD al Ășltimo commit y # escribir los cambios rugged.checkout 'HEAD', strategy: :force - - git_sh("git", "lfs", "fetch", "origin", default_branch) - # reemplaza los pointers por los archivos correspondientes - git_sh("git", "lfs", "checkout") + commit end + # Trae todos los archivos desde LFS + # + # @return [Boolean] + def git_lfs_checkout + git_sh('git', 'lfs', 'fetch', 'origin', default_branch) + git_sh('git', 'lfs', 'checkout') + end + # El Ășltimo commit # # @return [Rugged::Commit] @@ -111,10 +116,30 @@ class Site walker.each.to_a end - # Hay commits sin aplicar? - def needs_pull? - fetch - !commits.empty? + # Detecta si hay que hacer un pull o no + # + # @return [Boolean] + def up_to_date? + rugged.merge_analysis(remote_head_commit).include?(:up_to_date) + end + + # Detecta si es posible adelantar la historia local a la remota o + # necesitamos un merge + # + # @return [Boolean] + def fast_forward? + rugged.merge_analysis(remote_head_commit).include?(:fastforward) + end + + # Mueve la historia local a la remota + # + # @see {https://stackoverflow.com/a/27077322} + # @return [nil] + def fast_forward! + rugged.checkout_tree(remote_head_commit) + rugged.references.update(rugged.head.resolve, remote_head_commit.oid) + + nil end # Guarda los cambios en git