package org.eclipse.jgit.pgm;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertArrayEquals;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.lib.CLIRepositoryTestCase;
import org.junit.Test;
public class MergeTest extends CLIRepositoryTestCase {
+
+ private Git git;
+
@Override
@Before
public void setUp() throws Exception {
super.setUp();
- new Git(db).commit().setMessage("initial commit").call();
+ git = new Git(db);
+ git.commit().setMessage("initial commit").call();
}
@Test
assertEquals("Already up-to-date.", execute("git merge master")[0]);
}
+ @Test
+ public void testSquashSelf() throws Exception {
+ assertEquals(" (nothing to squash)Already up-to-date.",
+ execute("git merge master --squash")[0]);
+ }
+
@Test
public void testFastForward() throws Exception {
- new Git(db).commit().setMessage("initial commit").call();
- new Git(db).branchCreate().setName("side").call();
+ git.branchCreate().setName("side").call();
writeTrashFile("file", "master");
- new Git(db).add().addFilepattern("file").call();
- new Git(db).commit().setMessage("commit").call();
- new Git(db).checkout().setName("side").call();
+ git.add().addFilepattern("file").call();
+ git.commit().setMessage("commit").call();
+ git.checkout().setName("side").call();
assertEquals("Fast-forward", execute("git merge master")[0]);
}
@Test
public void testMerge() throws Exception {
- new Git(db).commit().setMessage("initial commit").call();
- new Git(db).branchCreate().setName("side").call();
+ git.branchCreate().setName("side").call();
writeTrashFile("master", "content");
- new Git(db).add().addFilepattern("master").call();
- new Git(db).commit().setMessage("master commit").call();
- new Git(db).checkout().setName("side").call();
+ git.add().addFilepattern("master").call();
+ git.commit().setMessage("master commit").call();
+ git.checkout().setName("side").call();
writeTrashFile("side", "content");
- new Git(db).add().addFilepattern("side").call();
- new Git(db).commit().setMessage("side commit").call();
+ git.add().addFilepattern("side").call();
+ git.commit().setMessage("side commit").call();
assertEquals("Merge made by the '" + MergeStrategy.RESOLVE.getName()
+ "' strategy.", execute("git merge master")[0]);
}
+
+ @Test
+ public void testSquash() throws Exception {
+ git.branchCreate().setName("side").call();
+ writeTrashFile("file1", "content1");
+ git.add().addFilepattern("file1").call();
+ git.commit().setMessage("file1 commit").call();
+ writeTrashFile("file2", "content2");
+ git.add().addFilepattern("file2").call();
+ git.commit().setMessage("file2 commit").call();
+ git.checkout().setName("side").call();
+ writeTrashFile("side", "content");
+ git.add().addFilepattern("side").call();
+ git.commit().setMessage("side commit").call();
+
+ assertArrayEquals(
+ new String[] { "Squash commit -- not updating HEAD",
+ "Automatic merge went well; stopped before committing as requested",
+ "" },
+ execute("git merge master --squash"));
+ }
}
mergeConflict=CONFLICT(content): Merge conflict in {0}
mergeFailed=Automatic merge failed; fix conflicts and then commit the result
mergeMadeBy=Merge made by the ''{0}'' strategy.
+mergedSquashed=Squash commit -- not updating HEAD\nAutomatic merge went well; stopped before committing as requested
metaVar_DAG=DAG
metaVar_KEY=KEY
metaVar_arg=ARG
notAnObject={0} is not an object
notFound=!! NOT FOUND !!
noteObjectTooLargeToPrint=Note object {0} too large to print
+nothingToSquash=\ (nothing to squash)
notOnAnyBranch=Not currently on any branch.
onBranch=On branch {0}
onBranchToBeBorn=You are on a branch yet to be born
usage_showPatch=display patch
usage_showRefNamesMatchingCommits=Show ref names matching commits
usage_showNotes=Add this ref to the list of note branches from which notes are displayed
+usage_squash=Squash commits as if a real merge happened, but do not make a commit or move the HEAD.
usage_srcPrefix=show the source prefix instead of "a/"
usage_symbolicVersionForTheProject=Symbolic version for the project
usage_synchronizeIPZillaData=Synchronize IPZilla data
/***/ public String mergeConflict;
/***/ public String mergeFailed;
/***/ public String mergeMadeBy;
+ /***/ public String mergedSquashed;
/***/ public String metaVar_KEY;
/***/ public String metaVar_arg;
/***/ public String metaVar_author;
/***/ public String notFound;
/***/ public String notOnAnyBranch;
/***/ public String noteObjectTooLargeToPrint;
+ /***/ public String nothingToSquash;
/***/ public String onBranchToBeBorn;
/***/ public String onBranch;
/***/ public String onlyOneMetaVarExpectedIn;
@Option(name = "--strategy", aliases = { "-s" }, usage = "usage_mergeStrategy")
private String strategyName;
+ @Option(name = "--squash", usage = "usage_squash")
+ private boolean squash;
+
private MergeStrategy mergeStrategy = MergeStrategy.RESOLVE;
@Argument(required = true)
Git git = new Git(db);
MergeResult result = git.merge().setStrategy(mergeStrategy)
- .include(src).call();
+ .setSquash(squash).include(src).call();
switch (result.getMergeStatus()) {
case ALREADY_UP_TO_DATE:
+ if (squash)
+ outw.print(CLIText.get().nothingToSquash);
outw.println(CLIText.get().alreadyUpToDate);
break;
case FAST_FORWARD:
outw.println(MessageFormat.format(CLIText.get().mergeMadeBy,
mergeStrategy.getName()));
break;
+ case MERGED_SQUASHED:
+ outw.println(CLIText.get().mergedSquashed);
+ break;
case NOT_SUPPORTED:
outw.println(MessageFormat.format(
CLIText.get().unsupportedOperation, result.toString()));