From 44097515163f0be59775221b7fad6120452801c5 Mon Sep 17 00:00:00 2001 From: Laurent Delaigue Date: Wed, 13 Jan 2016 16:56:00 +0100 Subject: [PATCH] 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 Signed-off-by: Matthias Sohn --- .../org/eclipse/jgit/api/MergeCommand.java | 25 ++++++++++++++++++ .../src/org/eclipse/jgit/api/PullCommand.java | 2 ++ .../org/eclipse/jgit/api/RebaseCommand.java | 2 ++ .../jgit/api/SubmoduleUpdateCommand.java | 3 +++ .../src/org/eclipse/jgit/merge/Merger.java | 26 +++++++++++++++++++ 5 files changed, 58 insertions(+) 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 d2075a70f..bfe90a3a4 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 * Copyright (C) 2010-2014, Stefan Lay + * Copyright (C) 2016, Laurent Delaigue * 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 { private String message; + private ProgressMonitor monitor = NullProgressMonitor.INSTANCE; + /** * The modes available for fast forward merges corresponding to the * --ff, --no-ff and --ff-only @@ -330,6 +335,7 @@ public class MergeCommand extends GitCommand { repo.writeSquashCommitMsg(squashMessage); } Merger merger = mergeStrategy.newMerger(repo); + merger.setProgressMonitor(monitor); boolean noProblems; Map> lowLevelResults = null; Map failingPaths = null; @@ -586,4 +592,23 @@ public class MergeCommand extends GitCommand { this.message = message; return this; } + + /** + * The progress monitor associated with the diff operation. By default, this + * is set to NullProgressMonitor + * + * @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 2783edd5d..549ef6cf1 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 * Copyright (C) 2010, Mathias Kinzler + * Copyright (C) 2016, Laurent Delaigue * 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 { 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 e3e76c95f..643ec7a51 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 + * Copyright (C) 2016, Laurent Delaigue * 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 { // 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 e288d7755..342d7f42f 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 * 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 983bf5c91..bee2d0352 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 * 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; + } + } }