From e8adc64f09be50edb0513b0d2eadbb67896851eb Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Sat, 19 Mar 2011 15:46:09 +0300 Subject: [PATCH] GitMergeUpdater: fix swapped local/server versions, extract method from GitTask. --- .../src/git4idea/update/GitMergeUpdater.java | 84 +++++++++++-------- 1 file changed, 47 insertions(+), 37 deletions(-) diff --git a/plugins/git4idea/src/git4idea/update/GitMergeUpdater.java b/plugins/git4idea/src/git4idea/update/GitMergeUpdater.java index 8c15ff51bcd0..b0d0b51c38be 100644 --- a/plugins/git4idea/src/git4idea/update/GitMergeUpdater.java +++ b/plugins/git4idea/src/git4idea/update/GitMergeUpdater.java @@ -41,6 +41,7 @@ import org.jetbrains.annotations.NotNull; import java.io.File; import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; /** @@ -75,6 +76,7 @@ public class GitMergeUpdater extends GitUpdater { mergeTask.setExecuteResultInAwt(false); mergeTask.setProgressAnalyzer(new GitStandardProgressAnalyzer()); final AtomicReference updateResult = new AtomicReference(); + final AtomicBoolean failure = new AtomicBoolean(); mergeTask.executeInBackground(true, new GitTaskResultHandlerAdapter() { @Override protected void onSuccess() { updateResult.set(GitUpdateResult.SUCCESS); @@ -86,48 +88,56 @@ public class GitMergeUpdater extends GitUpdater { } @Override protected void onFailure() { - final MergeError error = mergeLineListener.getMergeError(); - LOG.info("doUpdate merge error: " + error); - if (error == MergeError.CONFLICT) { - final boolean allMerged = - new GitMergeConflictResolver(myProject, true, "Merge conflicts detected. Resolve them before continuing update.", - "Can't update", "") { - @Override protected boolean proceedIfNothingToMerge() throws VcsException { - merger.mergeCommit(myRoot); - return true; - } - - @Override protected boolean proceedAfterAllMerged() throws VcsException { - merger.mergeCommit(myRoot); - return true; - } - }.merge(Collections.singleton(myRoot)); - updateResult.set(allMerged ? GitUpdateResult.SUCCESS : GitUpdateResult.INCOMPLETE); - } - else if (error == MergeError.LOCAL_CHANGES) { - final List paths = getFilesOverwrittenByMerge(mergeLineListener.getOutput()); - final Collection changes = getLocalChangesFilteredByFiles(paths); - final ChangeListViewerDialog dialog = new ChangeListViewerDialog(myProject, changes, false) { - @Override protected String getDescription() { - return "Your local changes to the following files would be overwritten by merge.
" + - "Please, commit your changes or stash them before you can merge."; - } - }; - UIUtil.invokeAndWaitIfNeeded(new Runnable() { - @Override public void run() { - dialog.show(); - } - }); - updateResult.set(GitUpdateResult.ERROR); - } else { - GitUIUtil.notifyImportantError(myProject, "Error merging", GitUIUtil.stringifyErrors(mergeHandler.errors())); - updateResult.set(GitUpdateResult.ERROR); - } + failure.set(true); } }); + + if (failure.get()) { + updateResult.set(handleMergeFailure(mergeLineListener, merger, mergeHandler)); + } return updateResult.get(); } + private GitUpdateResult handleMergeFailure(MergeLineListener mergeLineListener, final GitMerger merger, GitLineHandler mergeHandler) { + final MergeError error = mergeLineListener.getMergeError(); + LOG.info("doUpdate merge error: " + error); + if (error == MergeError.CONFLICT) { + final boolean allMerged = + new GitMergeConflictResolver(myProject, false, "Merge conflicts detected. Resolve them before continuing update.", + "Can't complete update", "") { + @Override protected boolean proceedIfNothingToMerge() throws VcsException { + merger.mergeCommit(myRoot); + return true; + } + + @Override protected boolean proceedAfterAllMerged() throws VcsException { + merger.mergeCommit(myRoot); + return true; + } + }.merge(Collections.singleton(myRoot)); + return allMerged ? GitUpdateResult.SUCCESS : GitUpdateResult.INCOMPLETE; + } + else if (error == MergeError.LOCAL_CHANGES) { + final List paths = getFilesOverwrittenByMerge(mergeLineListener.getOutput()); + final Collection changes = getLocalChangesFilteredByFiles(paths); + final ChangeListViewerDialog dialog = new ChangeListViewerDialog(myProject, changes, false) { + @Override protected String getDescription() { + return "Your local changes to the following files would be overwritten by merge.
" + + "Please, commit your changes or stash them before you can merge."; + } + }; + UIUtil.invokeAndWaitIfNeeded(new Runnable() { + @Override public void run() { + dialog.show(); + } + }); + return GitUpdateResult.ERROR; + } else { + GitUIUtil.notifyImportantError(myProject, "Error merging", GitUIUtil.stringifyErrors(mergeHandler.errors())); + return GitUpdateResult.ERROR; + } + } + @Override public boolean isSaveNeeded() { // git log --name-status master..origin/master