indexState(CONTENT));
}
+ public void testAssumeUnchanged() throws Exception {
+ Git git = new Git(db);
+ String path = "a.txt";
+ writeTrashFile(path, "content");
+ git.add().addFilepattern(path).call();
+ String path2 = "b.txt";
+ writeTrashFile(path2, "content");
+ git.add().addFilepattern(path2).call();
+ git.commit().setMessage("commit").call();
+ assertEquals("[a.txt, mode:100644, content:"
+ + "content, assume-unchanged:false]"
+ + "[b.txt, mode:100644, content:content, "
+ + "assume-unchanged:false]", indexState(CONTENT
+ | ASSUME_UNCHANGED));
+ assumeUnchanged(path2);
+ assertEquals("[a.txt, mode:100644, content:content, "
+ + "assume-unchanged:false][b.txt, mode:100644, "
+ + "content:content, assume-unchanged:true]", indexState(CONTENT
+ | ASSUME_UNCHANGED));
+ writeTrashFile(path, "more content");
+ writeTrashFile(path2, "more content");
+
+ git.add().addFilepattern(".").call();
+
+ assertEquals("[a.txt, mode:100644, content:more content,"
+ + " assume-unchanged:false][b.txt, mode:100644,"
+ + "" + ""
+ + " content:content, assume-unchanged:true]",
+ indexState(CONTENT
+ | ASSUME_UNCHANGED));
+ }
+
private DirCacheEntry addEntryToBuilder(String path, File file,
ObjectInserter newObjectInserter, DirCacheBuilder builder, int stage)
throws IOException {
return entry;
}
+ private void assumeUnchanged(String path) throws IOException {
+ final DirCache dirc = db.lockDirCache();
+ final DirCacheEntry ent = dirc.getEntry(path);
+ if (ent != null)
+ ent.setAssumeValid(true);
+ dirc.write();
+ if (!dirc.commit())
+ throw new IOException("could not commit");
+ }
+
}
public static final int CONTENT = 16;
+ public static final int ASSUME_UNCHANGED = 32;
+
/**
* Represent the state of the index in one String. This representation is
* useful when writing tests which do assertions on the state of the index.
+ new String(db.open(entry.getObjectId(),
Constants.OBJ_BLOB).getCachedBytes(), "UTF-8"));
}
+ if (0 != (includedOptions & ASSUME_UNCHANGED))
+ sb.append(", assume-unchanged:"
+ + Boolean.toString(entry.isAssumeValid()));
sb.append("]");
}
return sb.toString();
// new DirCacheEntry per path.
else if (!(path.equals(lastAddedFile))) {
if (!(update && tw.getTree(0, DirCacheIterator.class) == null)) {
+ c = tw.getTree(0, DirCacheIterator.class);
if (f != null) { // the file exists
long sz = f.getEntryLength();
DirCacheEntry entry = new DirCacheEntry(path);
- entry.setLength(sz);
- entry.setLastModified(f.getEntryLastModified());
- entry.setFileMode(f.getEntryFileMode());
-
- InputStream in = f.openEntryStream();
- try {
- entry.setObjectId(inserter.insert(
- Constants.OBJ_BLOB, sz, in));
- } finally {
- in.close();
+ if (c == null || c.getDirCacheEntry() == null
+ || !c.getDirCacheEntry().isAssumeValid()) {
+ entry.setLength(sz);
+ entry.setLastModified(f.getEntryLastModified());
+ entry.setFileMode(f.getEntryFileMode());
+
+ InputStream in = f.openEntryStream();
+ try {
+ entry.setObjectId(inserter.insert(
+ Constants.OBJ_BLOB, sz, in));
+ } finally {
+ in.close();
+ }
+
+ builder.add(entry);
+ lastAddedFile = path;
+ } else {
+ builder.add(c.getDirCacheEntry());
}
- builder.add(entry);
- lastAddedFile = path;
} else if (!update){
- c = tw.getTree(0, DirCacheIterator.class);
builder.add(c.getDirCacheEntry());
}
}