diff options
Diffstat (limited to 'org.eclipse.jgit.test')
6 files changed, 329 insertions, 45 deletions
diff --git a/org.eclipse.jgit.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.test/META-INF/MANIFEST.MF index 00659d8de3..4b2e535c2d 100644 --- a/org.eclipse.jgit.test/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.test/META-INF/MANIFEST.MF @@ -2,54 +2,54 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.test -Bundle-Version: 4.7.1.qualifier +Bundle-Version: 4.8.0.qualifier Bundle-Localization: plugin Bundle-Vendor: %provider_name Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: com.googlecode.javaewah;version="[1.1.6,2.0.0)", - org.eclipse.jgit.api;version="[4.7.1,4.8.0)", - org.eclipse.jgit.api.errors;version="[4.7.1,4.8.0)", - org.eclipse.jgit.attributes;version="[4.7.1,4.8.0)", - org.eclipse.jgit.awtui;version="[4.7.1,4.8.0)", - org.eclipse.jgit.blame;version="[4.7.1,4.8.0)", - org.eclipse.jgit.diff;version="[4.7.1,4.8.0)", - org.eclipse.jgit.dircache;version="[4.7.1,4.8.0)", - org.eclipse.jgit.errors;version="[4.7.1,4.8.0)", - org.eclipse.jgit.events;version="[4.7.1,4.8.0)", - org.eclipse.jgit.fnmatch;version="[4.7.1,4.8.0)", - org.eclipse.jgit.gitrepo;version="[4.7.1,4.8.0)", - org.eclipse.jgit.hooks;version="[4.7.1,4.8.0)", - org.eclipse.jgit.ignore;version="[4.7.1,4.8.0)", - org.eclipse.jgit.ignore.internal;version="[4.7.1,4.8.0)", - org.eclipse.jgit.internal;version="[4.7.1,4.8.0)", - org.eclipse.jgit.internal.storage.dfs;version="[4.7.1,4.8.0)", - org.eclipse.jgit.internal.storage.file;version="[4.7.1,4.8.0)", - org.eclipse.jgit.internal.storage.pack;version="[4.7.1,4.8.0)", - org.eclipse.jgit.internal.storage.reftree;version="[4.7.1,4.8.0)", - org.eclipse.jgit.junit;version="[4.7.1,4.8.0)", - org.eclipse.jgit.lfs;version="[4.7.1,4.8.0)", - org.eclipse.jgit.lib;version="[4.7.1,4.8.0)", - org.eclipse.jgit.merge;version="[4.7.1,4.8.0)", - org.eclipse.jgit.nls;version="[4.7.1,4.8.0)", - org.eclipse.jgit.notes;version="[4.7.1,4.8.0)", - org.eclipse.jgit.patch;version="[4.7.1,4.8.0)", - org.eclipse.jgit.pgm;version="[4.7.1,4.8.0)", - org.eclipse.jgit.pgm.internal;version="[4.7.1,4.8.0)", - org.eclipse.jgit.revplot;version="[4.7.1,4.8.0)", - org.eclipse.jgit.revwalk;version="[4.7.1,4.8.0)", - org.eclipse.jgit.revwalk.filter;version="[4.7.1,4.8.0)", - org.eclipse.jgit.storage.file;version="[4.7.1,4.8.0)", - org.eclipse.jgit.storage.pack;version="[4.7.1,4.8.0)", - org.eclipse.jgit.submodule;version="[4.7.1,4.8.0)", - org.eclipse.jgit.transport;version="[4.7.1,4.8.0)", - org.eclipse.jgit.transport.http;version="[4.7.1,4.8.0)", - org.eclipse.jgit.transport.resolver;version="[4.7.1,4.8.0)", - org.eclipse.jgit.treewalk;version="[4.7.1,4.8.0)", - org.eclipse.jgit.treewalk.filter;version="[4.7.1,4.8.0)", - org.eclipse.jgit.util;version="[4.7.1,4.8.0)", - org.eclipse.jgit.util.io;version="[4.7.1,4.8.0)", - org.eclipse.jgit.util.sha1;version="[4.7.1,4.8.0)", + org.eclipse.jgit.api;version="[4.8.0,4.9.0)", + org.eclipse.jgit.api.errors;version="[4.8.0,4.9.0)", + org.eclipse.jgit.attributes;version="[4.8.0,4.9.0)", + org.eclipse.jgit.awtui;version="[4.8.0,4.9.0)", + org.eclipse.jgit.blame;version="[4.8.0,4.9.0)", + org.eclipse.jgit.diff;version="[4.8.0,4.9.0)", + org.eclipse.jgit.dircache;version="[4.8.0,4.9.0)", + org.eclipse.jgit.errors;version="[4.8.0,4.9.0)", + org.eclipse.jgit.events;version="[4.8.0,4.9.0)", + org.eclipse.jgit.fnmatch;version="[4.8.0,4.9.0)", + org.eclipse.jgit.gitrepo;version="[4.8.0,4.9.0)", + org.eclipse.jgit.hooks;version="[4.8.0,4.9.0)", + org.eclipse.jgit.ignore;version="[4.8.0,4.9.0)", + org.eclipse.jgit.ignore.internal;version="[4.8.0,4.9.0)", + org.eclipse.jgit.internal;version="[4.8.0,4.9.0)", + org.eclipse.jgit.internal.storage.dfs;version="[4.8.0,4.9.0)", + org.eclipse.jgit.internal.storage.file;version="[4.8.0,4.9.0)", + org.eclipse.jgit.internal.storage.pack;version="[4.8.0,4.9.0)", + org.eclipse.jgit.internal.storage.reftree;version="[4.8.0,4.9.0)", + org.eclipse.jgit.junit;version="[4.8.0,4.9.0)", + org.eclipse.jgit.lfs;version="[4.8.0,4.9.0)", + org.eclipse.jgit.lib;version="[4.8.0,4.9.0)", + org.eclipse.jgit.merge;version="[4.8.0,4.9.0)", + org.eclipse.jgit.nls;version="[4.8.0,4.9.0)", + org.eclipse.jgit.notes;version="[4.8.0,4.9.0)", + org.eclipse.jgit.patch;version="[4.8.0,4.9.0)", + org.eclipse.jgit.pgm;version="[4.8.0,4.9.0)", + org.eclipse.jgit.pgm.internal;version="[4.8.0,4.9.0)", + org.eclipse.jgit.revplot;version="[4.8.0,4.9.0)", + org.eclipse.jgit.revwalk;version="[4.8.0,4.9.0)", + org.eclipse.jgit.revwalk.filter;version="[4.8.0,4.9.0)", + org.eclipse.jgit.storage.file;version="[4.8.0,4.9.0)", + org.eclipse.jgit.storage.pack;version="[4.8.0,4.9.0)", + org.eclipse.jgit.submodule;version="[4.8.0,4.9.0)", + org.eclipse.jgit.transport;version="[4.8.0,4.9.0)", + org.eclipse.jgit.transport.http;version="[4.8.0,4.9.0)", + org.eclipse.jgit.transport.resolver;version="[4.8.0,4.9.0)", + org.eclipse.jgit.treewalk;version="[4.8.0,4.9.0)", + org.eclipse.jgit.treewalk.filter;version="[4.8.0,4.9.0)", + org.eclipse.jgit.util;version="[4.8.0,4.9.0)", + org.eclipse.jgit.util.io;version="[4.8.0,4.9.0)", + org.eclipse.jgit.util.sha1;version="[4.8.0,4.9.0)", org.junit;version="[4.4.0,5.0.0)", org.junit.experimental.theories;version="[4.4.0,5.0.0)", org.junit.rules;version="[4.11.0,5.0.0)", diff --git a/org.eclipse.jgit.test/pom.xml b/org.eclipse.jgit.test/pom.xml index aac4c333a9..e3b0dcdcda 100644 --- a/org.eclipse.jgit.test/pom.xml +++ b/org.eclipse.jgit.test/pom.xml @@ -52,7 +52,7 @@ <parent> <groupId>org.eclipse.jgit</groupId> <artifactId>org.eclipse.jgit-parent</artifactId> - <version>4.7.1-SNAPSHOT</version> + <version>4.8.0-SNAPSHOT</version> </parent> <artifactId>org.eclipse.jgit.test</artifactId> diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/AbstractDiffTestCase.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/AbstractDiffTestCase.java index b8f8dcb5ad..4130b7ee5b 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/AbstractDiffTestCase.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/AbstractDiffTestCase.java @@ -196,6 +196,32 @@ public abstract class AbstractDiffTestCase { } @Test + public void testEdit_DeleteNearCommonTail() { + EditList r = diff(t("aCq}nD}nb"), t("aq}nb")); + assertEquals(new Edit(1, 2, 1, 1), r.get(0)); + assertEquals(new Edit(5, 8, 4, 4), r.get(1)); + assertEquals(2, r.size()); + } + + @Test + public void testEdit_DeleteNearCommonCenter() { + EditList r = diff(t("abcd123123uvwxpq"), t("aBcd123uvwxPq")); + assertEquals(new Edit(1, 2, 1, 2), r.get(0)); + assertEquals(new Edit(7, 10, 7, 7), r.get(1)); + assertEquals(new Edit(14, 15, 11, 12), r.get(2)); + assertEquals(3, r.size()); + } + + @Test + public void testEdit_InsertNearCommonCenter() { + EditList r = diff(t("aBcd123uvwxPq"), t("abcd123123uvwxpq")); + assertEquals(new Edit(1, 2, 1, 2), r.get(0)); + assertEquals(new Edit(7, 7, 7, 10), r.get(1)); + assertEquals(new Edit(11, 12, 14, 15), r.get(2)); + assertEquals(3, r.size()); + } + + @Test public void testEdit_LinuxBug() { EditList r = diff(t("a{bcdE}z"), t("a{0bcdEE}z")); assertEquals(new Edit(2, 2, 2, 3), r.get(0)); diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergeAlgorithmTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergeAlgorithmTest.java index d4a3d62dad..5af62b6704 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergeAlgorithmTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergeAlgorithmTest.java @@ -132,6 +132,45 @@ public class MergeAlgorithmTest { } /** + * Merge two modifications with a shared delete at the end. The underlying + * diff algorithm has to provide consistent edit results to get the expected + * merge result. + * + * @throws IOException + */ + @Test + public void testTwoModificationsWithSharedDelete() throws IOException { + assertEquals(t("Cb}n}"), + merge("ab}n}n}", "ab}n}", "Cb}n}")); + } + + /** + * Merge modifications with a shared insert in the middle. The + * underlying diff algorithm has to provide consistent edit + * results to get the expected merge result. + * + * @throws IOException + */ + @Test + public void testModificationsWithMiddleInsert() throws IOException { + assertEquals(t("aBcd123123uvwxPq"), + merge("abcd123uvwxpq", "aBcd123123uvwxPq", "abcd123123uvwxpq")); + } + + /** + * Merge modifications with a shared delete in the middle. The + * underlying diff algorithm has to provide consistent edit + * results to get the expected merge result. + * + * @throws IOException + */ + @Test + public void testModificationsWithMiddleDelete() throws IOException { + assertEquals(t("Abz}z123Q"), + merge("abz}z}z123q", "Abz}z123Q", "abz}z123q")); + } + + /** * Test a conflicting region at the very start of the text. * * @throws IOException diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/ResolveMergerTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/ResolveMergerTest.java index a08dbbcc83..d8b8750ba3 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/ResolveMergerTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/ResolveMergerTest.java @@ -42,12 +42,17 @@ */ package org.eclipse.jgit.merge; +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.eclipse.jgit.lib.Constants.OBJ_BLOB; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.util.Arrays; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.MergeResult; @@ -59,8 +64,14 @@ import org.eclipse.jgit.dircache.DirCache; import org.eclipse.jgit.errors.NoMergeBaseException; import org.eclipse.jgit.errors.NoMergeBaseException.MergeBaseFailureReason; import org.eclipse.jgit.junit.RepositoryTestCase; +import org.eclipse.jgit.junit.TestRepository; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.merge.ResolveMerger.MergeFailureReason; import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevObject; +import org.eclipse.jgit.revwalk.RevTree; +import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.treewalk.FileTreeIterator; import org.eclipse.jgit.util.FS; import org.eclipse.jgit.util.FileUtils; @@ -408,7 +419,7 @@ public class ResolveMergerTest extends RepositoryTestCase { /** * Merging two equal subtrees with an incore merger should lead to a merged - * state (The 'Gerrit' use case). + * state. * * @param strategy * @throws Exception @@ -442,6 +453,43 @@ public class ResolveMergerTest extends RepositoryTestCase { } /** + * Merging two equal subtrees with an incore merger should lead to a merged + * state, without using a Repository (the 'Gerrit' use case). + * + * @param strategy + * @throws Exception + */ + @Theory + public void checkMergeEqualTreesInCore_noRepo(MergeStrategy strategy) + throws Exception { + Git git = Git.wrap(db); + + writeTrashFile("d/1", "orig"); + git.add().addFilepattern("d/1").call(); + RevCommit first = git.commit().setMessage("added d/1").call(); + + writeTrashFile("d/1", "modified"); + RevCommit masterCommit = git.commit().setAll(true) + .setMessage("modified d/1 on master").call(); + + git.checkout().setCreateBranch(true).setStartPoint(first) + .setName("side").call(); + writeTrashFile("d/1", "modified"); + RevCommit sideCommit = git.commit().setAll(true) + .setMessage("modified d/1 on side").call(); + + git.rm().addFilepattern("d/1").call(); + git.rm().addFilepattern("d").call(); + + try (ObjectInserter ins = db.newObjectInserter()) { + ThreeWayMerger resolveMerger = + (ThreeWayMerger) strategy.newMerger(ins, db.getConfig()); + boolean noProblems = resolveMerger.merge(masterCommit, sideCommit); + assertTrue(noProblems); + } + } + + /** * Merging two equal subtrees when the index and HEAD does not contain any * file in that subtree should lead to a merged state. * @@ -586,6 +634,136 @@ public class ResolveMergerTest extends RepositoryTestCase { } } + @Theory + public void checkContentMergeNoConflict(MergeStrategy strategy) + throws Exception { + Git git = Git.wrap(db); + + writeTrashFile("file", "1\n2\n3"); + git.add().addFilepattern("file").call(); + RevCommit first = git.commit().setMessage("added file").call(); + + writeTrashFile("file", "1master\n2\n3"); + git.commit().setAll(true).setMessage("modified file on master").call(); + + git.checkout().setCreateBranch(true).setStartPoint(first) + .setName("side").call(); + writeTrashFile("file", "1\n2\n3side"); + RevCommit sideCommit = git.commit().setAll(true) + .setMessage("modified file on side").call(); + + git.checkout().setName("master").call(); + MergeResult result = + git.merge().setStrategy(strategy).include(sideCommit).call(); + assertEquals(MergeStatus.MERGED, result.getMergeStatus()); + String expected = "1master\n2\n3side"; + assertEquals(expected, read("file")); + } + + @Theory + public void checkContentMergeNoConflict_noRepo(MergeStrategy strategy) + throws Exception { + Git git = Git.wrap(db); + + writeTrashFile("file", "1\n2\n3"); + git.add().addFilepattern("file").call(); + RevCommit first = git.commit().setMessage("added file").call(); + + writeTrashFile("file", "1master\n2\n3"); + RevCommit masterCommit = git.commit().setAll(true) + .setMessage("modified file on master").call(); + + git.checkout().setCreateBranch(true).setStartPoint(first) + .setName("side").call(); + writeTrashFile("file", "1\n2\n3side"); + RevCommit sideCommit = git.commit().setAll(true) + .setMessage("modified file on side").call(); + + try (ObjectInserter ins = db.newObjectInserter()) { + ResolveMerger merger = + (ResolveMerger) strategy.newMerger(ins, db.getConfig()); + boolean noProblems = merger.merge(masterCommit, sideCommit); + assertTrue(noProblems); + assertEquals("1master\n2\n3side", + readBlob(merger.getResultTreeId(), "file")); + } + } + + @Theory + public void checkContentMergeConflict(MergeStrategy strategy) + throws Exception { + Git git = Git.wrap(db); + + writeTrashFile("file", "1\n2\n3"); + git.add().addFilepattern("file").call(); + RevCommit first = git.commit().setMessage("added file").call(); + + writeTrashFile("file", "1master\n2\n3"); + git.commit().setAll(true).setMessage("modified file on master").call(); + + git.checkout().setCreateBranch(true).setStartPoint(first) + .setName("side").call(); + writeTrashFile("file", "1side\n2\n3"); + RevCommit sideCommit = git.commit().setAll(true) + .setMessage("modified file on side").call(); + + git.checkout().setName("master").call(); + MergeResult result = + git.merge().setStrategy(strategy).include(sideCommit).call(); + assertEquals(MergeStatus.CONFLICTING, result.getMergeStatus()); + String expected = "<<<<<<< HEAD\n" + + "1master\n" + + "=======\n" + + "1side\n" + + ">>>>>>> " + sideCommit.name() + "\n" + + "2\n" + + "3"; + assertEquals(expected, read("file")); + } + + @Theory + public void checkContentMergeConflict_noTree(MergeStrategy strategy) + throws Exception { + Git git = Git.wrap(db); + + writeTrashFile("file", "1\n2\n3"); + git.add().addFilepattern("file").call(); + RevCommit first = git.commit().setMessage("added file").call(); + + writeTrashFile("file", "1master\n2\n3"); + RevCommit masterCommit = git.commit().setAll(true) + .setMessage("modified file on master").call(); + + git.checkout().setCreateBranch(true).setStartPoint(first) + .setName("side").call(); + writeTrashFile("file", "1side\n2\n3"); + RevCommit sideCommit = git.commit().setAll(true) + .setMessage("modified file on side").call(); + + try (ObjectInserter ins = db.newObjectInserter()) { + ResolveMerger merger = + (ResolveMerger) strategy.newMerger(ins, db.getConfig()); + boolean noProblems = merger.merge(masterCommit, sideCommit); + assertFalse(noProblems); + assertEquals(Arrays.asList("file"), merger.getUnmergedPaths()); + + MergeFormatter fmt = new MergeFormatter(); + merger.getMergeResults().get("file"); + try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { + fmt.formatMerge(out, merger.getMergeResults().get("file"), + "BASE", "OURS", "THEIRS", UTF_8.name()); + String expected = "<<<<<<< OURS\n" + + "1master\n" + + "=======\n" + + "1side\n" + + ">>>>>>> THEIRS\n" + + "2\n" + + "3"; + assertEquals(expected, new String(out.toByteArray(), UTF_8)); + } + } + } + /** * Merging after criss-cross merges. In this case we merge together two * commits which have two equally good common ancestors @@ -817,4 +995,15 @@ public class ResolveMergerTest extends RepositoryTestCase { curMod >= lastMod); } } + + private String readBlob(ObjectId treeish, String path) throws Exception { + TestRepository<?> tr = new TestRepository<>(db); + RevWalk rw = tr.getRevWalk(); + RevTree tree = rw.parseTree(treeish); + RevObject obj = tr.get(tree, path); + if (obj == null) { + return null; + } + return new String(rw.getObjectReader().open(obj, OBJ_BLOB).getBytes(), UTF_8); + } } diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/SimpleMergeTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/SimpleMergeTest.java index db9d87dd17..951568e7bb 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/SimpleMergeTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/SimpleMergeTest.java @@ -72,6 +72,16 @@ public class SimpleMergeTest extends SampleDataRepositoryTestCase { } @Test + public void testOurs_noRepo() throws IOException { + try (ObjectInserter ins = db.newObjectInserter()) { + Merger ourMerger = MergeStrategy.OURS.newMerger(ins, db.getConfig()); + boolean merge = ourMerger.merge(new ObjectId[] { db.resolve("a"), db.resolve("c") }); + assertTrue(merge); + assertEquals(db.resolve("a^{tree}"), ourMerger.getResultTreeId()); + } + } + + @Test public void testTheirs() throws IOException { Merger ourMerger = MergeStrategy.THEIRS.newMerger(db); boolean merge = ourMerger.merge(new ObjectId[] { db.resolve("a"), db.resolve("c") }); @@ -80,6 +90,16 @@ public class SimpleMergeTest extends SampleDataRepositoryTestCase { } @Test + public void testTheirs_noRepo() throws IOException { + try (ObjectInserter ins = db.newObjectInserter()) { + Merger ourMerger = MergeStrategy.THEIRS.newMerger(db); + boolean merge = ourMerger.merge(new ObjectId[] { db.resolve("a"), db.resolve("c") }); + assertTrue(merge); + assertEquals(db.resolve("c^{tree}"), ourMerger.getResultTreeId()); + } + } + + @Test public void testTrivialTwoWay() throws IOException { Merger ourMerger = MergeStrategy.SIMPLE_TWO_WAY_IN_CORE.newMerger(db); boolean merge = ourMerger.merge(new ObjectId[] { db.resolve("a"), db.resolve("c") }); @@ -104,6 +124,16 @@ public class SimpleMergeTest extends SampleDataRepositoryTestCase { } @Test + public void testTrivialTwoWay_noRepo() throws IOException { + try (ObjectInserter ins = db.newObjectInserter()) { + Merger ourMerger = MergeStrategy.SIMPLE_TWO_WAY_IN_CORE.newMerger(ins, db.getConfig()); + boolean merge = ourMerger.merge(new ObjectId[] { db.resolve("a^0^0^0"), db.resolve("a^0^0^1") }); + assertTrue(merge); + assertEquals(db.resolve("a^0^0^{tree}"), ourMerger.getResultTreeId()); + } + } + + @Test public void testTrivialTwoWay_conflict() throws IOException { Merger ourMerger = MergeStrategy.SIMPLE_TWO_WAY_IN_CORE.newMerger(db); boolean merge = ourMerger.merge(new ObjectId[] { db.resolve("f"), db.resolve("g") }); |