mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Git: git log tree: when add paths to structure filter, check ancestry
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user