diff options
author | Rubén Dávila <rdavila84@gmail.com> | 2016-02-24 12:00:34 -0500 |
---|---|---|
committer | Rubén Dávila <rdavila84@gmail.com> | 2016-03-01 19:16:27 -0500 |
commit | 0c116d8ed6736de0d08ca838ae03aeca7dcaf142 (patch) | |
tree | 69eb1eb181bf63d83c81138b77141ece9303972a /app/models/repository.rb | |
parent | 6aa50165b0acc355925e271f07ef8e87291e0232 (diff) | |
download | gitlab-ce-0c116d8ed6736de0d08ca838ae03aeca7dcaf142.tar.gz |
Check for conflicts before creating target branch.
Diffstat (limited to 'app/models/repository.rb')
-rw-r--r-- | app/models/repository.rb | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/app/models/repository.rb b/app/models/repository.rb index a214a69d749..16a8aa3ad01 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -654,30 +654,38 @@ class Repository end end - def revert(user, commit, base_branch, target_branch = nil) - source_sha = find_branch(base_branch).target - target_branch ||= base_branch - args = [commit.id, source_sha] - args << { mainline: 1 } if commit.merge_commit? + def revert(user, commit, base_branch, revert_tree_id = nil) + source_sha = find_branch(base_branch).target + revert_tree_id = check_revert_content(commit, base_branch) unless revert_tree_id - revert_index = rugged.revert_commit(*args) - return false if revert_index.conflicts? - - tree_id = revert_index.write_tree(rugged) - return false unless diff_exists?(source_sha, tree_id) + return false unless revert_tree_id - commit_with_hooks(user, target_branch) do |ref| + commit_with_hooks(user, base_branch) do |ref| committer = user_to_committer(user) source_sha = Rugged::Commit.create(rugged, message: commit.revert_message, author: committer, committer: committer, - tree: tree_id, + tree: revert_tree_id, parents: [rugged.lookup(source_sha)], update_ref: ref) end end + def check_revert_content(commit, base_branch) + source_sha = find_branch(base_branch).target + args = [commit.id, source_sha] + args << { mainline: 1 } if commit.merge_commit? + + revert_index = rugged.revert_commit(*args) + return false if revert_index.conflicts? + + tree_id = revert_index.write_tree(rugged) + return false unless diff_exists?(source_sha, tree_id) + + tree_id + end + def diff_exists?(sha1, sha2) rugged.diff(sha1, sha2).size > 0 end |