Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/repositories/base_service.rb')
-rw-r--r--app/services/repositories/base_service.rb52
1 files changed, 52 insertions, 0 deletions
diff --git a/app/services/repositories/base_service.rb b/app/services/repositories/base_service.rb
new file mode 100644
index 00000000000..6a39399c791
--- /dev/null
+++ b/app/services/repositories/base_service.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+class Repositories::BaseService < BaseService
+ include Gitlab::ShellAdapter
+
+ DELETED_FLAG = '+deleted'
+
+ attr_reader :repository
+
+ delegate :project, :disk_path, :full_path, to: :repository
+ delegate :repository_storage, to: :project
+
+ def initialize(repository)
+ @repository = repository
+ end
+
+ def repo_exists?(path)
+ gitlab_shell.repository_exists?(repository_storage, path + '.git')
+ end
+
+ def mv_repository(from_path, to_path)
+ return true unless repo_exists?(from_path)
+
+ gitlab_shell.mv_repository(repository_storage, from_path, to_path)
+ end
+
+ # Build a path for removing repositories
+ # We use `+` because its not allowed by GitLab so user can not create
+ # project with name cookies+119+deleted and capture someone stalled repository
+ #
+ # gitlab/cookies.git -> gitlab/cookies+119+deleted.git
+ #
+ def removal_path
+ "#{disk_path}+#{project.id}#{DELETED_FLAG}"
+ end
+
+ # If we get a Gitaly error, the repository may be corrupted. We can
+ # ignore these errors since we're going to trash the repositories
+ # anyway.
+ def ignore_git_errors(&block)
+ yield
+ rescue Gitlab::Git::CommandError => e
+ Gitlab::GitLogger.warn(class: self.class.name, project_id: project.id, disk_path: disk_path, message: e.to_s)
+ end
+
+ def move_error(path)
+ error = %Q{Repository "#{path}" could not be moved}
+
+ log_error(error)
+ error(error)
+ end
+end