summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorDouwe Maan <douwe@gitlab.com>2017-08-30 18:08:37 +0000
committerDouwe Maan <douwe@gitlab.com>2017-08-30 18:08:37 +0000
commitd6e956d3a89fbb7f1a503f152fe9a4e2ca931d85 (patch)
treebcfe6c26b31fe352691c31bd6966d1f24c1fc247 /app
parente68a1fc1be858643299f8a753e8fa80dc901ef77 (diff)
parentc6371ae929d9a733c658de6d3e22ff60a1e7e8e4 (diff)
downloadgitlab-ce-d6e956d3a89fbb7f1a503f152fe9a4e2ca931d85.tar.gz
Merge branch '36807-gc-unwanted-refs-after-import' into 'master'
Remove unwanted refs after importing a project Closes #36807 See merge request !13766
Diffstat (limited to 'app')
-rw-r--r--app/models/environment.rb2
-rw-r--r--app/models/merge_request.rb2
-rw-r--r--app/models/project.rb6
-rw-r--r--app/models/repository.rb20
-rw-r--r--app/services/projects/after_import_service.rb29
-rw-r--r--app/services/projects/housekeeping_service.rb2
6 files changed, 50 insertions, 11 deletions
diff --git a/app/models/environment.rb b/app/models/environment.rb
index e9ebf0637f3..435eeaf0e2e 100644
--- a/app/models/environment.rb
+++ b/app/models/environment.rb
@@ -114,7 +114,7 @@ class Environment < ActiveRecord::Base
end
def ref_path
- "refs/environments/#{Shellwords.shellescape(name)}"
+ "refs/#{Repository::REF_ENVIRONMENTS}/#{Shellwords.shellescape(name)}"
end
def formatted_external_url
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 7f73de67625..5be2f6d4e82 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -803,7 +803,7 @@ class MergeRequest < ActiveRecord::Base
end
def ref_path
- "refs/merge-requests/#{iid}/head"
+ "refs/#{Repository::REF_MERGE_REQUEST}/#{iid}/head"
end
def ref_fetched?
diff --git a/app/models/project.rb b/app/models/project.rb
index d5324ceac31..9d7bea4eb66 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -372,11 +372,7 @@ class Project < ActiveRecord::Base
if Gitlab::ImportSources.importer_names.include?(project.import_type) && project.repo_exists?
project.run_after_commit do
- begin
- Projects::HousekeepingService.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/models/repository.rb b/app/models/repository.rb
index 090e3c896bd..d29d2a83708 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -1,6 +1,18 @@
require 'securerandom'
class Repository
+ REF_MERGE_REQUEST = 'merge-requests'.freeze
+ REF_KEEP_AROUND = 'keep-around'.freeze
+ REF_ENVIRONMENTS = 'environments'.freeze
+
+ RESERVED_REFS_NAMES = %W[
+ heads
+ tags
+ #{REF_ENVIRONMENTS}
+ #{REF_KEEP_AROUND}
+ #{REF_ENVIRONMENTS}
+ ].freeze
+
include Gitlab::ShellAdapter
include RepositoryMirroring
@@ -242,10 +254,10 @@ class Repository
begin
write_ref(keep_around_ref_name(sha), sha)
rescue Rugged::ReferenceError => ex
- Rails.logger.error "Unable to create keep-around reference for repository #{path}: #{ex}"
+ Rails.logger.error "Unable to create #{REF_KEEP_AROUND} reference for repository #{path}: #{ex}"
rescue Rugged::OSError => ex
raise unless ex.message =~ /Failed to create locked file/ && ex.message =~ /File exists/
- Rails.logger.error "Unable to create keep-around reference for repository #{path}: #{ex}"
+ Rails.logger.error "Unable to create #{REF_KEEP_AROUND} reference for repository #{path}: #{ex}"
end
end
@@ -1164,7 +1176,7 @@ class Repository
end
def keep_around_ref_name(sha)
- "refs/keep-around/#{sha}"
+ "refs/#{REF_KEEP_AROUND}/#{sha}"
end
def repository_event(event, tags = {})
@@ -1234,6 +1246,6 @@ class Repository
yield commit(sha)
ensure
- rugged.references.delete(tmp_ref) if tmp_ref
+ delete_refs(tmp_ref) if tmp_ref
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 00000000000..e6a68d983ef
--- /dev/null
+++ b/app/services/projects/after_import_service.rb
@@ -0,0 +1,29 @@
+module Projects
+ class AfterImportService
+ RESERVED_REFS_REGEXP =
+ %r{\Arefs/(?:#{Regexp.union(*Repository::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/housekeeping_service.rb b/app/services/projects/housekeeping_service.rb
index d66ef676088..dcef8b66215 100644
--- a/app/services/projects/housekeeping_service.rb
+++ b/app/services/projects/housekeeping_service.rb
@@ -26,6 +26,8 @@ module Projects
lease_uuid = try_obtain_lease
raise LeaseTaken unless lease_uuid.present?
+ yield if block_given?
+
execute_gitlab_shell_gc(lease_uuid)
end