summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit.test
diff options
context:
space:
mode:
authorThomas Wolf <thomas.wolf@paranor.ch>2020-03-23 16:55:35 +0100
committerThomas Wolf <thomas.wolf@paranor.ch>2020-05-22 17:08:52 -0400
commit3c34e0acbfcac236daaf746690130c6e99a8e524 (patch)
treebd5c30242f9861d35fbba58e0f49c87db4d04294 /org.eclipse.jgit.test
parent97e660e1a54b2bae4b5e830ad45c3d7b9ea9ea21 (diff)
downloadjgit-3c34e0acbfcac236daaf746690130c6e99a8e524.tar.gz
jgit-3c34e0acbfcac236daaf746690130c6e99a8e524.zip
Attributes: fix handling of text=auto in combination with eol
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>
Diffstat (limited to 'org.eclipse.jgit.test')
-rw-r--r--org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/attributes/add.pngbin0 -> 366 bytes
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/AttributeFileTests.java107
2 files changed, 107 insertions, 0 deletions
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/attributes/add.png b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/attributes/add.png
new file mode 100644
index 0000000000..c6aeae4d46
--- /dev/null
+++ b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/attributes/add.png
Binary files differ
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/AttributeFileTests.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/AttributeFileTests.java
new file mode 100644
index 0000000000..7b90dcda08
--- /dev/null
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/AttributeFileTests.java
@@ -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);
+ }
+}