diff options
author | Valery Sizov <valery@gitlab.com> | 2016-07-18 17:06:49 +0300 |
---|---|---|
committer | Valery Sizov <valery@gitlab.com> | 2016-07-19 07:45:22 +0300 |
commit | 501ce37f838205cfd588eed47d57ca4a90c68e51 (patch) | |
tree | 746957353201e064185b6b76f21a02a79de69170 | |
parent | a27212ab908d5161f5a75b27c4616c11f497f5d4 (diff) | |
download | gitlab-ce-501ce37f838205cfd588eed47d57ca4a90c68e51.tar.gz |
Fix of 'Commits being passed to custom hooks are already reachable when using the UI'
-rw-r--r-- | CHANGELOG | 2 | ||||
-rw-r--r-- | app/models/repository.rb | 72 | ||||
-rw-r--r-- | app/services/create_branch_service.rb | 28 |
3 files changed, 43 insertions, 59 deletions
diff --git a/CHANGELOG b/CHANGELOG index 1b35a67832c..56b7d2a485f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,6 @@ Please view this file on the master branch, on stable branches it's out of date. +v 8.11.0 (unreleased) + - Fix of 'Commits being passed to custom hooks are already reachable when using the UI' v 8.10.0 (unreleased) - Fix profile activity heatmap to show correct day name (eanplatter) diff --git a/app/models/repository.rb b/app/models/repository.rb index 09487b62f98..c187bad39ad 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -704,6 +704,7 @@ class Repository options[:commit] = { message: message, branch: ref, + update_ref: false, } raw_repository.mkdir(path, options) @@ -719,6 +720,7 @@ class Repository options[:commit] = { message: message, branch: ref, + update_ref: false, } options[:file] = { @@ -739,7 +741,8 @@ class Repository options[:author] = committer options[:commit] = { message: message, - branch: ref + branch: ref, + update_ref: false, } options[:file] = { @@ -779,11 +782,10 @@ class Repository merge_index = rugged.merge_commits(our_commit, their_commit) return false if merge_index.conflicts? - commit_with_hooks(user, merge_request.target_branch) do |tmp_ref| + commit_with_hooks(user, merge_request.target_branch) do actual_options = options.merge( parents: [our_commit, their_commit], tree: merge_index.write_tree(rugged), - update_ref: tmp_ref ) commit_id = Rugged::Commit.create(rugged, actual_options) @@ -798,15 +800,14 @@ class Repository return false unless revert_tree_id - commit_with_hooks(user, base_branch) do |ref| + commit_with_hooks(user, base_branch) do committer = user_to_committer(user) source_sha = Rugged::Commit.create(rugged, message: commit.revert_message, author: committer, committer: committer, tree: revert_tree_id, - parents: [rugged.lookup(source_sha)], - update_ref: ref) + parents: [rugged.lookup(source_sha)]) end end @@ -816,7 +817,7 @@ class Repository return false unless cherry_pick_tree_id - commit_with_hooks(user, base_branch) do |ref| + commit_with_hooks(user, base_branch) do committer = user_to_committer(user) source_sha = Rugged::Commit.create(rugged, message: commit.message, @@ -827,8 +828,7 @@ class Repository }, committer: committer, tree: cherry_pick_tree_id, - parents: [rugged.lookup(source_sha)], - update_ref: ref) + parents: [rugged.lookup(source_sha)]) end end @@ -929,20 +929,6 @@ class Repository Gitlab::Popen.popen(args, path_to_repo) end - def with_tmp_ref(oldrev = nil) - random_string = SecureRandom.hex - tmp_ref = "refs/tmp/#{random_string}/head" - - if oldrev && !Gitlab::Git.blank_ref?(oldrev) - rugged.references.create(tmp_ref, oldrev) - end - - # Make commit in tmp ref - yield(tmp_ref) - ensure - rugged.references.delete(tmp_ref) rescue nil - end - def commit_with_hooks(current_user, branch) update_autocrlf_option @@ -955,33 +941,31 @@ class Repository oldrev = target_branch.target end - with_tmp_ref(oldrev) do |tmp_ref| - # Make commit in tmp ref - newrev = yield(tmp_ref) + # Make commit + newrev = yield(ref) - unless newrev - raise CommitError.new('Failed to create commit') - end + unless newrev + raise CommitError.new('Failed to create commit') + end + + GitHooksService.new.execute(current_user, path_to_repo, oldrev, newrev, ref) do + if was_empty || !target_branch + # Create branch + rugged.references.create(ref, newrev) + else + # Update head + current_head = find_branch(branch).target - GitHooksService.new.execute(current_user, path_to_repo, oldrev, newrev, ref) do - if was_empty || !target_branch - # Create branch - rugged.references.create(ref, newrev) + # Make sure target branch was not changed during pre-receive hook + if current_head == oldrev + rugged.references.update(ref, newrev) else - # Update head - current_head = find_branch(branch).target - - # Make sure target branch was not changed during pre-receive hook - if current_head == oldrev - rugged.references.update(ref, newrev) - else - raise CommitError.new('Commit was rejected because branch received new push') - end + raise CommitError.new('Commit was rejected because branch received new push') end end - - newrev end + + newrev end def ls_files(ref) diff --git a/app/services/create_branch_service.rb b/app/services/create_branch_service.rb index d874582d54f..757fc35a78f 100644 --- a/app/services/create_branch_service.rb +++ b/app/services/create_branch_service.rb @@ -15,21 +15,19 @@ class CreateBranchService < BaseService return error('Branch already exists') end - new_branch = nil - - if source_project != @project - repository.with_tmp_ref do |tmp_ref| - repository.fetch_ref( - source_project.repository.path_to_repo, - "refs/heads/#{ref}", - tmp_ref - ) - - new_branch = repository.add_branch(current_user, branch_name, tmp_ref) - end - else - new_branch = repository.add_branch(current_user, branch_name, ref) - end + new_branch = if source_project != @project + repository.fetch_ref( + source_project.repository.path_to_repo, + "refs/heads/#{ref}", + "refs/heads/#{branch_name}" + ) + + repository.after_create_branch + + repository.find_branch(branch_name) + else + repository.add_branch(current_user, branch_name, ref) + end if new_branch success(new_branch) |