diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/IndexModificationTimesTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/IndexModificationTimesTest.java new file mode 100644 index 000000000..51c663499 --- /dev/null +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/IndexModificationTimesTest.java @@ -0,0 +1,90 @@ +package org.eclipse.jgit.lib; + +import static org.junit.Assert.assertTrue; + +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.dircache.DirCache; +import org.eclipse.jgit.dircache.DirCacheEntry; +import org.junit.Test; + +public class IndexModificationTimesTest extends RepositoryTestCase { + + @Test + public void testLastModifiedTimes() throws Exception { + Git git = new Git(db); + String path = "file"; + writeTrashFile(path, "content"); + String path2 = "file2"; + writeTrashFile(path2, "content2"); + + git.add().addFilepattern(path).call(); + git.add().addFilepattern(path2).call(); + git.commit().setMessage("commit").call(); + + DirCache dc = db.readDirCache(); + DirCacheEntry entry = dc.getEntry(path); + DirCacheEntry entry2 = dc.getEntry(path); + + assertTrue("last modified shall not be zero!", + entry.getLastModified() != 0); + + assertTrue("last modified shall not be zero!", + entry2.getLastModified() != 0); + + writeTrashFile(path, "new content"); + git.add().addFilepattern(path).call(); + git.commit().setMessage("commit2").call(); + + dc = db.readDirCache(); + entry = dc.getEntry(path); + entry2 = dc.getEntry(path); + + assertTrue("last modified shall not be zero!", + entry.getLastModified() != 0); + + assertTrue("last modified shall not be zero!", + entry2.getLastModified() != 0); + } + + @Test + public void testModify() throws Exception { + Git git = new Git(db); + String path = "file"; + writeTrashFile(path, "content"); + + git.add().addFilepattern(path).call(); + git.commit().setMessage("commit").call(); + + DirCache dc = db.readDirCache(); + DirCacheEntry entry = dc.getEntry(path); + + long masterLastMod = entry.getLastModified(); + + git.checkout().setCreateBranch(true).setName("side").call(); + + Thread.sleep(10); + String path2 = "file2"; + writeTrashFile(path2, "side content"); + git.add().addFilepattern(path2).call(); + git.commit().setMessage("commit").call(); + + dc = db.readDirCache(); + entry = dc.getEntry(path); + + long sideLastMode = entry.getLastModified(); + + Thread.sleep(2000); + + writeTrashFile(path, "uncommitted content"); + git.checkout().setName("master").call(); + + dc = db.readDirCache(); + entry = dc.getEntry(path); + + assertTrue("shall have equal mod time!", masterLastMod == sideLastMode); + assertTrue("shall not equal master timestamp!", + entry.getLastModified() == masterLastMod); + + } + +} diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java index 22a855832..8b15a27a0 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java @@ -332,8 +332,14 @@ public class DirCacheCheckout { // conflict update(m.getEntryPathString(), m.getEntryObjectId(), m.getEntryFileMode()); - else - keep(i.getDirCacheEntry()); + else { + // update the timestamp of the index with the one from the + // file if not set, as we are sure to be in sync here. + DirCacheEntry entry = i.getDirCacheEntry(); + if (entry.getLastModified() == 0) + entry.setLastModified(f.getEntryLastModified()); + keep(entry); + } } else // The index contains a folder keep(i.getDirCacheEntry());