diff options
author | Douwe Maan <douwe@gitlab.com> | 2018-01-30 18:48:56 +0000 |
---|---|---|
committer | Douwe Maan <douwe@gitlab.com> | 2018-01-30 18:48:56 +0000 |
commit | 40e128730f4799dcf0fc485f3b6541db0b9c5767 (patch) | |
tree | c739f69f3f860f18e610d681c2549c57caad79d4 | |
parent | 4752f629cdcc25fd7755dd73ccf3a8e78a37b476 (diff) | |
parent | 10fb904d636ab49b87e2deb756f64fc26d2eacec (diff) | |
download | gitlab-ce-40e128730f4799dcf0fc485f3b6541db0b9c5767.tar.gz |
Merge branch 'gitaly-784-repo-write-ref' into 'master'
Migrate Git::Repository#write_ref to Gitaly
Closes gitaly#784
See merge request gitlab-org/gitlab-ce!16513
-rw-r--r-- | app/models/repository.rb | 2 | ||||
-rw-r--r-- | lib/gitlab/git/repository.rb | 20 | ||||
-rw-r--r-- | lib/gitlab/gitaly_client/repository_service.rb | 16 |
3 files changed, 34 insertions, 4 deletions
diff --git a/app/models/repository.rb b/app/models/repository.rb index 872d4468ac8..6c776301ac2 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -255,6 +255,8 @@ class Repository # This will still fail if the file is corrupted (e.g. 0 bytes) raw_repository.write_ref(keep_around_ref_name(sha), sha, shell: false) + rescue Gitlab::Git::CommandError => ex + Rails.logger.error "Unable to create keep-around reference for repository #{path}: #{ex}" end def kept_around?(sha) diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb index e710ad2940f..8614c1bd417 100644 --- a/lib/gitlab/git/repository.rb +++ b/lib/gitlab/git/repository.rb @@ -1106,10 +1106,14 @@ module Gitlab end def write_ref(ref_path, ref, old_ref: nil, shell: true) - if shell - shell_write_ref(ref_path, ref, old_ref) - else - rugged_write_ref(ref_path, ref) + ref_path = "#{Gitlab::Git::BRANCH_REF_PREFIX}#{ref_path}" unless ref_path.start_with?("refs/") || ref_path == "HEAD" + + gitaly_migrate(:write_ref) do |is_enabled| + if is_enabled + gitaly_repository_client.write_ref(ref_path, ref, old_ref, shell) + else + local_write_ref(ref_path, ref, old_ref: old_ref, shell: shell) + end end end @@ -1433,6 +1437,14 @@ module Gitlab private + def local_write_ref(ref_path, ref, old_ref: nil, shell: true) + if shell + shell_write_ref(ref_path, ref, old_ref) + else + rugged_write_ref(ref_path, ref) + 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") diff --git a/lib/gitlab/gitaly_client/repository_service.rb b/lib/gitlab/gitaly_client/repository_service.rb index b0dbaf11598..7adf32af209 100644 --- a/lib/gitlab/gitaly_client/repository_service.rb +++ b/lib/gitlab/gitaly_client/repository_service.rb @@ -203,6 +203,22 @@ module Gitlab timeout: GitalyClient.default_timeout ) end + + def write_ref(ref_path, ref, old_ref, shell) + request = Gitaly::WriteRefRequest.new( + repository: @gitaly_repo, + ref: ref_path.b, + revision: ref.b, + shell: shell + ) + request.old_revision = old_ref.b unless old_ref.nil? + + response = GitalyClient.call(@storage, :repository_service, :write_ref, request) + + raise Gitlab::Git::CommandError, encode!(response.error) if response.error.present? + + true + end end end end |