Git: git log tree: when add paths to structure filter, check ancestry

This commit is contained in:
irengrig
2010-06-23 15:14:53 +04:00
parent eeca4c7c2e
commit 92051ae0ae
3 changed files with 46 additions and 2 deletions
@@ -50,6 +50,10 @@ public class AreaMap<Key extends Comparable<Key>, Val> {
}
}
public Collection<Val> values() {
return Collections.unmodifiableCollection(myMap.values());
}
@Nullable
public Val getExact(final Key key) {
return myMap.get(key);
@@ -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<VirtualFile> filesWeAlreadyHave = myMap.values();
final Collection<VirtualFile> childrenToRemove = new LinkedList<VirtualFile>();
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) {
@@ -1522,14 +1522,27 @@ public class GitLogTree implements GitTreeViewI {
protected void addFiles(final VirtualFile[] files, Consumer<Object> 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<StructureNode> toRemove = new LinkedList<StructureNode>();
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