From b89b934fe7ffe1493c76801b29db97d1f4d81e80 Mon Sep 17 00:00:00 2001 From: Julia Beliaeva Date: Tue, 29 Sep 2015 22:17:49 +0300 Subject: [PATCH] [vcs-log] get rid of VcsLogUtil.collectFirstPackOfLoadedSelectedDetails() call from cherry pick action --- .../dvcs/cherrypick/VcsCherryPicker.java | 8 ++++-- .../dvcs/cherrypick/VcsCherryPickAction.java | 25 ++++++++++++++----- .../com/intellij/dvcs/ui/VcsLogAction.java | 2 +- .../com/intellij/vcs/log/impl/VcsLogUtil.java | 4 +-- .../git4idea/cherrypick/GitCherryPicker.java | 23 ++++++++++------- .../hg4idea/cherrypick/HgCherryPicker.java | 11 +++++--- 6 files changed, 49 insertions(+), 24 deletions(-) diff --git a/platform/dvcs-api/src/com/intellij/dvcs/cherrypick/VcsCherryPicker.java b/platform/dvcs-api/src/com/intellij/dvcs/cherrypick/VcsCherryPicker.java index 97291ed90ce3..a3c2d57f6a07 100644 --- a/platform/dvcs-api/src/com/intellij/dvcs/cherrypick/VcsCherryPicker.java +++ b/platform/dvcs-api/src/com/intellij/dvcs/cherrypick/VcsCherryPicker.java @@ -17,12 +17,16 @@ package com.intellij.dvcs.cherrypick; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.vcs.VcsKey; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.containers.MultiMap; +import com.intellij.vcs.log.Hash; import com.intellij.vcs.log.VcsFullCommitDetails; import com.intellij.vcs.log.VcsLog; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Map; public abstract class VcsCherryPicker { @@ -52,8 +56,8 @@ public abstract class VcsCherryPicker { * Return true if all selected commits can be cherry-picked by this cherry-picker * * @param log additional log information - * @param details commits to cherry-pick + * @param commits commits to cherry-pick, grouped by version control root * @return */ - public abstract boolean isEnabled(@NotNull VcsLog log, @NotNull List details); + public abstract boolean isEnabled(@NotNull VcsLog log, @NotNull Map> commits); } diff --git a/platform/dvcs-impl/src/com/intellij/dvcs/cherrypick/VcsCherryPickAction.java b/platform/dvcs-impl/src/com/intellij/dvcs/cherrypick/VcsCherryPickAction.java index ecafcddc3c49..164bba42359c 100644 --- a/platform/dvcs-impl/src/com/intellij/dvcs/cherrypick/VcsCherryPickAction.java +++ b/platform/dvcs-impl/src/com/intellij/dvcs/cherrypick/VcsCherryPickAction.java @@ -33,13 +33,11 @@ import com.intellij.openapi.vcs.VcsKey; import com.intellij.openapi.vcs.VcsNotifier; import com.intellij.openapi.vcs.changes.ChangeListManager; import com.intellij.openapi.vcs.changes.ChangeListManagerEx; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Consumer; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; -import com.intellij.vcs.log.Hash; -import com.intellij.vcs.log.VcsFullCommitDetails; -import com.intellij.vcs.log.VcsLog; -import com.intellij.vcs.log.VcsLogDataKeys; +import com.intellij.vcs.log.*; import com.intellij.vcs.log.impl.VcsLogUtil; import icons.DvcsImplIcons; import org.jetbrains.annotations.NotNull; @@ -102,12 +100,13 @@ public class VcsCherryPickAction extends DumbAwareAction { return; } - final List details = VcsLogUtil.collectFirstPackOfLoadedSelectedDetails(log); + List details = VcsLogUtil.collectFirstPack(log.getSelectedCommits(), VcsLogUtil.COMMITS_LIMIT); + final Map> groupedByRoot = groupByRoot(details); VcsCherryPicker enabledCherryPicker = ContainerUtil.find(cherryPickers, new Condition() { @Override public boolean value(VcsCherryPicker picker) { //all commits should be from one vcs, if not then all pickers should return false - return picker.isEnabled(log, details); + return picker.isEnabled(log, groupedByRoot); } }); e.getPresentation().setEnabled(enabledCherryPicker != null); @@ -115,6 +114,20 @@ public class VcsCherryPickAction extends DumbAwareAction { enabledCherryPicker == null ? concatActionNamesForAllAvailable(cherryPickers) : enabledCherryPicker.getActionTitle()); } + @NotNull + private static Map> groupByRoot(@NotNull List details) { + Map> result = ContainerUtil.newHashMap(); + for (CommitId commit: details) { + List hashes = result.get(commit.getRoot()); + if (hashes == null) { + hashes = ContainerUtil.newArrayList(); + result.put(commit.getRoot(), hashes); + } + hashes.add(commit.getHash()); + } + return result; + } + @NotNull private static String concatActionNamesForAllAvailable(@NotNull final List pickers) { return StringUtil.join(pickers, new Function() { diff --git a/platform/dvcs-impl/src/com/intellij/dvcs/ui/VcsLogAction.java b/platform/dvcs-impl/src/com/intellij/dvcs/ui/VcsLogAction.java index 0dbaede776ad..7e825650716a 100644 --- a/platform/dvcs-impl/src/com/intellij/dvcs/ui/VcsLogAction.java +++ b/platform/dvcs-impl/src/com/intellij/dvcs/ui/VcsLogAction.java @@ -106,7 +106,7 @@ public abstract class VcsLogAction extends DumbAwareAct @Nullable private MultiMap groupFirstPackOfCommits(@NotNull Project project, @NotNull VcsLog log) { MultiMap commitIds = - groupCommits(project, VcsLogUtil.collectFirstPack(log.getSelectedCommits(), VcsLogUtil.DETAILS_LIMIT), + groupCommits(project, VcsLogUtil.collectFirstPack(log.getSelectedCommits(), VcsLogUtil.COMMITS_LIMIT), new Function() { @Override public VirtualFile fun(CommitId hash) { diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogUtil.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogUtil.java index cac6f46641be..cf9c2990b068 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogUtil.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogUtil.java @@ -32,7 +32,7 @@ import org.jetbrains.annotations.Nullable; import java.util.*; public class VcsLogUtil { - public static final int DETAILS_LIMIT = 100; + public static final int COMMITS_LIMIT = 100; @NotNull public static MultiMap groupRefsByRoot(@NotNull Collection refs) { @@ -181,7 +181,7 @@ public class VcsLogUtil { } else { result.add(next); - if (result.size() >= DETAILS_LIMIT) break; + if (result.size() >= COMMITS_LIMIT) break; } } diff --git a/plugins/git4idea/src/git4idea/cherrypick/GitCherryPicker.java b/plugins/git4idea/src/git4idea/cherrypick/GitCherryPicker.java index 594735134dec..42efbe99bfc6 100644 --- a/plugins/git4idea/src/git4idea/cherrypick/GitCherryPicker.java +++ b/plugins/git4idea/src/git4idea/cherrypick/GitCherryPicker.java @@ -36,6 +36,8 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Consumer; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.MultiMap; +import com.intellij.vcs.log.Hash; import com.intellij.vcs.log.VcsFullCommitDetails; import com.intellij.vcs.log.VcsLog; import git4idea.GitLocalBranch; @@ -546,20 +548,23 @@ public class GitCherryPicker extends VcsCherryPicker { } @Override - public boolean isEnabled(@NotNull VcsLog log, @NotNull List details) { - if (details.isEmpty()) { + public boolean isEnabled(@NotNull VcsLog log, @NotNull Map> commits) { + if (commits.isEmpty()) { return false; } - for (VcsFullCommitDetails commit : details) { - GitRepository repository = myPlatformFacade.getRepositoryManager(myProject).getRepositoryForRoot(commit.getRoot()); + + for (VirtualFile root : commits.keySet()) { + GitRepository repository = myPlatformFacade.getRepositoryManager(myProject).getRepositoryForRoot(root); if (repository == null) { return false; } - GitLocalBranch currentBranch = repository.getCurrentBranch(); - Collection containingBranches = log.getContainingBranches(commit.getId()); - if (currentBranch != null && containingBranches != null && containingBranches.contains(currentBranch.getName())) { - // already is contained in the current branch - return false; + for (Hash commit : commits.get(root)) { + GitLocalBranch currentBranch = repository.getCurrentBranch(); + Collection containingBranches = log.getContainingBranches(commit); + if (currentBranch != null && containingBranches != null && containingBranches.contains(currentBranch.getName())) { + // already is contained in the current branch + return false; + } } } return true; diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/cherrypick/HgCherryPicker.java b/plugins/hg4idea/src/org/zmlx/hg4idea/cherrypick/HgCherryPicker.java index 4085928aa82b..74e0fa81620e 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/cherrypick/HgCherryPicker.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/cherrypick/HgCherryPicker.java @@ -23,6 +23,8 @@ import com.intellij.openapi.vcs.update.UpdatedFiles; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.MultiMap; +import com.intellij.vcs.log.Hash; import com.intellij.vcs.log.VcsFullCommitDetails; import com.intellij.vcs.log.VcsLog; import org.jetbrains.annotations.NotNull; @@ -103,17 +105,18 @@ public class HgCherryPicker extends VcsCherryPicker { } @Override - public boolean isEnabled(@NotNull VcsLog log, @NotNull List details) { - if (details.isEmpty()) { + public boolean isEnabled(@NotNull VcsLog log, @NotNull Map> commits) { + if (commits.isEmpty()) { return false; } - for (VcsFullCommitDetails commit : details) { - HgRepository repository = HgUtil.getRepositoryManager(myProject).getRepositoryForRoot(commit.getRoot()); + for (VirtualFile root: commits.keySet()) { + HgRepository repository = HgUtil.getRepositoryManager(myProject).getRepositoryForRoot(root); if (repository == null) { return false; } } + return true; } }