diff options
Diffstat (limited to 'app/services/repositories/base_service.rb')
-rw-r--r-- | app/services/repositories/base_service.rb | 52 |
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 |