aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java
diff options
context:
space:
mode:
authorTomasz Zarna <Tomasz.Zarna@pl.ibm.com>2012-06-13 23:28:55 +0200
committerMatthias Sohn <matthias.sohn@sap.com>2012-06-15 08:59:41 +0200
commit2656ac1b5acb9b73c6b47e2cf8830a0a0b2cc214 (patch)
tree1f48ca5fafef4ae7482c88b2084d532508bb944c /org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java
parentc4087af65ddfd976f2a2513a773f50b1fd790336 (diff)
downloadjgit-2656ac1b5acb9b73c6b47e2cf8830a0a0b2cc214.tar.gz
jgit-2656ac1b5acb9b73c6b47e2cf8830a0a0b2cc214.zip
Add "--squash" option to MergeCommand
CQ: 6570 Bug: 351806 Change-Id: I5e47810376419264ecf4247b5a333af5c8945080 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
Diffstat (limited to 'org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java90
1 files changed, 74 insertions, 16 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java
index c5a9552112..3ca861c06c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2010, Christian Halstrick <christian.halstrick@sap.com>
- * Copyright (C) 2010, Stefan Lay <stefan.lay@sap.com>
+ * Copyright (C) 2010-2012, Stefan Lay <stefan.lay@sap.com>
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
@@ -76,8 +76,10 @@ import org.eclipse.jgit.merge.MergeStrategy;
import org.eclipse.jgit.merge.Merger;
import org.eclipse.jgit.merge.ResolveMerger;
import org.eclipse.jgit.merge.ResolveMerger.MergeFailureReason;
+import org.eclipse.jgit.merge.SquashMessageFormatter;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.revwalk.RevWalkUtils;
import org.eclipse.jgit.treewalk.FileTreeIterator;
/**
@@ -95,6 +97,8 @@ public class MergeCommand extends GitCommand<MergeResult> {
private List<Ref> commits = new LinkedList<Ref>();
+ private boolean squash;
+
/**
* @param repo
*/
@@ -184,18 +188,41 @@ public class MergeCommand extends GitCommand<MergeResult> {
srcCommit.getTree());
dco.setFailOnConflict(true);
dco.checkout();
-
- updateHead(refLogMessage, srcCommit, headId);
+ String msg = null;
+ ObjectId newHead, base = null;
+ MergeStatus mergeStatus = null;
+ if (!squash) {
+ updateHead(refLogMessage, srcCommit, headId);
+ newHead = base = srcCommit;
+ mergeStatus = MergeStatus.FAST_FORWARD;
+ } else {
+ msg = JGitText.get().squashCommitNotUpdatingHEAD;
+ newHead = base = headId;
+ mergeStatus = MergeStatus.FAST_FORWARD_SQUASHED;
+ List<RevCommit> squashedCommits = RevWalkUtils.find(
+ revWalk, srcCommit, headCommit);
+ String squashMessage = new SquashMessageFormatter().format(
+ squashedCommits, head);
+ repo.writeSquashCommitMsg(squashMessage);
+ }
setCallable(false);
- return new MergeResult(srcCommit, srcCommit, new ObjectId[] {
- headCommit, srcCommit }, MergeStatus.FAST_FORWARD,
- mergeStrategy, null, null);
+ return new MergeResult(newHead, base, new ObjectId[] {
+ headCommit, srcCommit }, mergeStatus, mergeStrategy,
+ null, msg);
} else {
-
- String mergeMessage = new MergeMessageFormatter().format(
- commits, head);
- repo.writeMergeCommitMsg(mergeMessage);
- repo.writeMergeHeads(Arrays.asList(ref.getObjectId()));
+ String mergeMessage = "";
+ if (!squash) {
+ mergeMessage = new MergeMessageFormatter().format(
+ commits, head);
+ repo.writeMergeCommitMsg(mergeMessage);
+ repo.writeMergeHeads(Arrays.asList(ref.getObjectId()));
+ } else {
+ List<RevCommit> squashedCommits = RevWalkUtils.find(
+ revWalk, srcCommit, headCommit);
+ String squashMessage = new SquashMessageFormatter().format(
+ squashedCommits, head);
+ repo.writeSquashCommitMsg(squashMessage);
+ }
Merger merger = mergeStrategy.newMerger(repo);
boolean noProblems;
Map<String, org.eclipse.jgit.merge.MergeResult<?>> lowLevelResults = null;
@@ -223,12 +250,22 @@ public class MergeCommand extends GitCommand<MergeResult> {
dco.setFailOnConflict(true);
dco.checkout();
- RevCommit newHead = new Git(getRepository()).commit()
+ String msg = null;
+ RevCommit newHead = null;
+ MergeStatus mergeStatus = null;
+ if (!squash) {
+ newHead = new Git(getRepository()).commit()
.setReflogComment(refLogMessage.toString()).call();
- return new MergeResult(newHead.getId(),
- null, new ObjectId[] {
- headCommit.getId(), srcCommit.getId() },
- MergeStatus.MERGED, mergeStrategy, null, null);
+ mergeStatus = MergeStatus.MERGED;
+ } else {
+ msg = JGitText.get().squashCommitNotUpdatingHEAD;
+ newHead = headCommit;
+ mergeStatus = MergeStatus.MERGED_SQUASHED;
+ }
+ return new MergeResult(newHead.getId(), null,
+ new ObjectId[] { headCommit.getId(),
+ srcCommit.getId() }, mergeStatus,
+ mergeStrategy, null, msg);
} else {
if (failingPaths != null) {
repo.writeMergeCommitMsg(null);
@@ -334,4 +371,25 @@ public class MergeCommand extends GitCommand<MergeResult> {
return include(new ObjectIdRef.Unpeeled(Storage.LOOSE, name,
commit.copy()));
}
+
+ /**
+ * If <code>true</code>, will prepare the next commit in working tree and
+ * index as if a real merge happened, but do not make the commit or move the
+ * HEAD. Otherwise, perform the merge and commit the result.
+ * <p>
+ * In case the merge was successful but this flag was set to
+ * <code>true</code> a {@link MergeResult} with status
+ * {@link MergeStatus#MERGED_SQUASHED} or
+ * {@link MergeStatus#FAST_FORWARD_SQUASHED} is returned.
+ *
+ * @param squash
+ * whether to squash commits or not
+ * @return {@code this}
+ * @since 2.0
+ */
+ public MergeCommand setSquash(boolean squash) {
+ checkCallable();
+ this.squash = squash;
+ return this;
+ }
}