summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLin Jen-Shin <godfat@godfat.org>2017-08-09 17:55:53 +0800
committerLin Jen-Shin <godfat@godfat.org>2017-08-09 18:41:20 +0800
commit029fb98b02f00e55243eaa781dc2849e94f16ae5 (patch)
tree3c9f4fa4c47f545cdd557828026aeccc06e903a6
parentcb30868924d092d74a36ef8e5d0a5e7e8c09d48c (diff)
downloadgitlab-ce-029fb98b02f00e55243eaa781dc2849e94f16ae5.tar.gz
Detect if we didn't create the ref sooner
-rw-r--r--app/models/repository.rb5
-rw-r--r--spec/models/repository_spec.rb21
2 files changed, 25 insertions, 1 deletions
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 049bebdbe42..02f7f70ecb0 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -999,7 +999,7 @@ class Repository
yield(commit(branch_name_or_sha))
ensure
- rugged.references.delete(tmp_ref) if tmp_ref
+ rugged.references.delete(tmp_ref) if tmp_ref && ref_exists?(tmp_ref)
end
def add_remote(name, url)
@@ -1022,6 +1022,9 @@ class Repository
def fetch_ref(source_path, source_ref, target_ref)
args = %W(fetch --no-tags -f #{source_path} #{source_ref}:#{target_ref})
run_git(args)
+
+ # Make sure ref was created, and raise Rugged::ReferenceError when not
+ raise Rugged::ReferenceError unless ref_exists?(target_ref)
end
def create_ref(ref, ref_path)
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
index cfa77648338..1341f7c294c 100644
--- a/spec/models/repository_spec.rb
+++ b/spec/models/repository_spec.rb
@@ -961,6 +961,27 @@ describe Repository, models: true do
end
end
+ context 'when temporary ref failed to be created from other project' do
+ let(:target_project) { create(:project, :empty_repo) }
+
+ before do
+ expect(target_project.repository).to receive(:run_git)
+ end
+
+ it 'raises Rugged::ReferenceError' do
+ raise_reference_error = raise_error(Rugged::ReferenceError) do |err|
+ expect(err.cause).to be_nil
+ end
+
+ expect do
+ GitOperationService.new(user, target_project.repository)
+ .with_branch('feature',
+ start_project: project,
+ &:itself)
+ end.to raise_reference_error
+ end
+ end
+
context 'when the update adds more than one commit' do
let(:old_rev) { '33f3729a45c02fc67d00adb1b8bca394b0e761d9' }