]> source.dussan.org Git - jgit.git/commitdiff
Add new method IndexDiff#getPathsWithIndexMode 32/35932/3
authorAxel Richard <axel.richard@obeo.fr>
Wed, 5 Nov 2014 08:30:47 +0000 (09:30 +0100)
committerMatthias Sohn <matthias.sohn@sap.com>
Thu, 6 Nov 2014 08:40:29 +0000 (09:40 +0100)
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>
org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java

index 1e0a7646825cd89f110a2a12f63585f8abae345f..1acfa3d681ebd6e10328ca710c8df0126ab3ddcd 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (C) 2007-2008, Robin Rosenberg <robin.rosenberg@dewire.com>
  * Copyright (C) 2010, Jens Baumgart <jens.baumgart@sap.com>
  * 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.
  *
  * This program and the accompanying materials are made available
@@ -276,6 +277,8 @@ public class IndexDiff {
 
        private IgnoreSubmoduleMode ignoreSubmoduleMode = null;
 
+       private Map<FileMode, Set<String>> fileModes = new HashMap<FileMode, Set<String>>();
+
        /**
         * Construct an IndexDiff
         *
@@ -425,6 +428,7 @@ public class IndexDiff {
                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 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) {
@@ -539,6 +554,7 @@ public class IndexDiff {
                                        }
                                }
                        }
+
                }
 
                // consume the remaining work
@@ -675,4 +691,20 @@ public class IndexDiff {
                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<String> getPathsWithIndexMode(final FileMode mode) {
+               Set<String> paths = fileModes.get(mode);
+               if (paths == null)
+                       paths = new HashSet<String>();
+               return paths;
+       }
 }