From 9225b88ae6b22eb6164434f62c5226ada777d277 Mon Sep 17 00:00:00 2001 From: Stefan Lay Date: Mon, 29 Nov 2010 17:58:38 +0100 Subject: [PATCH] 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 --- .../org/eclipse/jgit/api/AddCommandTest.java | 42 +++++++++++++++++++ .../eclipse/jgit/lib/RepositoryTestCase.java | 5 +++ .../src/org/eclipse/jgit/api/AddCommand.java | 32 ++++++++------ 3 files changed, 66 insertions(+), 13 deletions(-) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java index 68007b6cf..4357f8b0c 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java @@ -456,6 +456,38 @@ public class AddCommandTest extends RepositoryTestCase { 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 { @@ -473,4 +505,14 @@ public class AddCommandTest extends RepositoryTestCase { 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"); + } + } diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryTestCase.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryTestCase.java index 409fabf8f..30cec1279 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryTestCase.java +++ b/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 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. @@ -209,6 +211,9 @@ public abstract class RepositoryTestCase extends LocalDiskRepositoryTestCase { + 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(); 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 7a01e74b0..12a5201f6 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java @@ -163,25 +163,31 @@ public class AddCommand extends GitCommand { // 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()); } }