From 4a7dcb10ba9bd674e50fee68ace53f9f7b91113f Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Thu, 11 Aug 2016 18:33:35 +0300 Subject: [PATCH] IDEA-146022 IDEA-148275 filter affected roots by vcs and fresh state After 00e2508e IDEA tried to call git log on a hg repository. --- .../src/com/intellij/dvcs/AmendComponent.java | 29 +++++++++++++++---- .../checkin/GitCheckinEnvironment.java | 18 +++++++----- .../provider/commit/HgCheckinEnvironment.java | 19 ++++++++---- 3 files changed, 47 insertions(+), 19 deletions(-) diff --git a/platform/dvcs-impl/src/com/intellij/dvcs/AmendComponent.java b/platform/dvcs-impl/src/com/intellij/dvcs/AmendComponent.java index 54f5331ece79..fb0435b354eb 100644 --- a/platform/dvcs-impl/src/com/intellij/dvcs/AmendComponent.java +++ b/platform/dvcs-impl/src/com/intellij/dvcs/AmendComponent.java @@ -15,6 +15,8 @@ */ package com.intellij.dvcs; +import com.intellij.dvcs.repo.Repository; +import com.intellij.dvcs.repo.RepositoryManager; import com.intellij.dvcs.ui.DvcsBundle; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressManager; @@ -38,6 +40,7 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.*; import java.util.List; +import java.util.stream.Collectors; /** * Provides a checkbox to amend current commit to the previous commit. @@ -48,6 +51,7 @@ public abstract class AmendComponent { private static final Logger LOG = Logger.getInstance(AmendComponent.class); + @NotNull private final RepositoryManager myRepoManager; @NotNull private final CheckinProjectPanel myCheckinPanel; @NotNull private final JCheckBox myAmend; @NotNull private final String myPreviousMessage; @@ -55,11 +59,17 @@ public abstract class AmendComponent { @Nullable private Map myMessagesForRoots; @Nullable private String myAmendedMessage; - public AmendComponent(@NotNull final Project project, @NotNull CheckinProjectPanel panel) { - this(project, panel, DvcsBundle.message("commit.amend")); + public AmendComponent(@NotNull Project project, + @NotNull RepositoryManager repoManager, + @NotNull CheckinProjectPanel panel) { + this(project, repoManager, panel, DvcsBundle.message("commit.amend")); } - public AmendComponent(@NotNull final Project project, @NotNull CheckinProjectPanel panel, @NotNull String title) { + public AmendComponent(@NotNull Project project, + @NotNull RepositoryManager repoManager, + @NotNull CheckinProjectPanel panel, + @NotNull String title) { + myRepoManager = repoManager; myCheckinPanel = panel; myAmend = new NonFocusableCheckBox(title); myAmend.setMnemonic('m'); @@ -142,14 +152,23 @@ public abstract class AmendComponent { @Nullable private Map getLastCommitMessages() throws VcsException { Map messagesForRoots = new HashMap<>(); - Collection roots = myCheckinPanel.getRoots(); //all committed vcs roots, not only selected - for (VirtualFile root : roots) { + // load all vcs roots visible in the commit dialog (not only selected ones), to avoid another loading task if selection changes + for (VirtualFile root : getAffectedRoots()) { String message = getLastCommitMessage(root); messagesForRoots.put(root, message); } return messagesForRoots; } + @NotNull + protected Collection getAffectedRoots() { + return myRepoManager.getRepositories().stream(). + filter(repo -> !repo.isFresh()). + map(Repository::getRoot). + filter(root -> myCheckinPanel.getRoots().contains(root)). + collect(Collectors.toList()); + } + @NotNull private List getSelectedFilePaths() { return ContainerUtil.map(myCheckinPanel.getFiles(), VcsUtil::getFilePath); diff --git a/plugins/git4idea/src/git4idea/checkin/GitCheckinEnvironment.java b/plugins/git4idea/src/git4idea/checkin/GitCheckinEnvironment.java index e5c00ac56fc3..4321fd24af06 100644 --- a/plugins/git4idea/src/git4idea/checkin/GitCheckinEnvironment.java +++ b/plugins/git4idea/src/git4idea/checkin/GitCheckinEnvironment.java @@ -89,6 +89,8 @@ import static com.intellij.openapi.vcs.changes.ChangesUtil.getBeforePath; import static com.intellij.util.ObjectUtils.assertNotNull; import static com.intellij.util.containers.ContainerUtil.*; import static git4idea.GitUtil.getLogString; +import static git4idea.GitUtil.getRepositoryManager; +import static java.util.Arrays.asList; public class GitCheckinEnvironment implements CheckinEnvironment { private static final Logger LOG = Logger.getInstance(GitCheckinEnvironment.class); @@ -132,8 +134,8 @@ public class GitCheckinEnvironment implements CheckinEnvironment { @Nullable public String getDefaultMessageFor(FilePath[] filesToCheckin) { LinkedHashSet messages = newLinkedHashSet(); - GitRepositoryManager manager = GitUtil.getRepositoryManager(myProject); - for (VirtualFile root : GitUtil.gitRoots(Arrays.asList(filesToCheckin))) { + GitRepositoryManager manager = getRepositoryManager(myProject); + for (VirtualFile root : GitUtil.gitRoots(asList(filesToCheckin))) { GitRepository repository = manager.getRepositoryForRoot(root); if (repository == null) { // unregistered nested submodule found by GitUtil.getGitRoot LOG.warn("Unregistered repository: " + root); @@ -254,7 +256,7 @@ public class GitCheckinEnvironment implements CheckinEnvironment { } } if (myNextCommitIsPushed != null && myNextCommitIsPushed.booleanValue() && exceptions.isEmpty()) { - GitRepositoryManager manager = GitUtil.getRepositoryManager(myProject); + GitRepositoryManager manager = getRepositoryManager(myProject); Collection repositories = GitUtil.getRepositoriesFromRoots(manager, sortedChanges.keySet()); final List preselectedRepositories = newArrayList(repositories); GuiUtils.invokeLaterIfNeeded(() -> @@ -455,7 +457,7 @@ public class GitCheckinEnvironment implements CheckinEnvironment { // perform merge commit try { commitWithoutPaths(project, root, messageFile, author); - GitRepositoryManager manager = GitUtil.getRepositoryManager(project); + GitRepositoryManager manager = getRepositoryManager(project); manager.updateRepository(root); } catch (VcsException ex) { @@ -609,7 +611,7 @@ public class GitCheckinEnvironment implements CheckinEnvironment { handler.run(); } if (!project.isDisposed()) { - GitRepositoryManager manager = GitUtil.getRepositoryManager(project); + GitRepositoryManager manager = getRepositoryManager(project); manager.updateRepository(root); } } @@ -712,7 +714,7 @@ public class GitCheckinEnvironment implements CheckinEnvironment { JLabel authorLabel = new JBLabel(GitBundle.message("commit.author")); authorLabel.setLabelFor(myAuthorField); - myAmendComponent = new MyAmendComponent(project, panel); + myAmendComponent = new MyAmendComponent(project, getRepositoryManager(project), panel); mySignOffCheckbox = new JBCheckBox("Sign-off commit", mySettings.shouldSignOffCommit()); mySignOffCheckbox.setMnemonic(KeyEvent.VK_G); mySignOffCheckbox.setToolTipText(getToolTip(project, panel)); @@ -752,8 +754,8 @@ public class GitCheckinEnvironment implements CheckinEnvironment { } private class MyAmendComponent extends AmendComponent { - public MyAmendComponent(Project project, CheckinProjectPanel panel) { - super(project, panel); + public MyAmendComponent(@NotNull Project project, @NotNull GitRepositoryManager manager, @NotNull CheckinProjectPanel panel) { + super(project, manager, panel); } @NotNull diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/provider/commit/HgCheckinEnvironment.java b/plugins/hg4idea/src/org/zmlx/hg4idea/provider/commit/HgCheckinEnvironment.java index 61807541a698..9ae644a50c72 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/provider/commit/HgCheckinEnvironment.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/provider/commit/HgCheckinEnvironment.java @@ -47,6 +47,7 @@ import org.zmlx.hg4idea.execution.HgCommandExecutor; import org.zmlx.hg4idea.execution.HgCommandResult; import org.zmlx.hg4idea.provider.HgCurrentBinaryContentRevision; import org.zmlx.hg4idea.repo.HgRepository; +import org.zmlx.hg4idea.repo.HgRepositoryManager; import org.zmlx.hg4idea.util.HgUtil; import javax.swing.*; @@ -56,6 +57,9 @@ import java.awt.event.ActionListener; import java.util.*; import java.util.List; +import static com.intellij.util.ObjectUtils.assertNotNull; +import static org.zmlx.hg4idea.util.HgUtil.getRepositoryManager; + public class HgCheckinEnvironment implements CheckinEnvironment { private final Project myProject; @@ -316,17 +320,17 @@ public class HgCheckinEnvironment implements CheckinEnvironment { @NotNull private final JCheckBox myCommitSubrepos; public HgCommitAdditionalComponent(@NotNull Project project, @NotNull CheckinProjectPanel panel) { - HgVcs myVcs = HgVcs.getInstance(myProject); + HgVcs vcs = assertNotNull(HgVcs.getInstance(myProject)); - myAmend = new MyAmendComponent(project, panel, "Amend Commit (QRefresh)"); - myAmend.getComponent().setEnabled(myVcs != null && myVcs.getVersion().isAmendSupported()); + myAmend = new MyAmendComponent(project, getRepositoryManager(project), panel, "Amend Commit (QRefresh)"); + myAmend.getComponent().setEnabled(vcs.getVersion().isAmendSupported()); myCommitSubrepos = new JCheckBox("Commit subrepositories", false); myCommitSubrepos.setToolTipText(XmlStringUtil.wrapInHtml( "Commit all subrepos for selected repositories.
" + " hg ci files -S subrepos")); myCommitSubrepos.setMnemonic('s'); - Collection repos = HgActionUtil.collectRepositoriesFromFiles(HgUtil.getRepositoryManager(myProject), panel.getRoots()); + Collection repos = HgActionUtil.collectRepositoriesFromFiles(getRepositoryManager(myProject), panel.getRoots()); myCommitSubrepos.setVisible(ContainerUtil.exists(repos, HgRepository::hasSubrepos)); myCommitSubrepos.addActionListener(new MySelectionListener(myAmend.getCheckBox())); @@ -366,8 +370,11 @@ public class HgCheckinEnvironment implements CheckinEnvironment { } private class MyAmendComponent extends AmendComponent { - public MyAmendComponent(@NotNull Project project, @NotNull CheckinProjectPanel panel, @NotNull String title) { - super(project, panel, title); + public MyAmendComponent(@NotNull Project project, + @NotNull HgRepositoryManager repoManager, + @NotNull CheckinProjectPanel panel, + @NotNull String title) { + super(project, repoManager, panel, title); } @NotNull