From 5328c8c9164414a63ce7f1323d8194b84b6f1e49 Mon Sep 17 00:00:00 2001 From: Axel Richard Date: Wed, 5 Nov 2014 09:30:47 +0100 Subject: [PATCH] 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 Signed-off-by: Matthias Sohn --- .../src/org/eclipse/jgit/lib/IndexDiff.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java index 1e0a76468..1acfa3d68 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java @@ -3,6 +3,7 @@ * Copyright (C) 2007-2008, Robin Rosenberg * Copyright (C) 2010, Jens Baumgart * Copyright (C) 2013, Robin Stocker + * Copyright (C) 2014, Axel Richard * and other copyright owners as documented in the project's IP log. * * This program and the accompanying materials are made available @@ -276,6 +277,8 @@ public TreeFilter clone() { private IgnoreSubmoduleMode ignoreSubmoduleMode = null; + private Map> fileModes = new HashMap>(); + /** * Construct an IndexDiff * @@ -425,6 +428,7 @@ public boolean diff(final ProgressMonitor monitor, int estWorkTreeSize, indexDiffFilter = new IndexDiffFilter(INDEX, WORKDIR); filters.add(indexDiffFilter); treeWalk.setFilter(AndTreeFilter.create(filters)); + fileModes.clear(); while (treeWalk.next()) { AbstractTreeIterator treeIterator = treeWalk.getTree(TREE, AbstractTreeIterator.class); @@ -497,6 +501,17 @@ public boolean diff(final ProgressMonitor monitor, int estWorkTreeSize, } } } + + for (int i = 0; i < treeWalk.getTreeCount(); i++) { + Set values = fileModes.get(treeWalk.getFileMode(i)); + String path = treeWalk.getPathString(); + if (path != null) { + if (values == null) + values = new HashSet(); + values.add(path); + fileModes.put(treeWalk.getFileMode(i), values); + } + } } if (ignoreSubmoduleMode != IgnoreSubmoduleMode.ALL) { @@ -539,6 +554,7 @@ else if (ignoreSubmoduleMode != IgnoreSubmoduleMode.DIRTY) { } } } + } // consume the remaining work @@ -675,4 +691,20 @@ public FileMode getIndexMode(final String path) { final DirCacheEntry entry = dirCache.getEntry(path); 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 getPathsWithIndexMode(final FileMode mode) { + Set paths = fileModes.get(mode); + if (paths == null) + paths = new HashSet(); + return paths; + } }