From 224bdeeccae05f3b988537e7a6a1ae89ad0b20a2 Mon Sep 17 00:00:00 2001 From: f Date: Mon, 3 Jul 2023 13:10:39 -0300 Subject: [PATCH 1/4] fix: no usar Dir.chdir --- app/models/site/repository.rb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/models/site/repository.rb b/app/models/site/repository.rb index 62e4c45e..d149b732 100644 --- a/app/models/site/repository.rb +++ b/app/models/site/repository.rb @@ -158,10 +158,8 @@ class Site cmd = 'git gc' r = nil - Dir.chdir(path) do - Open3.popen2e(env, cmd, unsetenv_others: true) do |_, _, t| - r = t.value - end + Open3.popen2e(env, cmd, unsetenv_others: true, chdir: path) do |_, _, t| + r = t.value end r&.success? From 6ff0a36b44342f18d724b04685fc96e87637ac06 Mon Sep 17 00:00:00 2001 From: f Date: Mon, 3 Jul 2023 13:23:54 -0300 Subject: [PATCH 2/4] BREAKING CHANGE: Site::Repository#commit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit poder añadir y eliminar archivos en el mismo commit --- app/models/site/find_and_replace.rb | 2 +- app/models/site/repository.rb | 25 ++++++++++++------------- app/services/lfs_object_service.rb | 2 +- app/services/post_service.rb | 16 ++++++++-------- app/services/site_service.rb | 2 +- 5 files changed, 23 insertions(+), 24 deletions(-) diff --git a/app/models/site/find_and_replace.rb b/app/models/site/find_and_replace.rb index 2670159d..5da673c2 100644 --- a/app/models/site/find_and_replace.rb +++ b/app/models/site/find_and_replace.rb @@ -37,7 +37,7 @@ class Site author = GitAuthor.new email: "sutty@#{Site.domain}", name: 'Sutty' - repository.commit(file: modified, + repository.commit(add: modified, message: I18n.t('sites.find_and_replace'), usuarie: author) end diff --git a/app/models/site/repository.rb b/app/models/site/repository.rb index d149b732..9c435fb5 100644 --- a/app/models/site/repository.rb +++ b/app/models/site/repository.rb @@ -114,14 +114,21 @@ class Site end # Guarda los cambios en git - def commit(file:, usuarie:, message:, remove: false) - file = [file] unless file.respond_to? :each - + # + # @param :add [Array] Archivos a agregar + # @param :rm [Array] Archivos a eliminar + # @param :usuarie [Usuarie] Quién hace el commit + # @param :message [String] Mensaje + def commit(add: [], rm: [], usuarie:, message:) # Cargar el árbol actual rugged.index.read_tree rugged.head.target.tree - file.each do |f| - remove ? rm(f) : add(f) + add.each do |file| + rugged.index.add(relativize(file)) + end + + rm.each do |file| + rugged.index.remove(relativize(file)) end # Escribir los cambios para que el repositorio se vea tal cual @@ -142,14 +149,6 @@ class Site { name: 'Sutty', email: "sutty@#{Site.domain}", time: Time.now } end - def add(file) - rugged.index.add(relativize(file)) - end - - def rm(file) - rugged.index.remove(relativize(file)) - end - # Garbage collection # # @return [Boolean] diff --git a/app/services/lfs_object_service.rb b/app/services/lfs_object_service.rb index bb62301d..c885936a 100644 --- a/app/services/lfs_object_service.rb +++ b/app/services/lfs_object_service.rb @@ -22,7 +22,7 @@ class LfsObjectService Site::Writer.new(site: site, file: path, content: pointer).save # Commitear el pointer - site.repository.commit(file: path, usuarie: author, message: File.basename(path)) + site.repository.commit(add: [path], usuarie: author, message: File.basename(path)) # Eliminar el pointer FileUtils.rm(path) diff --git a/app/services/post_service.rb b/app/services/post_service.rb index 7b31867d..aef7db80 100644 --- a/app/services/post_service.rb +++ b/app/services/post_service.rb @@ -16,7 +16,7 @@ PostService = Struct.new(:site, :usuarie, :post, :params, keyword_init: true) do post.slug.value = p[:slug] if p[:slug].present? end - commit(action: :created, file: update_related_posts) if post.update(post_params) + commit(action: :created, add: update_related_posts) if post.update(post_params) update_site_license! @@ -34,7 +34,7 @@ PostService = Struct.new(:site, :usuarie, :post, :params, keyword_init: true) do # Los artículos anónimos siempre son borradores params[:draft] = true - commit(action: :created) if post.update(anon_post_params) + commit(action: :created, add: [post.path.absolute]) if post.update(anon_post_params) post end @@ -44,7 +44,7 @@ PostService = Struct.new(:site, :usuarie, :post, :params, keyword_init: true) do # Es importante que el artículo se guarde primero y luego los # relacionados. - commit(action: :updated, file: update_related_posts) if post.update(post_params) + commit(action: :updated, add: update_related_posts) if post.update(post_params) update_site_license! @@ -56,7 +56,7 @@ PostService = Struct.new(:site, :usuarie, :post, :params, keyword_init: true) do def destroy post.destroy! - commit(action: :destroyed) if post.destroyed? + commit(action: :destroyed, rm: [post.path.absolute]) if post.destroyed? post end @@ -85,15 +85,15 @@ PostService = Struct.new(:site, :usuarie, :post, :params, keyword_init: true) do # TODO: Implementar transacciones! posts.save_all(validate: false) && - commit(action: :reorder, file: files) + commit(action: :reorder, add: files) end private - def commit(action:, file: nil) - site.repository.commit(file: file || post.path.absolute, + def commit(action:, add: [], rm: []) + site.repository.commit(add: add, + rm: rm, usuarie: usuarie, - remove: action == :destroyed, message: I18n.t("post_service.#{action}", title: post&.title&.value)) end diff --git a/app/services/site_service.rb b/app/services/site_service.rb index 2c29538c..b1df3d10 100644 --- a/app/services/site_service.rb +++ b/app/services/site_service.rb @@ -94,7 +94,7 @@ SiteService = Struct.new(:site, :usuarie, :params, keyword_init: true) do def commit_config(action:) site.repository .commit(usuarie: usuarie, - file: site.config.path, + add: [site.config.path], message: I18n.t("site_service.#{action}", name: site.name)) end From 63620b2d091a195cfec85015b10df5ee56090e1a Mon Sep 17 00:00:00 2001 From: f Date: Mon, 3 Jul 2023 13:27:51 -0300 Subject: [PATCH 3/4] fix: commitear el cambio de nombre de archivo #2183 --- app/services/post_service.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/services/post_service.rb b/app/services/post_service.rb index aef7db80..4b7ce4fa 100644 --- a/app/services/post_service.rb +++ b/app/services/post_service.rb @@ -42,9 +42,13 @@ PostService = Struct.new(:site, :usuarie, :post, :params, keyword_init: true) do post.usuaries << usuarie params[:post][:draft] = true if site.invitade? usuarie + # Eliminar ("mover") el archivo si cambió de ubicación. + rm = [] + rm << post.path.value_was if post.path.changed? + # Es importante que el artículo se guarde primero y luego los # relacionados. - commit(action: :updated, add: update_related_posts) if post.update(post_params) + commit(action: :updated, add: update_related_posts, rm: rm) if post.update(post_params) update_site_license! From f05830c646faed40d16923923bd3867176a1c98b Mon Sep 17 00:00:00 2001 From: f Date: Mon, 3 Jul 2023 13:38:29 -0300 Subject: [PATCH 4/4] fix: primero hay que modificar los datos --- app/services/post_service.rb | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/app/services/post_service.rb b/app/services/post_service.rb index 4b7ce4fa..dda7992d 100644 --- a/app/services/post_service.rb +++ b/app/services/post_service.rb @@ -43,14 +43,16 @@ PostService = Struct.new(:site, :usuarie, :post, :params, keyword_init: true) do params[:post][:draft] = true if site.invitade? usuarie # Eliminar ("mover") el archivo si cambió de ubicación. - rm = [] - rm << post.path.value_was if post.path.changed? + if post.update(post_params) + rm = [] + rm << post.path.value_was if post.path.changed? - # Es importante que el artículo se guarde primero y luego los - # relacionados. - commit(action: :updated, add: update_related_posts, rm: rm) if post.update(post_params) + # Es importante que el artículo se guarde primero y luego los + # relacionados. + commit(action: :updated, add: update_related_posts, rm: rm) - update_site_license! + update_site_license! + end # Devolver el post aunque no se haya salvado para poder rescatar los # errores