Browse Source

Merge "Check assume unchanged flag in Add command"

stable-0.10
Shawn Pearce 14 years ago committed by Code Review
parent
commit
a115b64f4b
  1. 42
      org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java
  2. 5
      org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryTestCase.java
  3. 32
      org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java

42
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java

@ -456,6 +456,38 @@ public class AddCommandTest extends RepositoryTestCase {
indexState(CONTENT)); 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, private DirCacheEntry addEntryToBuilder(String path, File file,
ObjectInserter newObjectInserter, DirCacheBuilder builder, int stage) ObjectInserter newObjectInserter, DirCacheBuilder builder, int stage)
throws IOException { throws IOException {
@ -473,4 +505,14 @@ public class AddCommandTest extends RepositoryTestCase {
return entry; 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");
}
} }

5
org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryTestCase.java

@ -138,6 +138,8 @@ public abstract class RepositoryTestCase extends LocalDiskRepositoryTestCase {
public static final int CONTENT = 16; 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 * 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. * useful when writing tests which do assertions on the state of the index.
@ -209,6 +211,9 @@ public abstract class RepositoryTestCase extends LocalDiskRepositoryTestCase {
+ new String(db.open(entry.getObjectId(), + new String(db.open(entry.getObjectId(),
Constants.OBJ_BLOB).getCachedBytes(), "UTF-8")); Constants.OBJ_BLOB).getCachedBytes(), "UTF-8"));
} }
if (0 != (includedOptions & ASSUME_UNCHANGED))
sb.append(", assume-unchanged:"
+ Boolean.toString(entry.isAssumeValid()));
sb.append("]"); sb.append("]");
} }
return sb.toString(); return sb.toString();

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

@ -163,25 +163,31 @@ public class AddCommand extends GitCommand<DirCache> {
// new DirCacheEntry per path. // new DirCacheEntry per path.
else if (!(path.equals(lastAddedFile))) { else if (!(path.equals(lastAddedFile))) {
if (!(update && tw.getTree(0, DirCacheIterator.class) == null)) { if (!(update && tw.getTree(0, DirCacheIterator.class) == null)) {
c = tw.getTree(0, DirCacheIterator.class);
if (f != null) { // the file exists if (f != null) { // the file exists
long sz = f.getEntryLength(); long sz = f.getEntryLength();
DirCacheEntry entry = new DirCacheEntry(path); DirCacheEntry entry = new DirCacheEntry(path);
entry.setLength(sz); if (c == null || c.getDirCacheEntry() == null
entry.setLastModified(f.getEntryLastModified()); || !c.getDirCacheEntry().isAssumeValid()) {
entry.setFileMode(f.getEntryFileMode()); entry.setLength(sz);
entry.setLastModified(f.getEntryLastModified());
InputStream in = f.openEntryStream(); entry.setFileMode(f.getEntryFileMode());
try {
entry.setObjectId(inserter.insert( InputStream in = f.openEntryStream();
Constants.OBJ_BLOB, sz, in)); try {
} finally { entry.setObjectId(inserter.insert(
in.close(); 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){ } else if (!update){
c = tw.getTree(0, DirCacheIterator.class);
builder.add(c.getDirCacheEntry()); builder.add(c.getDirCacheEntry());
} }
} }

Loading…
Cancel
Save