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>
This commit is contained in:
parent
82f47ace3d
commit
4409751516
|
@ -1,6 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2010, Christian Halstrick <christian.halstrick@sap.com>
|
* Copyright (C) 2010, Christian Halstrick <christian.halstrick@sap.com>
|
||||||
* Copyright (C) 2010-2014, Stefan Lay <stefan.lay@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.
|
* and other copyright owners as documented in the project's IP log.
|
||||||
*
|
*
|
||||||
* This program and the accompanying materials are made available
|
* This program and the accompanying materials are made available
|
||||||
|
@ -65,8 +66,10 @@
|
||||||
import org.eclipse.jgit.lib.AnyObjectId;
|
import org.eclipse.jgit.lib.AnyObjectId;
|
||||||
import org.eclipse.jgit.lib.Config.ConfigEnum;
|
import org.eclipse.jgit.lib.Config.ConfigEnum;
|
||||||
import org.eclipse.jgit.lib.Constants;
|
import org.eclipse.jgit.lib.Constants;
|
||||||
|
import org.eclipse.jgit.lib.NullProgressMonitor;
|
||||||
import org.eclipse.jgit.lib.ObjectId;
|
import org.eclipse.jgit.lib.ObjectId;
|
||||||
import org.eclipse.jgit.lib.ObjectIdRef;
|
import org.eclipse.jgit.lib.ObjectIdRef;
|
||||||
|
import org.eclipse.jgit.lib.ProgressMonitor;
|
||||||
import org.eclipse.jgit.lib.Ref;
|
import org.eclipse.jgit.lib.Ref;
|
||||||
import org.eclipse.jgit.lib.Ref.Storage;
|
import org.eclipse.jgit.lib.Ref.Storage;
|
||||||
import org.eclipse.jgit.lib.RefUpdate;
|
import org.eclipse.jgit.lib.RefUpdate;
|
||||||
|
@ -106,6 +109,8 @@ public class MergeCommand extends GitCommand<MergeResult> {
|
||||||
|
|
||||||
private String message;
|
private String message;
|
||||||
|
|
||||||
|
private ProgressMonitor monitor = NullProgressMonitor.INSTANCE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The modes available for fast forward merges corresponding to the
|
* The modes available for fast forward merges corresponding to the
|
||||||
* <code>--ff</code>, <code>--no-ff</code> and <code>--ff-only</code>
|
* <code>--ff</code>, <code>--no-ff</code> and <code>--ff-only</code>
|
||||||
|
@ -330,6 +335,7 @@ public MergeResult call() throws GitAPIException, NoHeadException,
|
||||||
repo.writeSquashCommitMsg(squashMessage);
|
repo.writeSquashCommitMsg(squashMessage);
|
||||||
}
|
}
|
||||||
Merger merger = mergeStrategy.newMerger(repo);
|
Merger merger = mergeStrategy.newMerger(repo);
|
||||||
|
merger.setProgressMonitor(monitor);
|
||||||
boolean noProblems;
|
boolean noProblems;
|
||||||
Map<String, org.eclipse.jgit.merge.MergeResult<?>> lowLevelResults = null;
|
Map<String, org.eclipse.jgit.merge.MergeResult<?>> lowLevelResults = null;
|
||||||
Map<String, MergeFailureReason> failingPaths = null;
|
Map<String, MergeFailureReason> failingPaths = null;
|
||||||
|
@ -586,4 +592,23 @@ public MergeCommand setMessage(String message) {
|
||||||
this.message = message;
|
this.message = message;
|
||||||
return this;
|
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, Christian Halstrick <christian.halstrick@sap.com>
|
||||||
* Copyright (C) 2010, Mathias Kinzler <mathias.kinzler@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.
|
* and other copyright owners as documented in the project's IP log.
|
||||||
*
|
*
|
||||||
* This program and the accompanying materials are made available
|
* This program and the accompanying materials are made available
|
||||||
|
@ -326,6 +327,7 @@ public PullResult call() throws GitAPIException,
|
||||||
MergeCommand merge = new MergeCommand(repo);
|
MergeCommand merge = new MergeCommand(repo);
|
||||||
merge.include(upstreamName, commitToMerge);
|
merge.include(upstreamName, commitToMerge);
|
||||||
merge.setStrategy(strategy);
|
merge.setStrategy(strategy);
|
||||||
|
merge.setProgressMonitor(monitor);
|
||||||
MergeResult mergeRes = merge.call();
|
MergeResult mergeRes = merge.call();
|
||||||
monitor.update(1);
|
monitor.update(1);
|
||||||
result = new PullResult(fetchRes, remote, mergeRes);
|
result = new PullResult(fetchRes, remote, mergeRes);
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2010, 2013 Mathias Kinzler <mathias.kinzler@sap.com>
|
* 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.
|
* and other copyright owners as documented in the project's IP log.
|
||||||
*
|
*
|
||||||
* This program and the accompanying materials are made available
|
* This program and the accompanying materials are made available
|
||||||
|
@ -611,6 +612,7 @@ private RebaseResult cherryPickCommitPreservingMerges(RevCommit commitToPick)
|
||||||
// their non-first parents rewritten
|
// their non-first parents rewritten
|
||||||
MergeCommand merge = git.merge()
|
MergeCommand merge = git.merge()
|
||||||
.setFastForward(MergeCommand.FastForwardMode.NO_FF)
|
.setFastForward(MergeCommand.FastForwardMode.NO_FF)
|
||||||
|
.setProgressMonitor(monitor)
|
||||||
.setCommit(false);
|
.setCommit(false);
|
||||||
for (int i = 1; i < commitToPick.getParentCount(); i++)
|
for (int i = 1; i < commitToPick.getParentCount(); i++)
|
||||||
merge.include(newParents.get(i));
|
merge.include(newParents.get(i));
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2011, GitHub Inc.
|
* 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.
|
* and other copyright owners as documented in the project's IP log.
|
||||||
*
|
*
|
||||||
* This program and the accompanying materials are made available
|
* This program and the accompanying materials are made available
|
||||||
|
@ -178,11 +179,13 @@ public Collection<String> call() throws InvalidConfigurationException,
|
||||||
if (ConfigConstants.CONFIG_KEY_MERGE.equals(update)) {
|
if (ConfigConstants.CONFIG_KEY_MERGE.equals(update)) {
|
||||||
MergeCommand merge = new MergeCommand(submoduleRepo);
|
MergeCommand merge = new MergeCommand(submoduleRepo);
|
||||||
merge.include(commit);
|
merge.include(commit);
|
||||||
|
merge.setProgressMonitor(monitor);
|
||||||
merge.setStrategy(strategy);
|
merge.setStrategy(strategy);
|
||||||
merge.call();
|
merge.call();
|
||||||
} else if (ConfigConstants.CONFIG_KEY_REBASE.equals(update)) {
|
} else if (ConfigConstants.CONFIG_KEY_REBASE.equals(update)) {
|
||||||
RebaseCommand rebase = new RebaseCommand(submoduleRepo);
|
RebaseCommand rebase = new RebaseCommand(submoduleRepo);
|
||||||
rebase.setUpstream(commit);
|
rebase.setUpstream(commit);
|
||||||
|
rebase.setProgressMonitor(monitor);
|
||||||
rebase.setStrategy(strategy);
|
rebase.setStrategy(strategy);
|
||||||
rebase.call();
|
rebase.call();
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2008-2013, Google Inc.
|
* 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.
|
* and other copyright owners as documented in the project's IP log.
|
||||||
*
|
*
|
||||||
* This program and the accompanying materials are made available
|
* This program and the accompanying materials are made available
|
||||||
|
@ -51,9 +52,11 @@
|
||||||
import org.eclipse.jgit.errors.NoMergeBaseException.MergeBaseFailureReason;
|
import org.eclipse.jgit.errors.NoMergeBaseException.MergeBaseFailureReason;
|
||||||
import org.eclipse.jgit.internal.JGitText;
|
import org.eclipse.jgit.internal.JGitText;
|
||||||
import org.eclipse.jgit.lib.AnyObjectId;
|
import org.eclipse.jgit.lib.AnyObjectId;
|
||||||
|
import org.eclipse.jgit.lib.NullProgressMonitor;
|
||||||
import org.eclipse.jgit.lib.ObjectId;
|
import org.eclipse.jgit.lib.ObjectId;
|
||||||
import org.eclipse.jgit.lib.ObjectInserter;
|
import org.eclipse.jgit.lib.ObjectInserter;
|
||||||
import org.eclipse.jgit.lib.ObjectReader;
|
import org.eclipse.jgit.lib.ObjectReader;
|
||||||
|
import org.eclipse.jgit.lib.ProgressMonitor;
|
||||||
import org.eclipse.jgit.lib.Repository;
|
import org.eclipse.jgit.lib.Repository;
|
||||||
import org.eclipse.jgit.revwalk.RevCommit;
|
import org.eclipse.jgit.revwalk.RevCommit;
|
||||||
import org.eclipse.jgit.revwalk.RevObject;
|
import org.eclipse.jgit.revwalk.RevObject;
|
||||||
|
@ -87,6 +90,13 @@ public abstract class Merger {
|
||||||
/** The trees matching every entry in {@link #sourceObjects}. */
|
/** The trees matching every entry in {@link #sourceObjects}. */
|
||||||
protected RevTree[] sourceTrees;
|
protected RevTree[] sourceTrees;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A progress monitor.
|
||||||
|
*
|
||||||
|
* @since 4.2
|
||||||
|
*/
|
||||||
|
protected ProgressMonitor monitor = NullProgressMonitor.INSTANCE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new merge instance for a repository.
|
* Create a new merge instance for a repository.
|
||||||
*
|
*
|
||||||
|
@ -290,4 +300,20 @@ protected AbstractTreeIterator openTree(final AnyObjectId treeId)
|
||||||
* @return resulting tree, if {@link #merge(AnyObjectId[])} returned true.
|
* @return resulting tree, if {@link #merge(AnyObjectId[])} returned true.
|
||||||
*/
|
*/
|
||||||
public abstract ObjectId getResultTreeId();
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue