]> source.dussan.org Git - jgit.git/commitdiff
AddCommand: Avoid unnecessary string conversions 57/63257/4
authorShawn Pearce <sop@google.com>
Thu, 24 Dec 2015 06:06:05 +0000 (22:06 -0800)
committerShawn Pearce <sop@google.com>
Thu, 24 Dec 2015 06:26:50 +0000 (22:26 -0800)
Change-Id: I13634caeccd9f675a86adfdfa94099b6fb75463a

org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java

index 40102447a3e3d6bc0b28067019326a08597e428c..8a2c08c80581a11ecee618f56596cceb59ff2daf 100644 (file)
@@ -155,7 +155,7 @@ public class AddCommand extends GitCommand<DirCache> {
                        if (!addAll)
                                tw.setFilter(PathFilterGroup.createFromStrings(filepatterns));
 
-                       String lastAddedFile = null;
+                       byte[] lastAdded = null;
 
                        while (tw.next()) {
                                DirCacheIterator c = tw.getTree(0, DirCacheIterator.class);
@@ -168,8 +168,11 @@ public class AddCommand extends GitCommand<DirCache> {
                                        continue;
                                }
 
-                               String path = tw.getPathString();
-                               if (path.equals(lastAddedFile)) {
+                               DirCacheEntry entry = c != null ? c.getDirCacheEntry() : null;
+                               if (entry != null && entry.getStage() > 0
+                                               && lastAdded != null
+                                               && lastAdded.length == tw.getPathLength()
+                                               && tw.isPathPrefix(lastAdded, lastAdded.length) == 0) {
                                        // In case of an existing merge conflict the
                                        // DirCacheBuildIterator iterates over all stages of
                                        // this path, we however want to add only one
@@ -180,27 +183,28 @@ public class AddCommand extends GitCommand<DirCache> {
                                if (f == null) { // working tree file does not exist
                                        if (c != null
                                                        && (!update || GITLINK == c.getEntryFileMode())) {
-                                               builder.add(c.getDirCacheEntry());
+                                               builder.add(entry);
                                        }
                                        continue;
                                }
 
-                               if (c != null && c.getDirCacheEntry() != null
-                                               && c.getDirCacheEntry().isAssumeValid()) {
+                               if (entry != null && entry.isAssumeValid()) {
                                        // Index entry is marked assume valid. Even though
                                        // the user specified the file to be added JGit does
                                        // not consider the file for addition.
-                                       builder.add(c.getDirCacheEntry());
+                                       builder.add(entry);
                                        continue;
                                }
 
-                               long sz = f.getEntryLength();
-                               DirCacheEntry entry = new DirCacheEntry(path);
+                               byte[] path = tw.getRawPath();
+                               if (entry == null || entry.getStage() > 0) {
+                                       entry = new DirCacheEntry(path);
+                               }
                                FileMode mode = f.getIndexFileMode(c);
                                entry.setFileMode(mode);
 
                                if (GITLINK != mode) {
-                                       entry.setLength(sz);
+                                       entry.setLength(f.getEntryLength());
                                        entry.setLastModified(f.getEntryLastModified());
                                        long len = f.getEntryContentLength();
                                        try (InputStream in = f.openEntryStream()) {
@@ -208,10 +212,12 @@ public class AddCommand extends GitCommand<DirCache> {
                                                entry.setObjectId(id);
                                        }
                                } else {
+                                       entry.setLength(0);
+                                       entry.setLastModified(0);
                                        entry.setObjectId(f.getEntryObjectId());
                                }
                                builder.add(entry);
-                               lastAddedFile = path;
+                               lastAdded = path;
                        }
                        inserter.flush();
                        builder.commit();