diff --git a/Gemfile.lock b/Gemfile.lock index 9240b75e86ca9b886d3b4430187e5364e22a779f..aa144739eec40a02389b0fb049d0de70d0d68842 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -289,6 +289,9 @@ GEM terminal-table (>= 1.5.1) globalid (1.2.1) activesupport (>= 6.1) + google-protobuf (4.27.0-arm64-darwin) + bigdecimal + rake (>= 13) google-protobuf (4.27.0-x86_64-darwin) bigdecimal rake (>= 13) @@ -407,6 +410,8 @@ GEM net-smtp (0.5.0) net-protocol nio4r (2.7.3) + nokogiri (1.16.5-arm64-darwin) + racc (~> 1.4) nokogiri (1.16.5-x86_64-darwin) racc (~> 1.4) nokogiri (1.16.5-x86_64-linux) @@ -643,6 +648,7 @@ GEM zlib (2.1.1) PLATFORMS + arm64-darwin-23 x86_64-darwin-23 x86_64-linux diff --git a/app/models/communication/website/with_git_repository.rb b/app/models/communication/website/with_git_repository.rb index 30623f9e5530669657606ddf6c730042922069b1..e15f3d4db1d65ba342740d7764dbe6c50e42ce77 100644 --- a/app/models/communication/website/with_git_repository.rb +++ b/app/models/communication/website/with_git_repository.rb @@ -35,9 +35,14 @@ module Communication::Website::WithGitRepository # Synchronisation optimale d'objet indirect def sync_indirect_object_with_git(indirect_object) + all_dependencies = [] indirect_object.direct_sources.each do |direct_source| - add_direct_source_to_sync(direct_source) + all_dependencies = add_direct_source_to_sync(direct_source, array: all_dependencies) end + all_dependencies.each do |dependency| + Communication::Website::GitFile.sync self, dependency + end + git_repository.sync! end @@ -90,15 +95,18 @@ module Communication::Website::WithGitRepository protected - def add_direct_source_to_sync(direct_source) + def add_direct_source_to_sync(direct_source, array: []) # Ne pas traiter les sources d'autres sites - return unless direct_source.website.id == self.id + return array unless direct_source.website.id == self.id # Ne pas traiter les sources non synchronisables - return unless direct_source.syncable? - Communication::Website::GitFile.sync self, direct_source - direct_source.recursive_dependencies(syncable_only: true).each do |object| - Communication::Website::GitFile.sync self, object - end + return array unless direct_source.syncable? + # Ne pas traiter si la source directe est déjà dans le tableau de dépendances + return array if array.include?(direct_source) + array << direct_source + # On passe le tableau de dépendances à la méthode recursive_dependencies + # pour qu'il soit capable d'early return en cas de doublon + array += direct_source.recursive_dependencies(array: array, syncable_only: true) # On ne synchronise pas les références de l'objet direct, car on ne le modifie pas lui. + array end end diff --git a/app/services/git/repository.rb b/app/services/git/repository.rb index 079a622e17c20968996cd2d48dd9b69dfde7ae75..7ce91dfb1ab877c870133f7dc38c284b4dd20839 100644 --- a/app/services/git/repository.rb +++ b/app/services/git/repository.rb @@ -10,6 +10,7 @@ class Git::Repository end def add_git_file(git_file) + return if git_files.include?(git_file) puts "Adding #{git_file.path}" if git_files.empty? # The first file gives the commit name