Don't specify `shell` for Gitaly write-ref
Use shelling out to git to write refs instead of rugged, hoping to avoid creating invalid refs. To update HEAD we switched to using `git symbolic-ref`.
This commit is contained in:
parent
5e9921d547
commit
67f2faa72d
|
@ -1394,7 +1394,7 @@ class Project < ActiveRecord::Base
|
|||
def change_head(branch)
|
||||
if repository.branch_exists?(branch)
|
||||
repository.before_change_head
|
||||
repository.raw_repository.write_ref('HEAD', "refs/heads/#{branch}", shell: false)
|
||||
repository.raw_repository.write_ref('HEAD', "refs/heads/#{branch}")
|
||||
repository.copy_gitattributes(branch)
|
||||
repository.after_change_head
|
||||
reload_default_branch
|
||||
|
|
|
@ -259,7 +259,7 @@ class Repository
|
|||
next if kept_around?(sha)
|
||||
|
||||
# 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)
|
||||
raw_repository.write_ref(keep_around_ref_name(sha), sha)
|
||||
rescue Gitlab::Git::CommandError => ex
|
||||
Rails.logger.error "Unable to create keep-around reference for repository #{disk_path}: #{ex}"
|
||||
end
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Avoid creating invalid refs using rugged, shelling out for writing refs
|
||||
merge_request: 23286
|
||||
author:
|
||||
type: fixed
|
|
@ -723,11 +723,11 @@ module Gitlab
|
|||
delete_refs(tmp_ref)
|
||||
end
|
||||
|
||||
def write_ref(ref_path, ref, old_ref: nil, shell: true)
|
||||
def write_ref(ref_path, ref, old_ref: nil)
|
||||
ref_path = "#{Gitlab::Git::BRANCH_REF_PREFIX}#{ref_path}" unless ref_path.start_with?("refs/") || ref_path == "HEAD"
|
||||
|
||||
wrapped_gitaly_errors do
|
||||
gitaly_repository_client.write_ref(ref_path, ref, old_ref, shell)
|
||||
gitaly_repository_client.write_ref(ref_path, ref, old_ref)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -251,12 +251,11 @@ module Gitlab
|
|||
)
|
||||
end
|
||||
|
||||
def write_ref(ref_path, ref, old_ref, shell)
|
||||
def write_ref(ref_path, ref, old_ref)
|
||||
request = Gitaly::WriteRefRequest.new(
|
||||
repository: @gitaly_repo,
|
||||
ref: ref_path.b,
|
||||
revision: ref.b,
|
||||
shell: shell
|
||||
revision: ref.b
|
||||
)
|
||||
request.old_revision = old_ref.b unless old_ref.nil?
|
||||
|
||||
|
|
|
@ -1469,6 +1469,19 @@ describe Gitlab::Git::Repository, :seed_helper do
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
it 'writes the HEAD' do
|
||||
repository.write_ref('HEAD', 'refs/heads/feature')
|
||||
|
||||
expect(repository.commit('HEAD')).to eq(repository.commit('feature'))
|
||||
expect(repository.root_ref).to eq('feature')
|
||||
end
|
||||
|
||||
it 'writes other refs' do
|
||||
repository.write_ref('refs/heads/feature', SeedRepo::Commit::ID)
|
||||
|
||||
expect(repository.commit('feature').sha).to eq(SeedRepo::Commit::ID)
|
||||
end
|
||||
end
|
||||
|
||||
describe '#write_config' do
|
||||
|
|
|
@ -2203,12 +2203,6 @@ describe Project do
|
|||
project.change_head(project.default_branch)
|
||||
end
|
||||
|
||||
it 'creates the new reference with rugged' do
|
||||
expect(project.repository.raw_repository).to receive(:write_ref).with('HEAD', "refs/heads/#{project.default_branch}", shell: false)
|
||||
|
||||
project.change_head(project.default_branch)
|
||||
end
|
||||
|
||||
it 'copies the gitattributes' do
|
||||
expect(project.repository).to receive(:copy_gitattributes).with(project.default_branch)
|
||||
project.change_head(project.default_branch)
|
||||
|
|
Loading…
Reference in New Issue