From 59c4ea042ca29b5ad6fee2e3c0761e22bdac440f Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Sat, 6 Dec 2014 02:59:34 +0100 Subject: [PATCH] Fix DirCacheCheckout to set correct file length if core.autocrlf=true MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To update the file length stat we need to use the length of the temporary file since it's not yet renamed to the target file name here. The incorrect file length stat update was introduced in a606dc363d0f6b09e4527cca6b645d3cb1ec407d. Bug: 453962 Change-Id: I715c048227553efae6f8f6b6878c0f04f2609d9c Also-by: Konrad Kügler Also-by: Christian Halstrick Signed-off-by: Matthias Sohn --- .../eclipse/jgit/api/CheckoutCommandTest.java | 48 ++++++++++++++++++- .../jgit/dircache/DirCacheCheckout.java | 6 +-- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java index f13fb2026..f7a50dffc 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java @@ -43,8 +43,8 @@ */ package org.eclipse.jgit.api; -import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -78,6 +78,7 @@ import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.StoredConfig; import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.storage.file.FileBasedConfig; import org.eclipse.jgit.transport.RefSpec; import org.eclipse.jgit.transport.RemoteConfig; import org.eclipse.jgit.transport.URIish; @@ -508,4 +509,49 @@ public void testAlreadyExists() throws Exception { } } + // TODO: write a faster test which depends less on characteristics of + // underlying filesystem/OS. + @Test + public void testCheckoutAutoCrlfTrue() throws Exception { + int nrOfAutoCrlfTestFiles = 200; + + FileBasedConfig c = db.getConfig(); + c.setString("core", null, "autocrlf", "true"); + c.save(); + + AddCommand add = git.add(); + for (int i = 100; i < 100 + nrOfAutoCrlfTestFiles; i++) { + writeTrashFile("Test_" + i + ".txt", "Hello " + i + + " world\nX\nYU\nJK\n"); + add.addFilepattern("Test_" + i + ".txt"); + } + fsTick(null); + add.call(); + RevCommit c1 = git.commit().setMessage("add some lines").call(); + + add = git.add(); + for (int i = 100; i < 100 + nrOfAutoCrlfTestFiles; i++) { + writeTrashFile("Test_" + i + ".txt", "Hello " + i + + " world\nX\nY\n"); + add.addFilepattern("Test_" + i + ".txt"); + } + fsTick(null); + add.call(); + git.commit().setMessage("add more").call(); + + git.checkout().setName(c1.getName()).call(); + + boolean foundUnsmudged = false; + DirCache dc = db.readDirCache(); + for (int i = 100; i < 100 + nrOfAutoCrlfTestFiles; i++) { + DirCacheEntry entry = dc.getEntry( + "Test_" + i + ".txt"); + if (!entry.isSmudged()) { + foundUnsmudged = true; + assertEquals("unexpected file length in git index", 28, + entry.getLength()); + } + } + org.junit.Assume.assumeTrue(foundUnsmudged); + } } 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 c7dd03dd4..692cc8fb5 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java @@ -1245,9 +1245,9 @@ public static void checkoutEntry(Repository repo, DirCacheEntry entry, } finally { channel.close(); } - entry.setLength(opt.getAutoCRLF() == AutoCRLF.TRUE - ? f.length() // AutoCRLF wants on-disk-size - : (int) ol.getSize()); + entry.setLength(opt.getAutoCRLF() == AutoCRLF.TRUE ? // + tmpFile.length() // AutoCRLF wants on-disk-size + : (int) ol.getSize()); if (opt.isFileMode() && fs.supportsExecute()) { if (FileMode.EXECUTABLE_FILE.equals(entry.getRawMode())) {