Browse Source

Add new method IndexDiff#getPathsWithIndexMode

Get the list of paths that have the given file mode.

This helps EGit to efficiently determine which modified files are
symlinks and should be shown with a symlink icon in the staging view.

Bug: 429302
Change-Id: Id15f0c6f265667f5b8b57cc2d9f97de568371919
Signed-off-by: Axel Richard <axel.richard@obeo.fr>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
stable-3.6
Axel Richard 10 years ago committed by Matthias Sohn
parent
commit
5328c8c916
  1. 32
      org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java

32
org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java

@ -3,6 +3,7 @@
* Copyright (C) 2007-2008, Robin Rosenberg <robin.rosenberg@dewire.com> * Copyright (C) 2007-2008, Robin Rosenberg <robin.rosenberg@dewire.com>
* Copyright (C) 2010, Jens Baumgart <jens.baumgart@sap.com> * Copyright (C) 2010, Jens Baumgart <jens.baumgart@sap.com>
* Copyright (C) 2013, Robin Stocker <robin@nibor.org> * Copyright (C) 2013, Robin Stocker <robin@nibor.org>
* Copyright (C) 2014, Axel Richard <axel.richard@obeo.fr>
* and other copyright owners as documented in the project's IP log. * and other copyright owners as documented in the project's IP log.
* *
* This program and the accompanying materials are made available * This program and the accompanying materials are made available
@ -276,6 +277,8 @@ public class IndexDiff {
private IgnoreSubmoduleMode ignoreSubmoduleMode = null; private IgnoreSubmoduleMode ignoreSubmoduleMode = null;
private Map<FileMode, Set<String>> fileModes = new HashMap<FileMode, Set<String>>();
/** /**
* Construct an IndexDiff * Construct an IndexDiff
* *
@ -425,6 +428,7 @@ public class IndexDiff {
indexDiffFilter = new IndexDiffFilter(INDEX, WORKDIR); indexDiffFilter = new IndexDiffFilter(INDEX, WORKDIR);
filters.add(indexDiffFilter); filters.add(indexDiffFilter);
treeWalk.setFilter(AndTreeFilter.create(filters)); treeWalk.setFilter(AndTreeFilter.create(filters));
fileModes.clear();
while (treeWalk.next()) { while (treeWalk.next()) {
AbstractTreeIterator treeIterator = treeWalk.getTree(TREE, AbstractTreeIterator treeIterator = treeWalk.getTree(TREE,
AbstractTreeIterator.class); AbstractTreeIterator.class);
@ -497,6 +501,17 @@ public class IndexDiff {
} }
} }
} }
for (int i = 0; i < treeWalk.getTreeCount(); i++) {
Set<String> values = fileModes.get(treeWalk.getFileMode(i));
String path = treeWalk.getPathString();
if (path != null) {
if (values == null)
values = new HashSet<String>();
values.add(path);
fileModes.put(treeWalk.getFileMode(i), values);
}
}
} }
if (ignoreSubmoduleMode != IgnoreSubmoduleMode.ALL) { if (ignoreSubmoduleMode != IgnoreSubmoduleMode.ALL) {
@ -539,6 +554,7 @@ public class IndexDiff {
} }
} }
} }
} }
// consume the remaining work // consume the remaining work
@ -675,4 +691,20 @@ public class IndexDiff {
final DirCacheEntry entry = dirCache.getEntry(path); final DirCacheEntry entry = dirCache.getEntry(path);
return entry != null ? entry.getFileMode() : FileMode.MISSING; return entry != null ? entry.getFileMode() : FileMode.MISSING;
} }
/**
* Get the list of paths that IndexDiff has detected to differ and have the
* given file mode
*
* @param mode
* @return the list of paths that IndexDiff has detected to differ and have
* the given file mode
* @since 3.6
*/
public Set<String> getPathsWithIndexMode(final FileMode mode) {
Set<String> paths = fileModes.get(mode);
if (paths == null)
paths = new HashSet<String>();
return paths;
}
} }

Loading…
Cancel
Save