Check assume unchanged flag in Add command
When the assume unchanged flag is set the Add command must not update the index for this file if any changes are present in the working directory. Bug: 331351 Change-Id: I255870f689225a1d88971182e0eb377952641b42 Signed-off-by: Stefan Lay <stefan.lay@sap.com>
This commit is contained in:
parent
12b6350435
commit
9225b88ae6
|
@ -456,6 +456,38 @@ public void testAddWithParameterUpdate() throws Exception {
|
||||||
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 @@ private DirCacheEntry addEntryToBuilder(String path, File file,
|
||||||
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");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -138,6 +138,8 @@ protected void setUp() throws Exception {
|
||||||
|
|
||||||
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 String indexState(int includedOptions)
|
||||||
+ 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();
|
||||||
|
|
|
@ -163,25 +163,31 @@ public DirCache call() throws NoFilepatternException {
|
||||||
// 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());
|
||||||
|
entry.setFileMode(f.getEntryFileMode());
|
||||||
|
|
||||||
InputStream in = f.openEntryStream();
|
InputStream in = f.openEntryStream();
|
||||||
try {
|
try {
|
||||||
entry.setObjectId(inserter.insert(
|
entry.setObjectId(inserter.insert(
|
||||||
Constants.OBJ_BLOB, sz, in));
|
Constants.OBJ_BLOB, sz, in));
|
||||||
} finally {
|
} finally {
|
||||||
in.close();
|
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…
Reference in New Issue