diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogFileFilter.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogFileFilter.java index 0c6ac5c84702..82ab7a999eba 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogFileFilter.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogFileFilter.java @@ -19,15 +19,17 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.containers.HashSet; import com.intellij.util.containers.MultiMap; import com.intellij.vcs.log.VcsLogFilter; +import com.intellij.vcs.log.VcsLogFilterCollection; import com.intellij.vcs.log.VcsLogRootFilter; import com.intellij.vcs.log.VcsLogStructureFilter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; import java.util.Set; public class VcsLogFileFilter implements VcsLogFilter { @@ -39,9 +41,19 @@ public class VcsLogFileFilter implements VcsLogFilter { myRootFilter = rootFilter; } + @Nullable + public VcsLogStructureFilter getStructureFilter() { + return myStructureFilter; + } + + @Nullable + public VcsLogRootFilter getRootFilter() { + return myRootFilter; + } + @NotNull - static Pair, MultiMap> collectRoots(@NotNull Collection files, - @NotNull Set roots) { + private static Pair, MultiMap> collectRoots(@NotNull Collection files, + @NotNull Set roots) { Set selectedRoots = new HashSet(); MultiMap selectedFiles = new MultiMap(); @@ -71,40 +83,46 @@ public class VcsLogFileFilter implements VcsLogFilter { return Pair.create(selectedRoots, selectedFiles); } + // collect "nu voobche vse" (there is no english translation for this expression =) ) roots that might be visible + // if filters unset returns just all roots @NotNull - public static Pair, MultiMap> collectRootsAndFiles(@NotNull Set roots, - @Nullable VcsLogRootFilter rootFilter, - @Nullable VcsLogStructureFilter structureFilter) { - if (rootFilter == null && structureFilter == null) return Pair.create(roots, MultiMap.create()); + public static Set getAllVisibleRoots(@NotNull Collection roots, @NotNull VcsLogFilterCollection filters) { + return getAllVisibleRoots(roots, filters.getRootFilter(), filters.getStructureFilter()); + } - if (structureFilter == null) { - return Pair.create((Set)new HashSet(rootFilter.getRoots()), MultiMap.create()); + // same as other getAllVisibleRoots + @NotNull + public static Set getAllVisibleRoots(@NotNull Collection roots, @NotNull VcsLogFileFilter filter) { + return getAllVisibleRoots(roots, filter.getRootFilter(), filter.getStructureFilter()); + } + + private static Set getAllVisibleRoots(@NotNull Collection roots, @Nullable VcsLogRootFilter rootFilter, @Nullable VcsLogStructureFilter structureFilter) { + if (rootFilter == null && structureFilter == null) return new HashSet(roots); + + // should not we, like, intersect here? + Set result = new HashSet(); + if (rootFilter != null) { + result.addAll(rootFilter.getRoots()); } - Pair, MultiMap> selectedRootsAndFiles = collectRoots(structureFilter.getFiles(), roots); - if (rootFilter == null) { - return selectedRootsAndFiles; + if (structureFilter != null) { + Pair, MultiMap> rootsAndFiles = collectRoots(structureFilter.getFiles(), new HashSet(roots)); + result.addAll(ContainerUtil.union(rootsAndFiles.first, rootsAndFiles.second.keySet())); } - return Pair.create(ContainerUtil.union(new HashSet(rootFilter.getRoots()), selectedRootsAndFiles.first), - selectedRootsAndFiles.second); + + return result; } - @Nullable - public static Set collectRoots(@NotNull Set roots, - @Nullable VcsLogRootFilter rootFilter, - @Nullable VcsLogStructureFilter structureFilter) { - if (rootFilter == null && structureFilter == null) return null; + // for given root returns files that are selected in it + // if a root is visible as a whole returns empty set + // same if root is invisible as a whole + // so check that before calling this method + @NotNull + public static Set getFilteredFilesForRoot(@NotNull VirtualFile root, VcsLogFilterCollection filterCollection) { + if (filterCollection.getStructureFilter() == null) return Collections.emptySet(); - Pair, MultiMap> rootsAndFiles = collectRootsAndFiles(roots, rootFilter, structureFilter); - return ContainerUtil.union(rootsAndFiles.first, rootsAndFiles.second.keySet()); - } + Pair, MultiMap> rootsAndFiles = + collectRoots(filterCollection.getStructureFilter().getFiles(), Collections.singleton(root)); - @Nullable - public VcsLogStructureFilter getStructureFilter() { - return myStructureFilter; - } - - @Nullable - public VcsLogRootFilter getRootFilter() { - return myRootFilter; + return new HashSet(rootsAndFiles.second.get(root)); } } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VisiblePackBuilder.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VisiblePackBuilder.java index f711aef27dd8..07c46d6d7e06 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VisiblePackBuilder.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VisiblePackBuilder.java @@ -24,7 +24,6 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashSet; -import com.intellij.util.containers.MultiMap; import com.intellij.util.ui.UIUtil; import com.intellij.vcs.log.*; import com.intellij.vcs.log.graph.GraphCommit; @@ -133,23 +132,13 @@ class VisiblePackBuilder { if (branchFilter == null && rootFilter == null && structureFilter == null) return null; - Set filteredByFile = null; Set filteredByBranch = null; if (branchFilter != null) { filteredByBranch = getMatchingHeads(refs, branchFilter); } - if (rootFilter != null) { - filteredByFile = getMatchingHeads(refs, rootFilter); - } - if (structureFilter != null) { - if (filteredByFile == null) { - filteredByFile = getMatchingHeads(refs, roots, structureFilter); - } - else { - filteredByFile = ContainerUtil.union(filteredByFile, getMatchingHeads(refs, roots, structureFilter)); - } - } + + Set filteredByFile = getMatchingHeads(refs, VcsLogFileFilter.getAllVisibleRoots(roots, filters)); if (filteredByBranch == null) return filteredByFile; if (filteredByFile == null) return filteredByBranch; @@ -170,11 +159,6 @@ class VisiblePackBuilder { })); } - private Set getMatchingHeads(@NotNull VcsLogRefs refs, @NotNull VcsLogRootFilter filter) { - Collection roots = filter.getRoots(); - return getMatchingHeads(refs, roots); - } - private Set getMatchingHeads(@NotNull VcsLogRefs refs, @NotNull Collection roots) { Set result = new HashSet(); for (VcsRef branch : refs.getBranches()) { @@ -185,13 +169,6 @@ class VisiblePackBuilder { return result; } - private Set getMatchingHeads(@NotNull VcsLogRefs refs, - @NotNull Set vcsRoots, - @NotNull VcsLogStructureFilter filter) { - Pair, MultiMap> roots = VcsLogFileFilter.collectRoots(filter.getFiles(), vcsRoots); - return getMatchingHeads(refs, ContainerUtil.union(roots.first, roots.second.keySet())); - } - @NotNull private List filterInMemory(@NotNull PermanentGraph permanentGraph, @NotNull List detailsFilters, @@ -253,25 +230,21 @@ class VisiblePackBuilder { private static List getFilteredDetailsFromTheVcs(@NotNull Map providers, @NotNull VcsLogFilterCollection filterCollection, int maxCount) throws VcsException { - VcsLogRootFilter rootFilter = filterCollection.getRootFilter(); - VcsLogStructureFilter structureFilter = filterCollection.getStructureFilter(); - - Pair, MultiMap> selectedRootsAndFiles = - VcsLogFileFilter.collectRootsAndFiles(providers.keySet(), rootFilter, structureFilter); + Set visibleRoots = VcsLogFileFilter.getAllVisibleRoots(providers.keySet(), filterCollection); Collection> logs = ContainerUtil.newArrayList(); for (Map.Entry entry : providers.entrySet()) { VirtualFile root = entry.getKey(); - if (!selectedRootsAndFiles.first.contains(root) || - filterCollection.getUserFilter() != null && filterCollection.getUserFilter().getUserNames(root).isEmpty()) { + if (!visibleRoots.contains(root) || + (filterCollection.getUserFilter() != null && filterCollection.getUserFilter().getUserNames(root).isEmpty())) { // there is a structure or user filter, but it doesn't match this root continue; } VcsLogFilterCollection rootSpecificCollection = filterCollection; if (rootSpecificCollection.getStructureFilter() != null) { - rootSpecificCollection = replaceStructureFilter(filterCollection, new HashSet(selectedRootsAndFiles.second.get(root))); + rootSpecificCollection = replaceStructureFilter(filterCollection, new HashSet(VcsLogFileFilter.getFilteredFilesForRoot(root, filterCollection))); } List matchingCommits = entry.getValue().getCommitsMatchingFilter(root, rootSpecificCollection, maxCount); diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogClassicFilterUi.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogClassicFilterUi.java index 2e37d2a7e01f..85c1afab53d0 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogClassicFilterUi.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogClassicFilterUi.java @@ -286,7 +286,7 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi { if (filter == null) { myVisibleRoots = null; } else { - myVisibleRoots = VcsLogFileFilter.collectRoots(roots, filter.getRootFilter(), filter.getStructureFilter()); + myVisibleRoots = VcsLogFileFilter.getAllVisibleRoots(roots, filter); } } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/BranchesPanel.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/BranchesPanel.java index 094d408c78aa..8e707fcab54d 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/BranchesPanel.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/BranchesPanel.java @@ -157,7 +157,7 @@ public class BranchesPanel extends JPanel { } public void onFiltersChange(@NotNull VcsLogFilterCollection filters) { - myRoots = VcsLogFileFilter.collectRoots(new HashSet(myDataHolder.getRoots()), filters.getRootFilter(), filters.getStructureFilter()); + myRoots = VcsLogFileFilter.getAllVisibleRoots(myDataHolder.getRoots(), filters); getParent().repaint(); }