Browse Source
In Git 2.10.0 the interpretation of gitattributes changed or was fixed such that "* text=auto eol=crlf" would indeed still do auto-detection of text vs. binary content.[1] Previously this was identical to "* text eol=crlf", i.e., treating all files as text. JGit still did the latter, which caused surprises because it changed binary files. [1] https://github.com/git/git/blob/master/Documentation/RelNotes/2.10.0.txt#L248 Bug: 561341 Change-Id: I5b6fb97b5e86fd950a98537b6b8574f768ae30e5 Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>master
Thomas Wolf
5 years ago
3 changed files with 117 additions and 7 deletions
After Width: | Height: | Size: 366 B |
@ -0,0 +1,107 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2020 Thomas Wolf <thomas.wolf@paranor.ch> and others |
||||||
|
* |
||||||
|
* This program and the accompanying materials are made available under the |
||||||
|
* terms of the Eclipse Distribution License v. 1.0 which is available at |
||||||
|
* https://www.eclipse.org/org/documents/edl-v10.php.
|
||||||
|
* |
||||||
|
* SPDX-License-Identifier: BSD-3-Clause |
||||||
|
*/ |
||||||
|
package org.eclipse.jgit.attributes; |
||||||
|
|
||||||
|
import static org.junit.Assert.assertArrayEquals; |
||||||
|
import static org.junit.Assert.assertEquals; |
||||||
|
import static org.junit.Assert.assertTrue; |
||||||
|
import static org.junit.Assert.fail; |
||||||
|
|
||||||
|
import java.io.BufferedInputStream; |
||||||
|
import java.io.File; |
||||||
|
import java.io.InputStream; |
||||||
|
import java.nio.charset.StandardCharsets; |
||||||
|
import java.nio.file.Files; |
||||||
|
import java.util.Arrays; |
||||||
|
|
||||||
|
import org.eclipse.jgit.api.Git; |
||||||
|
import org.eclipse.jgit.api.ResetCommand.ResetType; |
||||||
|
import org.eclipse.jgit.dircache.DirCache; |
||||||
|
import org.eclipse.jgit.dircache.DirCacheEntry; |
||||||
|
import org.eclipse.jgit.junit.RepositoryTestCase; |
||||||
|
import org.eclipse.jgit.lib.Constants; |
||||||
|
import org.eclipse.jgit.util.IO; |
||||||
|
import org.eclipse.jgit.util.RawParseUtils; |
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
/** |
||||||
|
* End-to-end tests for some attribute combinations. Writes files, commit them, |
||||||
|
* examines the index, deletes the files, performs a hard reset and checks file |
||||||
|
* contents again. |
||||||
|
*/ |
||||||
|
public class AttributeFileTests extends RepositoryTestCase { |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testTextAutoEolLf() throws Exception { |
||||||
|
writeTrashFile(".gitattributes", "* text=auto eol=lf"); |
||||||
|
performTest("Test\r\nFile", "Test\nFile", "Test\nFile"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testTextAutoEolCrLf() throws Exception { |
||||||
|
writeTrashFile(".gitattributes", "* text=auto eol=crlf"); |
||||||
|
performTest("Test\r\nFile", "Test\nFile", "Test\r\nFile"); |
||||||
|
} |
||||||
|
|
||||||
|
private void performTest(String initial, String index, String finalText) |
||||||
|
throws Exception { |
||||||
|
File dummy = writeTrashFile("dummy.foo", initial); |
||||||
|
byte[] data = readTestResource("add.png"); |
||||||
|
assertTrue("Expected some binary data", data.length > 100); |
||||||
|
File binary = writeTrashFile("add.png", ""); |
||||||
|
Files.write(binary.toPath(), data); |
||||||
|
try (Git git = Git.wrap(db)) { |
||||||
|
git.add().addFilepattern(".").call(); |
||||||
|
git.commit().setMessage("test commit").call(); |
||||||
|
// binary should be unchanged, dummy should match "index"
|
||||||
|
verifyIndexContent("dummy.foo", |
||||||
|
index.getBytes(StandardCharsets.UTF_8)); |
||||||
|
verifyIndexContent("add.png", data); |
||||||
|
assertTrue("Should be able to delete " + dummy, dummy.delete()); |
||||||
|
assertTrue("Should be able to delete " + binary, binary.delete()); |
||||||
|
git.reset().setMode(ResetType.HARD).call(); |
||||||
|
assertTrue("File " + dummy + " should exist", dummy.isFile()); |
||||||
|
assertTrue("File " + binary + " should exist", binary.isFile()); |
||||||
|
// binary should be unchanged, dummy should match "finalText"
|
||||||
|
String textFile = RawParseUtils.decode(IO.readFully(dummy, 512)); |
||||||
|
assertEquals("Unexpected text content", finalText, textFile); |
||||||
|
byte[] binaryFile = IO.readFully(binary, 512); |
||||||
|
assertArrayEquals("Unexpected binary content", data, binaryFile); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private byte[] readTestResource(String name) throws Exception { |
||||||
|
try (InputStream in = new BufferedInputStream( |
||||||
|
getClass().getResourceAsStream(name))) { |
||||||
|
byte[] data = new byte[512]; |
||||||
|
int read = in.read(data); |
||||||
|
if (read == data.length) { |
||||||
|
return data; |
||||||
|
} |
||||||
|
return Arrays.copyOf(data, read); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private void verifyIndexContent(String path, byte[] expectedContent) |
||||||
|
throws Exception { |
||||||
|
DirCache dc = db.readDirCache(); |
||||||
|
for (int i = 0; i < dc.getEntryCount(); ++i) { |
||||||
|
DirCacheEntry entry = dc.getEntry(i); |
||||||
|
if (path.equals(entry.getPathString())) { |
||||||
|
byte[] data = db.open(entry.getObjectId(), Constants.OBJ_BLOB) |
||||||
|
.getCachedBytes(); |
||||||
|
assertArrayEquals("Unexpected index content for " + path, |
||||||
|
expectedContent, data); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
fail("Path not found in index: " + path); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue