diff options
author | Laurent Delaigue <laurent.delaigue@obeo.fr> | 2016-01-13 16:56:00 +0100 |
---|---|---|
committer | Matthias Sohn <matthias.sohn@sap.com> | 2016-01-21 11:37:26 +0100 |
commit | 1e1fb9fc596603a44b0fff6d19eeba2b005d659d (patch) | |
tree | 283f76b1bff65d98e7ed372f6b4d6ae4d11175a4 | |
parent | 17e6d8d42b6266c8644da805b7b698bf21a54393 (diff) | |
download | jgit-1e1fb9fc596603a44b0fff6d19eeba2b005d659d.tar.gz jgit-1e1fb9fc596603a44b0fff6d19eeba2b005d659d.zip |
Add progress monitor to Merger
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>
5 files changed, 58 insertions, 0 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 d2075a70f2..bfe90a3a4f 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,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; + } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java index 2783edd5d8..549ef6cf13 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java @@ -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); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java index e3e76c95f4..643ec7a51f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java @@ -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)); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleUpdateCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleUpdateCommand.java index e288d7755b..342d7f42f3 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleUpdateCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleUpdateCommand.java @@ -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 { diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/Merger.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/Merger.java index 983bf5c91c..bee2d03523 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/Merger.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/Merger.java @@ -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; @@ -88,6 +91,13 @@ public abstract class Merger { protected RevTree[] sourceTrees; /** + * A progress monitor. + * + * @since 4.2 + */ + protected ProgressMonitor monitor = NullProgressMonitor.INSTANCE; + + /** * Create a new merge instance for a repository. * * @param local @@ -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; + } + } } |