From 8de6d09113f6791b1ca76fef2cc170cb55bab56d Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Wed, 4 May 2011 17:44:23 +0400 Subject: [PATCH] IDEA-68087 hg: correctly parse "hg id" in case of 2 heads. * HgWorkingCopyRevisionsCommand#identify returns 2 heads in the case of uncommitted merge. * In all places we take the first id. * HgIntegrateDialog removes current head accurate within "+". * HgIntegrateDialog modifies UI components in UI thread. [reviewed by irengrig] --- .../org/zmlx/hg4idea/HgRevisionNumber.java | 2 +- .../HgWorkingCopyRevisionsCommand.java | 25 +++++++++++--- .../hg4idea/provider/HgChangeProvider.java | 2 +- .../zmlx/hg4idea/provider/HgDiffProvider.java | 2 +- .../zmlx/hg4idea/ui/HgIntegrateDialog.java | 33 ++++++++++++++----- .../org/zmlx/hg4idea/test/HgUpdateTest.java | 4 +-- 6 files changed, 49 insertions(+), 19 deletions(-) diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/HgRevisionNumber.java b/plugins/hg4idea/src/org/zmlx/hg4idea/HgRevisionNumber.java index 781aa96a8e3f..639e858e2ae1 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/HgRevisionNumber.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/HgRevisionNumber.java @@ -127,7 +127,7 @@ public class HgRevisionNumber implements VcsRevisionNumber { /** * Returns the numeric part of the revision, i. e. the revision without trailing '+' if one exists. */ - private String getRevisionNumber() { + public String getRevisionNumber() { if (isWorkingVersion) { return revision.substring(0, revision.length()-1); } diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgWorkingCopyRevisionsCommand.java b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgWorkingCopyRevisionsCommand.java index f6b19f46b8c7..a672d9f8d85a 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgWorkingCopyRevisionsCommand.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgWorkingCopyRevisionsCommand.java @@ -127,22 +127,37 @@ public class HgWorkingCopyRevisionsCommand { else return HgRevisionNumber.NULL_REVISION_NUMBER; } - @Nullable - public HgRevisionNumber identify(@NotNull VirtualFile repo) { + /** + * Returns the result of 'hg id' execution, i.e. current state of the repository. + * @return one or two revision numbers. Two revisions is the case of unresolved merge. In other cases there are only one revision. + */ + @NotNull + public Pair identify(@NotNull VirtualFile repo) { HgCommandExecutor commandExecutor = new HgCommandExecutor(myProject); commandExecutor.setSilent(true); HgCommandResult result = commandExecutor.executeInCurrentThread(repo, "identify", Arrays.asList("--num", "--id")); if (result == null) { - return HgRevisionNumber.NULL_REVISION_NUMBER; + return Pair.create(HgRevisionNumber.NULL_REVISION_NUMBER, null); } + final List lines = result.getOutputLines(); if (lines != null && !lines.isEmpty()) { String[] parts = StringUtils.split(lines.get(0), ' '); + String changesets = parts[0]; + String revisions = parts[1]; if (parts.length >= 2) { - return HgRevisionNumber.getInstance(parts[1], parts[0]); + if (changesets.indexOf('+') != changesets.lastIndexOf('+')) { + // in the case of unresolved merge we have 2 revisions at once, both current, so with "+" + // 9f2e6c02913c+b311eb4eb004+ 186+183+ + String[] chsets = StringUtils.split(changesets, "+"); + String[] revs = StringUtils.split(revisions, "+"); + return Pair.create(HgRevisionNumber.getInstance(revs[0] + "+", chsets[0] + "+"), HgRevisionNumber.getInstance(revs[1] + "+", chsets[1] + "+")); + } else { + return Pair.create(HgRevisionNumber.getInstance(revisions, changesets), null); + } } } - return HgRevisionNumber.NULL_REVISION_NUMBER; + return Pair.create(HgRevisionNumber.NULL_REVISION_NUMBER, null); } /** diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgChangeProvider.java b/plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgChangeProvider.java index b63b812ba89e..16b6a83801b2 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgChangeProvider.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgChangeProvider.java @@ -80,7 +80,7 @@ public class HgChangeProvider implements ChangeProvider { for (Map.Entry> entry : HgUtil.groupFilePathsByHgRoots(myProject, files).entrySet()) { VirtualFile repo = entry.getKey(); - final HgRevisionNumber workingRevision = new HgWorkingCopyRevisionsCommand(myProject).identify(repo); + final HgRevisionNumber workingRevision = new HgWorkingCopyRevisionsCommand(myProject).identify(repo).getFirst(); final HgRevisionNumber parentRevision = new HgWorkingCopyRevisionsCommand(myProject).firstParent(repo); final Map list = new HgResolveCommand(myProject).getListSynchronously(repo); diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgDiffProvider.java b/plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgDiffProvider.java index ef70094a8d4f..786e1b6b5017 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgDiffProvider.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgDiffProvider.java @@ -64,7 +64,7 @@ public class HgDiffProvider implements DiffProvider { } HgWorkingCopyRevisionsCommand command = new HgWorkingCopyRevisionsCommand(project); - HgRevisionNumber currentRevision = command.identify(vcsRoot); + HgRevisionNumber currentRevision = command.identify(vcsRoot).getFirst(); if (currentRevision == null) { return null; } diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgIntegrateDialog.java b/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgIntegrateDialog.java index 3684a310fb9c..1af47c08ef8d 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgIntegrateDialog.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgIntegrateDialog.java @@ -34,6 +34,7 @@ import javax.swing.event.ChangeListener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Collection; +import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -175,15 +176,24 @@ public class HgIntegrateDialog implements Configurable { return; } - otherHeadRadioButton.setVisible(true); - otherHeadLabel.setVisible(true); - - HgRevisionNumber currentParent = new HgWorkingCopyRevisionsCommand(project).identify(root); - heads.remove(currentParent); + HgRevisionNumber currentParent = new HgWorkingCopyRevisionsCommand(project).identify(root).getFirst(); + for (Iterator it = heads.iterator() ; it.hasNext(); ) { + final HgRevisionNumber rev = it.next(); + if (rev.getRevisionNumber().equals(currentParent.getRevisionNumber())) { + it.remove(); + } + } if (heads.size() == 1) { - otherHead = heads.get(0); - otherHeadLabel.setText(HgVcsMessages.message("hg4idea.integrate.other.head", otherHead.asString())); + UIUtil.invokeLaterIfNeeded(new Runnable() { + @Override + public void run() { + otherHeadRadioButton.setVisible(true); + otherHeadLabel.setVisible(true); + otherHead = heads.get(0); + otherHeadLabel.setText(HgVcsMessages.message("hg4idea.integrate.other.head", otherHead.asString())); + } + }); } else { //apparently we are not at one of the heads disableOtherHeadsChoice(); @@ -193,8 +203,13 @@ public class HgIntegrateDialog implements Configurable { } private void disableOtherHeadsChoice() { - otherHeadLabel.setVisible(false); - otherHeadRadioButton.setVisible(false); + UIUtil.invokeLaterIfNeeded(new Runnable() { + @Override + public void run() { + otherHeadLabel.setVisible(false); + otherHeadRadioButton.setVisible(false); + } + }); } private List pathsToFiles(Collection paths) { diff --git a/plugins/hg4idea/testSrc/org/zmlx/hg4idea/test/HgUpdateTest.java b/plugins/hg4idea/testSrc/org/zmlx/hg4idea/test/HgUpdateTest.java index 94e5ab1de4ba..ccf62f252c91 100644 --- a/plugins/hg4idea/testSrc/org/zmlx/hg4idea/test/HgUpdateTest.java +++ b/plugins/hg4idea/testSrc/org/zmlx/hg4idea/test/HgUpdateTest.java @@ -120,9 +120,9 @@ public class HgUpdateTest extends HgCollaborativeTest { List branchHeads = new HgHeadsCommand(myProject, projectRepoVirtualFile).execute(); assertEquals(branchHeads.size(), 2); - HgRevisionNumber parentBeforeUpdate = new HgWorkingCopyRevisionsCommand(myProject).identify(projectRepoVirtualFile); + HgRevisionNumber parentBeforeUpdate = new HgWorkingCopyRevisionsCommand(myProject).identify(projectRepoVirtualFile).getFirst(); assertUpdateThroughPluginFails(); - HgRevisionNumber parentAfterUpdate = new HgWorkingCopyRevisionsCommand(myProject).identify(projectRepoVirtualFile); + HgRevisionNumber parentAfterUpdate = new HgWorkingCopyRevisionsCommand(myProject).identify(projectRepoVirtualFile).getFirst(); List branchHeadsAfterUpdate = new HgHeadsCommand(myProject, projectRepoVirtualFile).execute(); assertEquals(branchHeadsAfterUpdate.size(), 3);