diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java index 40102447a..8a2c08c80 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java @@ -155,7 +155,7 @@ public class AddCommand extends GitCommand { 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 { 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 { 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 { 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();