Browse Source

Fix DirCacheCheckout to set correct file length if core.autocrlf=true

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
a606dc363d.

Bug: 453962
Change-Id: I715c048227553efae6f8f6b6878c0f04f2609d9c
Also-by: Konrad Kügler <swamblumat-eclipsebugs@yahoo.de>
Also-by: Christian Halstrick <christian.halstrick@sap.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
stable-3.6
Matthias Sohn 10 years ago
parent
commit
59c4ea042c
  1. 48
      org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java
  2. 6
      org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java

48
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java

@ -43,8 +43,8 @@
*/ */
package org.eclipse.jgit.api; package org.eclipse.jgit.api;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
@ -78,6 +78,7 @@ import org.eclipse.jgit.lib.RefUpdate;
import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.StoredConfig; import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.storage.file.FileBasedConfig;
import org.eclipse.jgit.transport.RefSpec; import org.eclipse.jgit.transport.RefSpec;
import org.eclipse.jgit.transport.RemoteConfig; import org.eclipse.jgit.transport.RemoteConfig;
import org.eclipse.jgit.transport.URIish; import org.eclipse.jgit.transport.URIish;
@ -508,4 +509,49 @@ public class CheckoutCommandTest extends RepositoryTestCase {
} }
} }
// 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);
}
} }

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

@ -1245,9 +1245,9 @@ public class DirCacheCheckout {
} finally { } finally {
channel.close(); channel.close();
} }
entry.setLength(opt.getAutoCRLF() == AutoCRLF.TRUE entry.setLength(opt.getAutoCRLF() == AutoCRLF.TRUE ? //
? f.length() // AutoCRLF wants on-disk-size tmpFile.length() // AutoCRLF wants on-disk-size
: (int) ol.getSize()); : (int) ol.getSize());
if (opt.isFileMode() && fs.supportsExecute()) { if (opt.isFileMode() && fs.supportsExecute()) {
if (FileMode.EXECUTABLE_FILE.equals(entry.getRawMode())) { if (FileMode.EXECUTABLE_FILE.equals(entry.getRawMode())) {

Loading…
Cancel
Save