Browse Source

Make DirCacheCheckout update timestamps in the index.

This updates the timestamp of files that are not touched during
checkout. Otherwise the timestamp will always be zero, causing the
IndexDiffFilter to always calculate the checksum of file contents.

Change-Id: I18047f5725f22811bb4194ca1d3a3cac56074183
stable-2.1
Markus Duft 13 years ago
parent
commit
8672c43ae3
  1. 90
      org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/IndexModificationTimesTest.java
  2. 10
      org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java

90
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);
}
}

10
org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java vendored

@ -332,8 +332,14 @@ public class DirCacheCheckout {
// conflict // conflict
update(m.getEntryPathString(), m.getEntryObjectId(), update(m.getEntryPathString(), m.getEntryObjectId(),
m.getEntryFileMode()); m.getEntryFileMode());
else else {
keep(i.getDirCacheEntry()); // 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 } else
// The index contains a folder // The index contains a folder
keep(i.getDirCacheEntry()); keep(i.getDirCacheEntry());

Loading…
Cancel
Save