diff options
author | Stefan Lay | 2010-11-30 10:33:54 +0000 |
---|---|---|
committer | Shawn O. Pearce | 2010-11-30 18:51:21 +0000 |
commit | b4359cb8294de1e80147f00caabad9ebd6b7bce1 (patch) | |
tree | c9c1fbe056065854b1f86f1f54de31cbbbbf29c9 | |
parent | 7bf0f5070e977d716fbce9309266bb7c26be0a74 (diff) | |
download | jgit-b4359cb8294de1e80147f00caabad9ebd6b7bce1.tar.gz jgit-b4359cb8294de1e80147f00caabad9ebd6b7bce1.tar.xz jgit-b4359cb8294de1e80147f00caabad9ebd6b7bce1.zip |
Include list of assume unchanged files in IndexDiff
The IndexDiff had not collected the info if the flag
"assume-unchanged" is set. This information is useful for clients
which may want to decide if specific actions are allowed on a file.
Bug: 326213
Change-Id: I14bb7b03247d6c0b429a9d8d3f6b10f21d8ddeb1
Signed-off-by: Stefan Lay <stefan.lay@sap.com>
-rw-r--r-- | org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/IndexDiffTest.java | 45 | ||||
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java | 33 |
2 files changed, 69 insertions, 9 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/IndexDiffTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/IndexDiffTest.java index c73764a990..0ce85b4be0 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/IndexDiffTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/IndexDiffTest.java @@ -51,6 +51,7 @@ import java.io.IOException; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.dircache.DirCache; import org.eclipse.jgit.dircache.DirCacheEditor; +import org.eclipse.jgit.dircache.DirCacheEntry; import org.eclipse.jgit.treewalk.FileTreeIterator; public class IndexDiffTest extends RepositoryTestCase { @@ -234,6 +235,39 @@ public class IndexDiffTest extends RepositoryTestCase { assertTrue(diff.getUntracked().contains(path)); } + public void testAssumeUnchanged() throws Exception { + Git git = new Git(db); + String path = "file"; + writeTrashFile(path, "content"); + git.add().addFilepattern(path).call(); + String path2 = "file2"; + writeTrashFile(path2, "content"); + git.add().addFilepattern(path2).call(); + git.commit().setMessage("commit").call(); + assumeUnchanged(path2); + writeTrashFile(path, "more content"); + writeTrashFile(path2, "more content"); + + FileTreeIterator iterator = new FileTreeIterator(db); + IndexDiff diff = new IndexDiff(db, Constants.HEAD, iterator); + diff.diff(); + assertEquals(1, diff.getAssumeUnchanged().size()); + assertEquals(2, diff.getModified().size()); + assertEquals(0, diff.getChanged().size()); + + git.add().addFilepattern(".").call(); + + iterator = new FileTreeIterator(db); + diff = new IndexDiff(db, Constants.HEAD, iterator); + diff.diff(); + assertEquals(1, diff.getAssumeUnchanged().size()); + assertEquals(1, diff.getModified().size()); + assertEquals(1, diff.getChanged().size()); + assertTrue(diff.getAssumeUnchanged().contains("file2")); + assertTrue(diff.getModified().contains("file2")); + assertTrue(diff.getChanged().contains("file")); + } + private void removeFromIndex(String path) throws IOException { final DirCache dirc = db.lockDirCache(); final DirCacheEditor edit = dirc.editor(); @@ -241,4 +275,15 @@ public class IndexDiffTest extends RepositoryTestCase { if (!edit.commit()) throw new IOException("could not commit"); } + + 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/src/org/eclipse/jgit/lib/IndexDiff.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java index b19e778259..b9291f11dd 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java @@ -65,15 +65,17 @@ import org.eclipse.jgit.treewalk.filter.SkipWorkTreeFilter; import org.eclipse.jgit.treewalk.filter.TreeFilter; /** - * Compares the index, a tree, and the working directory - * Ignored files are not taken into account. - * The following information is retrieved: - * <li> added files - * <li> changed files - * <li> removed files - * <li> missing files - * <li> modified files - * <li> untracked files + * Compares the index, a tree, and the working directory Ignored files are not + * taken into account. The following information is retrieved: + * <ul> + * <li>added files</li> + * <li>changed files</li> + * <li>removed files</li> + * <li>missing files</li> + * <li>modified files</li> + * <li>untracked files</li> + * <li>files with assume-unchanged flag</li> + * </ul> */ public class IndexDiff { @@ -103,6 +105,8 @@ public class IndexDiff { private Set<String> untracked = new HashSet<String>(); + private Set<String> assumeUnchanged = new HashSet<String>(); + /** * Construct an IndexDiff * @@ -191,6 +195,11 @@ public class IndexDiff { WorkingTreeIterator.class); FileMode fileModeTree = treeWalk.getFileMode(TREE); + if (dirCacheIterator != null) { + if (dirCacheIterator.getDirCacheEntry().isAssumeValid()) + assumeUnchanged.add(dirCacheIterator.getEntryPathString()); + } + if (treeIterator != null) { if (dirCacheIterator != null) { if (!treeIterator.getEntryObjectId().equals( @@ -283,4 +292,10 @@ public class IndexDiff { return untracked; } + /** + * @return list of files with the flag assume-unchanged + */ + public Set<String> getAssumeUnchanged() { + return assumeUnchanged; + } } |