diff options
author | Sean McGivern <sean@gitlab.com> | 2016-08-29 12:43:09 +0100 |
---|---|---|
committer | Sean McGivern <sean@gitlab.com> | 2016-08-30 11:56:11 +0100 |
commit | 1bda1e62def69bc0525a558f92acf182dc05fe8d (patch) | |
tree | 1ed1bd6c5330515146e81798be8ddaf047be5b06 /app/services/merge_requests | |
parent | 2db570e92cdff257fc45cfac7e453a4ddb1bfa81 (diff) | |
download | gitlab-ce-1bda1e62def69bc0525a558f92acf182dc05fe8d.tar.gz |
Fix resolving conflicts on forks21459-resolving-merge-conflicts-from-a-forked-repo-through-ui
Forks may not be up-to-date with the target project, and so might not
contain one of the parent refs in their repo. Fetch this if it isn't
present.
Diffstat (limited to 'app/services/merge_requests')
-rw-r--r-- | app/services/merge_requests/resolve_service.rb | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/app/services/merge_requests/resolve_service.rb b/app/services/merge_requests/resolve_service.rb index adc71b0c2bc..bd8b9f8cfd4 100644 --- a/app/services/merge_requests/resolve_service.rb +++ b/app/services/merge_requests/resolve_service.rb @@ -1,11 +1,14 @@ module MergeRequests class ResolveService < MergeRequests::BaseService - attr_accessor :conflicts, :rugged, :merge_index + attr_accessor :conflicts, :rugged, :merge_index, :merge_request def execute(merge_request) @conflicts = merge_request.conflicts @rugged = project.repository.rugged @merge_index = conflicts.merge_index + @merge_request = merge_request + + fetch_their_commit! conflicts.files.each do |file| write_resolved_file_to_index(file, params[:sections]) @@ -27,5 +30,16 @@ module MergeRequests merge_index.add(path: our_path, oid: rugged.write(new_file, :blob), mode: file.our_mode) merge_index.conflict_remove(our_path) end + + # If their commit (in the target project) doesn't exist in the source project, it + # can't be a parent for the merge commit we're about to create. If that's the case, + # fetch the target branch ref into the source project so the commit exists in both. + # + def fetch_their_commit! + return if rugged.include?(conflicts.their_commit.oid) + + remote = rugged.remotes.create_anonymous(merge_request.target_project.repository.path_to_repo) + remote.fetch(merge_request.target_branch) + end end end |