summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKim "BKC" Carlbäcker <kim.carlbacker@gmail.com>2018-01-18 21:31:40 +0100
committerKim "BKC" Carlbäcker <kim.carlbacker@gmail.com>2018-01-18 21:31:40 +0100
commit58aa32bceab1483897f3e898151e60b0cf917f68 (patch)
tree04a4fb89508c5daaba5d3c70039cee0e13fb3cf6
parentceb2a76876de68d705ab6d9ae677fb90fc8bab3e (diff)
downloadgitlab-ce-gitaly-write-ref-error-handling.tar.gz
Wrap Rugged-exceptions in Gitlab::Git::Repository#write_refgitaly-write-ref-error-handling
-rw-r--r--app/models/repository.rb12
-rw-r--r--lib/gitlab/git/repository.rb30
2 files changed, 24 insertions, 18 deletions
diff --git a/app/models/repository.rb b/app/models/repository.rb
index b4bc0f87458..f717d248615 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -261,12 +261,14 @@ class Repository
# This will still fail if the file is corrupted (e.g. 0 bytes)
begin
raw_repository.write_ref(keep_around_ref_name(sha), sha, shell: false)
- rescue Rugged::ReferenceError => 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/
+ rescue Gitlab::Git::CommandError => ex
+ if ex.message.start_with?("ReferenceError: ")
+ Rails.logger.error "Unable to create #{REF_KEEP_AROUND} reference for repository #{path}: #{ex}"
+ elsif ex.message.start_with?("OSError: ")
+ raise unless ex.message =~ /Failed to create locked file/ && ex.message =~ /File exists/
- Rails.logger.error "Unable to create #{REF_KEEP_AROUND} reference for repository #{path}: #{ex}"
+ Rails.logger.error "Unable to create #{REF_KEEP_AROUND} reference for repository #{path}: #{ex}"
+ end
end
end
diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb
index d0467bca992..e36ab2e32f6 100644
--- a/lib/gitlab/git/repository.rb
+++ b/lib/gitlab/git/repository.rb
@@ -1126,19 +1126,6 @@ module Gitlab
end
end
- def shell_write_ref(ref_path, ref, old_ref)
- raise ArgumentError, "invalid ref_path #{ref_path.inspect}" if ref_path.include?(' ')
- raise ArgumentError, "invalid ref #{ref.inspect}" if ref.include?("\x00")
- raise ArgumentError, "invalid old_ref #{old_ref.inspect}" if !old_ref.nil? && old_ref.include?("\x00")
-
- input = "update #{ref_path}\x00#{ref}\x00#{old_ref}\x00"
- run_git!(%w[update-ref --stdin -z]) { |stdin| stdin.write(input) }
- end
-
- def rugged_write_ref(ref_path, ref)
- rugged.references.create(ref_path, ref, force: true)
- end
-
def fetch_ref(source_repository, source_ref:, target_ref:)
Gitlab::Git.check_namespace!(source_repository)
source_repository = RemoteRepository.new(source_repository) unless source_repository.is_a?(RemoteRepository)
@@ -1396,6 +1383,23 @@ module Gitlab
private
+ def shell_write_ref(ref_path, ref, old_ref)
+ raise ArgumentError, "invalid ref_path #{ref_path.inspect}" if ref_path.include?(' ')
+ raise ArgumentError, "invalid ref #{ref.inspect}" if ref.include?("\x00")
+ raise ArgumentError, "invalid old_ref #{old_ref.inspect}" if !old_ref.nil? && old_ref.include?("\x00")
+
+ input = "update #{ref_path}\x00#{ref}\x00#{old_ref}\x00"
+ run_git!(%w[update-ref --stdin -z]) { |stdin| stdin.write(input) }
+ end
+
+ def rugged_write_ref(ref_path, ref)
+ rugged.references.create(ref_path, ref, force: true)
+ rescue Rugged::ReferenceError => ex
+ raise CommandError, "ReferenceError: #{ex}"
+ rescue Rugged::OSError => ex
+ raise CommandError, "OSError: #{ex}"
+ end
+
def fresh_worktree?(path)
File.exist?(path) && !clean_stuck_worktree(path)
end