diff --git a/app/models/project.rb b/app/models/project.rb index c0060504d74dd93d784122a1e097bf322ea20de5..f86f75fbbdcc52ef5d38945694f6763055f2c412 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -371,11 +371,7 @@ class Project < ActiveRecord::Base if Gitlab::ImportSources.importer_names.include?(project.import_type) && project.repo_exists? project.run_after_commit do - begin - Projects::HousecleaningService.new(project).execute - rescue Projects::HousekeepingService::LeaseTaken => e - Rails.logger.info("Could not perform housekeeping for project #{project.full_path} (#{project.id}): #{e}") - end + Projects::AfterImportService.new(project).execute end end end diff --git a/app/services/projects/after_import_service.rb b/app/services/projects/after_import_service.rb new file mode 100644 index 0000000000000000000000000000000000000000..bbada7e2b1c395f5dd2380d461d5be4e4f9406c3 --- /dev/null +++ b/app/services/projects/after_import_service.rb @@ -0,0 +1,32 @@ +module Projects + class AfterImportService + RESERVED_REFS_NAMES = + %w[heads tags merge-requests keep-around environments].freeze + + RESERVED_REFS_REGEXP = + %r{\Arefs/(?:#{Regexp.union(*RESERVED_REFS_NAMES)})/} + + def initialize(project) + @project = project + end + + def execute + Projects::HousekeepingService.new(@project).execute do + repository.delete_refs(garbage_refs) + end + rescue Projects::HousekeepingService::LeaseTaken => e + Rails.logger.info( + "Could not perform housekeeping for project #{@project.full_path} (#{@project.id}): #{e}") + end + + private + + def garbage_refs + @garbage_refs ||= repository.all_ref_names_except(RESERVED_REFS_REGEXP) + end + + def repository + @repository ||= @project.repository + end + end +end diff --git a/app/services/projects/housecleaning_service.rb b/app/services/projects/housecleaning_service.rb deleted file mode 100644 index d5cf8478e13c567638949c52271f34ec495833a2..0000000000000000000000000000000000000000 --- a/app/services/projects/housecleaning_service.rb +++ /dev/null @@ -1,40 +0,0 @@ -module Projects - class HousecleaningService - def self.reserved_refs_names - %w[heads tags merge-requests keep-around environments] - end - - def self.reserved_refs_regexp - names = reserved_refs_names.map(&Regexp.method(:escape)).join('|') - - %r{\Arefs/(?:#{names})/} - end - - def initialize(project) - @project = project - end - - # This could raise Projects::HousekeepingService::LeaseTaken - def execute - Projects::HousekeepingService.new(@project).execute do - garbage_refs.each(&rugged.references.method(:delete)) - end - end - - private - - def garbage_refs - @garbage_refs ||= begin - reserved_refs_regexp = self.class.reserved_refs_regexp - - rugged.references.reject do |ref| - ref.name =~ reserved_refs_regexp - end - end - end - - def rugged - @rugged ||= @project.repository.rugged - end - end -end diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb index eb3731ba35a8c244a62e4771721ac79bf4f33345..f6d30ad7534ce881d930b55832327317819ac010 100644 --- a/lib/gitlab/git/repository.rb +++ b/lib/gitlab/git/repository.rb @@ -232,6 +232,13 @@ module Gitlab branch_names + tag_names end + # Returns an Array of all ref names, except when it's matching pattern + # + # regexp - The pattern for ref names we don't want + def all_ref_names_except(regexp) + rugged.references.reject { |ref| ref.name =~ regexp }.map(&:name) + end + # Discovers the default branch based on the repository's available branches # # - If no branches are present, returns nil @@ -577,6 +584,10 @@ module Gitlab rugged.branches.delete(branch_name) end + def delete_refs(ref_names) + ref_names.each(&rugged.references.method(:delete)) + end + # Create a new branch named **ref+ based on **stat_point+, HEAD by default # # Examples: diff --git a/spec/services/projects/housecleaning_service_spec.rb b/spec/services/projects/after_import_service_spec.rb similarity index 93% rename from spec/services/projects/housecleaning_service_spec.rb rename to spec/services/projects/after_import_service_spec.rb index 3dd7906dc9a6588f89a193914cf91677e441e270..540d2191b2d0b561ac51ab264bdee504a1627f87 100644 --- a/spec/services/projects/housecleaning_service_spec.rb +++ b/spec/services/projects/after_import_service_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe Projects::HousecleaningService do +describe Projects::AfterImportService do subject { described_class.new(project) } let(:project) { create(:project, :repository) } @@ -37,7 +37,7 @@ describe Projects::HousecleaningService do end end - described_class.reserved_refs_names.each do |name| + described_class::RESERVED_REFS_NAMES.each do |name| context "with a ref in refs/#{name}/tmp" do before do repository.write_ref("refs/#{name}/tmp", sha)