Monitoring progress of merges can be useful for users for large repositories or complex merge processes that take some time. This enables setting a monitor. Existing merge implementations in jgit do not yet report progress if a monitor is set. This will be added in a later change. Change-Id: I17b978b3fc91750dd88649638b90a46820a0877c Signed-off-by: Laurent Delaigue <laurent.delaigue@obeo.fr> Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>tags/v4.2.0.201601211800-r
@@ -1,6 +1,7 @@ | |||
/* | |||
* Copyright (C) 2010, Christian Halstrick <christian.halstrick@sap.com> | |||
* Copyright (C) 2010-2014, Stefan Lay <stefan.lay@sap.com> | |||
* Copyright (C) 2016, Laurent Delaigue <laurent.delaigue@obeo.fr> | |||
* and other copyright owners as documented in the project's IP log. | |||
* | |||
* This program and the accompanying materials are made available | |||
@@ -65,8 +66,10 @@ import org.eclipse.jgit.internal.JGitText; | |||
import org.eclipse.jgit.lib.AnyObjectId; | |||
import org.eclipse.jgit.lib.Config.ConfigEnum; | |||
import org.eclipse.jgit.lib.Constants; | |||
import org.eclipse.jgit.lib.NullProgressMonitor; | |||
import org.eclipse.jgit.lib.ObjectId; | |||
import org.eclipse.jgit.lib.ObjectIdRef; | |||
import org.eclipse.jgit.lib.ProgressMonitor; | |||
import org.eclipse.jgit.lib.Ref; | |||
import org.eclipse.jgit.lib.Ref.Storage; | |||
import org.eclipse.jgit.lib.RefUpdate; | |||
@@ -106,6 +109,8 @@ public class MergeCommand extends GitCommand<MergeResult> { | |||
private String message; | |||
private ProgressMonitor monitor = NullProgressMonitor.INSTANCE; | |||
/** | |||
* The modes available for fast forward merges corresponding to the | |||
* <code>--ff</code>, <code>--no-ff</code> and <code>--ff-only</code> | |||
@@ -330,6 +335,7 @@ public class MergeCommand extends GitCommand<MergeResult> { | |||
repo.writeSquashCommitMsg(squashMessage); | |||
} | |||
Merger merger = mergeStrategy.newMerger(repo); | |||
merger.setProgressMonitor(monitor); | |||
boolean noProblems; | |||
Map<String, org.eclipse.jgit.merge.MergeResult<?>> lowLevelResults = null; | |||
Map<String, MergeFailureReason> failingPaths = null; | |||
@@ -586,4 +592,23 @@ public class MergeCommand extends GitCommand<MergeResult> { | |||
this.message = message; | |||
return this; | |||
} | |||
/** | |||
* The progress monitor associated with the diff operation. By default, this | |||
* is set to <code>NullProgressMonitor</code> | |||
* | |||
* @see NullProgressMonitor | |||
* | |||
* @param monitor | |||
* A progress monitor | |||
* @return this instance | |||
* @since 4.2 | |||
*/ | |||
public MergeCommand setProgressMonitor(ProgressMonitor monitor) { | |||
if (monitor == null) { | |||
monitor = NullProgressMonitor.INSTANCE; | |||
} | |||
this.monitor = monitor; | |||
return this; | |||
} | |||
} |
@@ -1,6 +1,7 @@ | |||
/* | |||
* Copyright (C) 2010, Christian Halstrick <christian.halstrick@sap.com> | |||
* Copyright (C) 2010, Mathias Kinzler <mathias.kinzler@sap.com> | |||
* Copyright (C) 2016, Laurent Delaigue <laurent.delaigue@obeo.fr> | |||
* and other copyright owners as documented in the project's IP log. | |||
* | |||
* This program and the accompanying materials are made available | |||
@@ -326,6 +327,7 @@ public class PullCommand extends TransportCommand<PullCommand, PullResult> { | |||
MergeCommand merge = new MergeCommand(repo); | |||
merge.include(upstreamName, commitToMerge); | |||
merge.setStrategy(strategy); | |||
merge.setProgressMonitor(monitor); | |||
MergeResult mergeRes = merge.call(); | |||
monitor.update(1); | |||
result = new PullResult(fetchRes, remote, mergeRes); |
@@ -1,5 +1,6 @@ | |||
/* | |||
* Copyright (C) 2010, 2013 Mathias Kinzler <mathias.kinzler@sap.com> | |||
* Copyright (C) 2016, Laurent Delaigue <laurent.delaigue@obeo.fr> | |||
* and other copyright owners as documented in the project's IP log. | |||
* | |||
* This program and the accompanying materials are made available | |||
@@ -611,6 +612,7 @@ public class RebaseCommand extends GitCommand<RebaseResult> { | |||
// their non-first parents rewritten | |||
MergeCommand merge = git.merge() | |||
.setFastForward(MergeCommand.FastForwardMode.NO_FF) | |||
.setProgressMonitor(monitor) | |||
.setCommit(false); | |||
for (int i = 1; i < commitToPick.getParentCount(); i++) | |||
merge.include(newParents.get(i)); |
@@ -1,5 +1,6 @@ | |||
/* | |||
* Copyright (C) 2011, GitHub Inc. | |||
* Copyright (C) 2016, Laurent Delaigue <laurent.delaigue@obeo.fr> | |||
* and other copyright owners as documented in the project's IP log. | |||
* | |||
* This program and the accompanying materials are made available | |||
@@ -178,11 +179,13 @@ public class SubmoduleUpdateCommand extends | |||
if (ConfigConstants.CONFIG_KEY_MERGE.equals(update)) { | |||
MergeCommand merge = new MergeCommand(submoduleRepo); | |||
merge.include(commit); | |||
merge.setProgressMonitor(monitor); | |||
merge.setStrategy(strategy); | |||
merge.call(); | |||
} else if (ConfigConstants.CONFIG_KEY_REBASE.equals(update)) { | |||
RebaseCommand rebase = new RebaseCommand(submoduleRepo); | |||
rebase.setUpstream(commit); | |||
rebase.setProgressMonitor(monitor); | |||
rebase.setStrategy(strategy); | |||
rebase.call(); | |||
} else { |
@@ -1,5 +1,6 @@ | |||
/* | |||
* Copyright (C) 2008-2013, Google Inc. | |||
* Copyright (C) 2016, Laurent Delaigue <laurent.delaigue@obeo.fr> | |||
* and other copyright owners as documented in the project's IP log. | |||
* | |||
* This program and the accompanying materials are made available | |||
@@ -51,9 +52,11 @@ import org.eclipse.jgit.errors.NoMergeBaseException; | |||
import org.eclipse.jgit.errors.NoMergeBaseException.MergeBaseFailureReason; | |||
import org.eclipse.jgit.internal.JGitText; | |||
import org.eclipse.jgit.lib.AnyObjectId; | |||
import org.eclipse.jgit.lib.NullProgressMonitor; | |||
import org.eclipse.jgit.lib.ObjectId; | |||
import org.eclipse.jgit.lib.ObjectInserter; | |||
import org.eclipse.jgit.lib.ObjectReader; | |||
import org.eclipse.jgit.lib.ProgressMonitor; | |||
import org.eclipse.jgit.lib.Repository; | |||
import org.eclipse.jgit.revwalk.RevCommit; | |||
import org.eclipse.jgit.revwalk.RevObject; | |||
@@ -87,6 +90,13 @@ public abstract class Merger { | |||
/** The trees matching every entry in {@link #sourceObjects}. */ | |||
protected RevTree[] sourceTrees; | |||
/** | |||
* A progress monitor. | |||
* | |||
* @since 4.2 | |||
*/ | |||
protected ProgressMonitor monitor = NullProgressMonitor.INSTANCE; | |||
/** | |||
* Create a new merge instance for a repository. | |||
* | |||
@@ -290,4 +300,20 @@ public abstract class Merger { | |||
* @return resulting tree, if {@link #merge(AnyObjectId[])} returned true. | |||
*/ | |||
public abstract ObjectId getResultTreeId(); | |||
/** | |||
* Set a progress monitor. | |||
* | |||
* @param monitor | |||
* Monitor to use, can be null to indicate no progress reporting | |||
* is desired. | |||
* @since 4.2 | |||
*/ | |||
public void setProgressMonitor(ProgressMonitor monitor) { | |||
if (monitor == null) { | |||
this.monitor = NullProgressMonitor.INSTANCE; | |||
} else { | |||
this.monitor = monitor; | |||
} | |||
} | |||
} |