blob: 5d05a98d666701db1e7ac37e78209c9915bd6fd5 [file] [log] [blame]
/*
* 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.ConfigConstants;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.storage.file.FileBasedConfig;
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 testTextAutoCoreEolCoreAutoCrLfInput() throws Exception {
FileBasedConfig cfg = db.getConfig();
cfg.setBoolean(ConfigConstants.CONFIG_CORE_SECTION, null,
ConfigConstants.CONFIG_KEY_AUTOCRLF, false);
cfg.save();
final String content = "Line1\nLine2\n";
try (Git git = Git.wrap(db)) {
writeTrashFile(".gitattributes", "* text=auto");
File dummy = writeTrashFile("dummy.txt", content);
git.add().addFilepattern(".").call();
git.commit().setMessage("Commit with LF").call();
assertEquals("Unexpected index state",
"[.gitattributes, mode:100644, content:* text=auto]"
+ "[dummy.txt, mode:100644, content:" + content
+ ']',
indexState(CONTENT));
assertTrue("Should be able to delete " + dummy, dummy.delete());
cfg.setString(ConfigConstants.CONFIG_CORE_SECTION, null,
ConfigConstants.CONFIG_KEY_EOL, "crlf");
cfg.setString(ConfigConstants.CONFIG_CORE_SECTION, null,
ConfigConstants.CONFIG_KEY_AUTOCRLF, "input");
cfg.save();
git.reset().setMode(ResetType.HARD).call();
assertTrue("File " + dummy + "should exist", dummy.isFile());
String textFile = RawParseUtils.decode(IO.readFully(dummy, 512));
assertEquals("Unexpected text content", content, textFile);
}
}
@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);
}
}