addAll = true;
try {
dc = repo.lockDirCache();
ObjectWriter ow = new ObjectWriter(repo);
DirCacheIterator c;
DirCacheBuilder builder = dc.builder();
final TreeWalk tw = new TreeWalk(repo);
tw.reset();
tw.addTree(new DirCacheBuildIterator(builder));
if (workingTreeIterator == null)
workingTreeIterator = new FileTreeIterator(repo);
tw.addTree(workingTreeIterator);
tw.setRecursive(true);
if (!addAll)
tw.setFilter(PathFilterGroup.createFromStrings(filepatterns));
String lastAddedFile = null;
while (tw.next()) {
String path = tw.getPathString();
final File file = new File(repo.getWorkTree(), path);
WorkingTreeIterator f = tw.getTree(1, WorkingTreeIterator.class);
if (tw.getTree(0, DirCacheIterator.class) == null &&
f != null && f.isEntryIgnored()) {
// file is not in index but is ignored, do nothing
}
// In case of an existing merge conflict the
// DirCacheBuildIterator iterates over all stages of
// this path, we however want to add only one
// new DirCacheEntry per path.
else if (!(path.equals(lastAddedFile))) {
if (!(update && tw.getTree(0, DirCacheIterator.class) == null)) {
if (f != null) { // the file exists
DirCacheEntry entry = new DirCacheEntry(path);
entry.setLength((int)f.getEntryLength());
entry.setLastModified(f.getEntryLastModified());
entry.setFileMode(f.getEntryFileMode());
entry.setObjectId(ow.writeBlob(file));
builder.add(entry);
lastAddedFile = path;
} else if (!update){
c = tw.getTree(0, DirCacheIterator.class);
builder.add(c.getDirCacheEntry());
}
}
}
}
builder.commit();