From 92051ae0ae265f356166d3c6f1a139898fbb1f3a Mon Sep 17 00:00:00 2001 From: irengrig Date: Wed, 23 Jun 2010 15:14:53 +0400 Subject: [PATCH] Git: git log tree: when add paths to structure filter, check ancestry --- .../src/com/intellij/openapi/vcs/AreaMap.java | 4 +++ .../history/browser/ChangesFilter.java | 26 ++++++++++++++++++- .../git4idea/history/browser/GitLogTree.java | 18 ++++++++++++- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/AreaMap.java b/platform/vcs-api/src/com/intellij/openapi/vcs/AreaMap.java index fb2977423d8c..7ea5bfa46acb 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/AreaMap.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/AreaMap.java @@ -50,6 +50,10 @@ public class AreaMap, Val> { } } + public Collection values() { + return Collections.unmodifiableCollection(myMap.values()); + } + @Nullable public Val getExact(final Key key) { return myMap.get(key); diff --git a/plugins/git4idea/src/git4idea/history/browser/ChangesFilter.java b/plugins/git4idea/src/git4idea/history/browser/ChangesFilter.java index 3e70be14acfe..9055d29e5f14 100644 --- a/plugins/git4idea/src/git4idea/history/browser/ChangesFilter.java +++ b/plugins/git4idea/src/git4idea/history/browser/ChangesFilter.java @@ -19,6 +19,7 @@ import com.intellij.openapi.util.Ref; import com.intellij.openapi.vcs.AreaMap; import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.changes.FilePathsHelper; +import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.PairProcessor; import git4idea.GitUtil; @@ -357,8 +358,31 @@ public class ChangesFilter { }; } - public void addPath(final VirtualFile vf) { + public boolean addPath(final VirtualFile vf) { + final Collection filesWeAlreadyHave = myMap.values(); + final Collection childrenToRemove = new LinkedList(); + for (VirtualFile current : filesWeAlreadyHave) { + if (current.equals(vf)) return false; // doesnt add exact same + if (VfsUtil.isAncestor(vf, current, false)) { + childrenToRemove.add(current); + continue; + } + if (childrenToRemove.isEmpty()) { + if (VfsUtil.isAncestor(current, vf, false)) { + return false; // we have a parent already + } + } + } + for (VirtualFile virtualFile : childrenToRemove) { + myMap.removeByValue(virtualFile); + } + myMap.put(FilePathsHelper.convertWithLastSeparator(vf), vf); + return true; + } + + public boolean containsFile(final VirtualFile vf) { + return myMap.contains(FilePathsHelper.convertWithLastSeparator(vf)); } public void removePath(final VirtualFile vf) { diff --git a/plugins/git4idea/src/git4idea/history/browser/GitLogTree.java b/plugins/git4idea/src/git4idea/history/browser/GitLogTree.java index e6248cd26b5d..293709c84975 100644 --- a/plugins/git4idea/src/git4idea/history/browser/GitLogTree.java +++ b/plugins/git4idea/src/git4idea/history/browser/GitLogTree.java @@ -1522,14 +1522,27 @@ public class GitLogTree implements GitTreeViewI { protected void addFiles(final VirtualFile[] files, Consumer after) { final boolean wasEmpty = myFilter.isEmpty(); if (files != null) { + boolean somethingChanged = false; for (VirtualFile file : files) { + if (! myFilter.addPath(file)) continue; + somethingChanged = true; final StructureNode node = new StructureNode(myCommonData, myFiltering, myProject, this, file); addChild(node); - myFilter.addPath(file); } + if (! somethingChanged) return; if (wasEmpty) { myFiltering.addFilter(myFilter); } else { + final List toRemove = new LinkedList(); + for (StructureNode child : getChildren()) { + final VirtualFile file = child.getFile(); + if (! myFilter.containsFile(file)) { + toRemove.add(child); + } + } + for (StructureNode node : toRemove) { + removeChild(node); + } myFiltering.markDirty(); } after.consume(this); @@ -1585,6 +1598,9 @@ public class GitLogTree implements GitTreeViewI { getParent().removeFiles(new VirtualFile[] {myFile}); after.run(); } + public VirtualFile getFile() { + return myFile; + } } @Nullable