Преглед на файлове

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>
tags/v4.2.0.201601211800-r
Laurent Delaigue преди 8 години
родител
ревизия
4409751516

+ 25
- 0
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;
}
}

+ 2
- 0
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);

+ 2
- 0
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));

+ 3
- 0
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 {

+ 26
- 0
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;
@@ -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;
}
}
}

Loading…
Отказ
Запис