summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit.lfs.test/tst/org/eclipse
diff options
context:
space:
mode:
authorThomas Wolf <thomas.wolf@paranor.ch>2021-01-29 23:03:44 +0100
committerMatthias Sohn <matthias.sohn@sap.com>2021-03-01 15:53:07 -0500
commit616a88895dfc36fd3c9fea7d010b03e6d2cf8c1d (patch)
treef532f4b09108d8e4d332d9456162abda7608ee9a /org.eclipse.jgit.lfs.test/tst/org/eclipse
parentb126372448958d7b6dee1ca0ad70ec4fbb52899f (diff)
downloadjgit-616a88895dfc36fd3c9fea7d010b03e6d2cf8c1d.tar.gz
jgit-616a88895dfc36fd3c9fea7d010b03e6d2cf8c1d.zip
LFS: handle invalid pointers better
Make sure that SmudgeFilter calls LfsPointer.parseLfsPointer() with a stream that supports mark/reset, and make sure that parseLfsPointer() resets the stream properly if it decides that the stream content is not a LFS pointer. Add a test. Bug: 570758 Change-Id: I2593d67cff31b2dfdfaaa48e437331f0ed877915 Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
Diffstat (limited to 'org.eclipse.jgit.lfs.test/tst/org/eclipse')
-rw-r--r--org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/LfsGitTest.java141
1 files changed, 141 insertions, 0 deletions
diff --git a/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/LfsGitTest.java b/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/LfsGitTest.java
new file mode 100644
index 0000000000..8964310e41
--- /dev/null
+++ b/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/LfsGitTest.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2021, 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.lfs;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.ResetCommand.ResetType;
+import org.eclipse.jgit.attributes.FilterCommandRegistry;
+import org.eclipse.jgit.junit.RepositoryTestCase;
+import org.eclipse.jgit.lfs.lib.Constants;
+import org.eclipse.jgit.lib.StoredConfig;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class LfsGitTest extends RepositoryTestCase {
+
+ private static final String SMUDGE_NAME = org.eclipse.jgit.lib.Constants.BUILTIN_FILTER_PREFIX
+ + Constants.ATTR_FILTER_DRIVER_PREFIX
+ + org.eclipse.jgit.lib.Constants.ATTR_FILTER_TYPE_SMUDGE;
+
+ private static final String CLEAN_NAME = org.eclipse.jgit.lib.Constants.BUILTIN_FILTER_PREFIX
+ + Constants.ATTR_FILTER_DRIVER_PREFIX
+ + org.eclipse.jgit.lib.Constants.ATTR_FILTER_TYPE_CLEAN;
+
+ @BeforeClass
+ public static void installLfs() {
+ FilterCommandRegistry.register(SMUDGE_NAME, SmudgeFilter.FACTORY);
+ FilterCommandRegistry.register(CLEAN_NAME, CleanFilter.FACTORY);
+ }
+
+ @AfterClass
+ public static void removeLfs() {
+ FilterCommandRegistry.unregister(SMUDGE_NAME);
+ FilterCommandRegistry.unregister(CLEAN_NAME);
+ }
+
+ private Git git;
+
+ @Override
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ git = new Git(db);
+ // commit something
+ writeTrashFile("Test.txt", "Hello world");
+ git.add().addFilepattern("Test.txt").call();
+ git.commit().setMessage("Initial commit").call();
+ // prepare the config for LFS
+ StoredConfig config = git.getRepository().getConfig();
+ config.setString("filter", "lfs", "clean", CLEAN_NAME);
+ config.setString("filter", "lfs", "smudge", SMUDGE_NAME);
+ config.save();
+ }
+
+ @Test
+ public void checkoutNonLfsPointer() throws Exception {
+ String content = "size_t\nsome_function(void* ptr);\n";
+ File smallFile = writeTrashFile("Test.txt", content);
+ StringBuilder largeContent = new StringBuilder(
+ LfsPointer.SIZE_THRESHOLD * 4);
+ while (largeContent.length() < LfsPointer.SIZE_THRESHOLD * 4) {
+ largeContent.append(content);
+ }
+ File largeFile = writeTrashFile("large.txt", largeContent.toString());
+ fsTick(largeFile);
+ git.add().addFilepattern("Test.txt").addFilepattern("large.txt").call();
+ git.commit().setMessage("Text files").call();
+ writeTrashFile(".gitattributes", "*.txt filter=lfs");
+ git.add().addFilepattern(".gitattributes").call();
+ git.commit().setMessage("attributes").call();
+ assertTrue(smallFile.delete());
+ assertTrue(largeFile.delete());
+ // This reset will run the two text files through the smudge filter
+ git.reset().setMode(ResetType.HARD).call();
+ assertTrue(smallFile.exists());
+ assertTrue(largeFile.exists());
+ checkFile(smallFile, content);
+ checkFile(largeFile, largeContent.toString());
+ // Modify the large file
+ largeContent.append(content);
+ writeTrashFile("large.txt", largeContent.toString());
+ // This should convert largeFile to an LFS pointer
+ git.add().addFilepattern("large.txt").call();
+ git.commit().setMessage("Large modified").call();
+ String lfsPtr = "version https://git-lfs.github.com/spec/v1\n"
+ + "oid sha256:d041ab19bd7edd899b3c0450d0f61819f96672f0b22d26c9753abc62e1261614\n"
+ + "size 858\n";
+ assertEquals("[.gitattributes, mode:100644, content:*.txt filter=lfs]"
+ + "[Test.txt, mode:100644, content:" + content + ']'
+ + "[large.txt, mode:100644, content:" + lfsPtr + ']',
+ indexState(CONTENT));
+ // Verify the file has been saved
+ File savedFile = new File(db.getDirectory(), "lfs");
+ savedFile = new File(savedFile, "objects");
+ savedFile = new File(savedFile, "d0");
+ savedFile = new File(savedFile, "41");
+ savedFile = new File(savedFile,
+ "d041ab19bd7edd899b3c0450d0f61819f96672f0b22d26c9753abc62e1261614");
+ String saved = new String(Files.readAllBytes(savedFile.toPath()),
+ StandardCharsets.UTF_8);
+ assertEquals(saved, largeContent.toString());
+
+ assertTrue(smallFile.delete());
+ assertTrue(largeFile.delete());
+ git.reset().setMode(ResetType.HARD).call();
+ assertTrue(smallFile.exists());
+ assertTrue(largeFile.exists());
+ checkFile(smallFile, content);
+ checkFile(largeFile, largeContent.toString());
+ assertEquals("[.gitattributes, mode:100644, content:*.txt filter=lfs]"
+ + "[Test.txt, mode:100644, content:" + content + ']'
+ + "[large.txt, mode:100644, content:" + lfsPtr + ']',
+ indexState(CONTENT));
+ git.add().addFilepattern("Test.txt").call();
+ git.commit().setMessage("Small committed again").call();
+ String lfsPtrSmall = "version https://git-lfs.github.com/spec/v1\n"
+ + "oid sha256:9110463275fb0e2f0e9fdeaf84e598e62915666161145cf08927079119cc7814\n"
+ + "size 33\n";
+ assertEquals("[.gitattributes, mode:100644, content:*.txt filter=lfs]"
+ + "[Test.txt, mode:100644, content:" + lfsPtrSmall + ']'
+ + "[large.txt, mode:100644, content:" + lfsPtr + ']',
+ indexState(CONTENT));
+
+ assertTrue(git.status().call().isClean());
+ }
+}