Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Delaigue2015-08-26 14:39:05 +0000
committerMatthias Sohn2015-08-30 21:24:13 +0000
commit99cdec0cd3cce94f4ceb69364c715dfa81ee0edb (patch)
tree5fd22f25b4c9c4d787f0bfd05cb48ee6563f77c3 /org.eclipse.egit.core/src/org/eclipse/egit/core
parent3a6a38c067ef807fe3898367c891029cf3611e17 (diff)
downloadegit-99cdec0cd3cce94f4ceb69364c715dfa81ee0edb.tar.gz
egit-99cdec0cd3cce94f4ceb69364c715dfa81ee0edb.tar.xz
egit-99cdec0cd3cce94f4ceb69364c715dfa81ee0edb.zip
Introduce a mergeStrategy extension point.
The new extension point can be used to implement and register custom merge strategies which can be used by EGit operations that require merge (merge, rebase, pull, revert, squash, stash, submodule update). Add a preference page to allow selection of the preferred merge strategy. Make sure that relevant operations use the preferred strategy. Bug: 418151 Change-Id: I4d455ce171cca13c780e72b8d27dd929b28c6b71 Signed-off-by: Laurent Delaigue <laurent.delaigue@obeo.fr> Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
Diffstat (limited to 'org.eclipse.egit.core/src/org/eclipse/egit/core')
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/Activator.java240
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/GitCorePreferences.java8
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/internal/CoreText.java18
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/internal/coretext.properties8
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/op/CherryPickOperation.java10
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/op/MergeOperation.java40
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/op/PullOperation.java9
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/op/RebaseOperation.java11
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/op/RevertCommitOperation.java10
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/op/SquashCommitsOperation.java16
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/op/StashApplyOperation.java16
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/op/SubmoduleUpdateOperation.java10
12 files changed, 370 insertions, 26 deletions
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/Activator.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/Activator.java
index 390ac94edb..dcde1abd33 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/Activator.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/Activator.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (C) 2008, 2013 Shawn O. Pearce <spearce@spearce.org> and others.
+ * Copyright (C) 2008, 2015 Shawn O. Pearce <spearce@spearce.org> and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -11,9 +11,11 @@ import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.Collection;
+import java.util.Collections;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.Hashtable;
+import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
@@ -26,11 +28,17 @@ import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IRegistryEventListener;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
@@ -50,9 +58,11 @@ import org.eclipse.egit.core.project.RepositoryMapping;
import org.eclipse.egit.core.securestorage.EGitSecureStore;
import org.eclipse.equinox.security.storage.SecurePreferencesFactory;
import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.merge.MergeStrategy;
import org.eclipse.jgit.util.FS;
import org.eclipse.osgi.service.debug.DebugOptions;
import org.eclipse.osgi.service.debug.DebugOptionsListener;
+import org.eclipse.osgi.util.NLS;
import org.eclipse.team.core.RepositoryProvider;
import org.osgi.framework.BundleContext;
@@ -70,6 +80,7 @@ public class Activator extends Plugin implements DebugOptionsListener {
private AutoShareProjects shareGitProjectsJob;
private IResourceChangeListener preDeleteProjectListener;
private IgnoreDerivedResources ignoreDerivedResourcesListener;
+ private MergeStrategyRegistryListener mergeStrategyRegistryListener;
/**
* @return the singleton {@link Activator}
@@ -179,6 +190,7 @@ public class Activator extends Plugin implements DebugOptionsListener {
registerAutoShareProjects();
registerAutoIgnoreDerivedResources();
registerPreDeleteResourceChangeListener();
+ registerMergeStrategyRegistryListener();
}
private void registerPreDeleteResourceChangeListener() {
@@ -223,7 +235,51 @@ public class Activator extends Plugin implements DebugOptionsListener {
}
/**
- * @return cache for Repository objects
+ * Provides the 3-way merge strategy to use according to the user's
+ * preferences. The preferred merge strategy is JGit's default merge
+ * strategy unless the user has explicitly chosen a different strategy among
+ * the registered strategies.
+ *
+ * @return The MergeStrategy to use, can be {@code null}, in which case the
+ * default merge strategy should be used as defined by JGit.
+ * @since 4.1
+ */
+ public MergeStrategy getPreferredMergeStrategy() {
+ final IEclipsePreferences prefs = InstanceScope.INSTANCE
+ .getNode(Activator.getPluginId());
+ String preferredMergeStrategyKey = prefs.get(
+ GitCorePreferences.core_preferredMergeStrategy, null);
+ if (preferredMergeStrategyKey != null
+ && !preferredMergeStrategyKey.isEmpty()) {
+ MergeStrategy result = MergeStrategy.get(preferredMergeStrategyKey);
+ if (result != null) {
+ return result;
+ }
+ logError(NLS.bind(CoreText.Activator_invalidPreferredMergeStrategy,
+ preferredMergeStrategyKey), null);
+ }
+ return null;
+ }
+
+ /**
+ * @return Provides a read-only view of the registered MergeStrategies
+ * available.
+ * @since 4.1
+ */
+ public Collection<MergeStrategyDescriptor> getRegisteredMergeStrategies() {
+ return mergeStrategyRegistryListener.getStrategies();
+ }
+
+ private void registerMergeStrategyRegistryListener() {
+ mergeStrategyRegistryListener = new MergeStrategyRegistryListener(
+ Platform.getExtensionRegistry());
+ Platform.getExtensionRegistry().addListener(
+ mergeStrategyRegistryListener,
+ "org.eclipse.egit.core.mergeStrategy"); //$NON-NLS-1$
+ }
+
+ /**
+ * @return cache for Repository objects
*/
public RepositoryCache getRepositoryCache() {
return repositoryCache;
@@ -543,4 +599,184 @@ public class Activator extends Plugin implements DebugOptionsListener {
}
}
}
+
+ /**
+ * Describes a MergeStrategy which can be registered with the mergeStrategy
+ * extension point.
+ *
+ * @since 4.1
+ */
+ public static class MergeStrategyDescriptor {
+ private final String name;
+
+ private final String label;
+
+ private final Class<?> implementedBy;
+
+ /**
+ * @param name
+ * The referred strategy's name, to use for retrieving the
+ * strategy from MergeRegistry via
+ * {@link MergeStrategy#get(String)}
+ * @param label
+ * The label to display to users so they can select the
+ * strategy they need
+ * @param implementedBy
+ * The class of the MergeStrategy registered through the
+ * mergeStrategy extension point
+ */
+ public MergeStrategyDescriptor(String name, String label,
+ Class<?> implementedBy) {
+ this.name = name;
+ this.label = label;
+ this.implementedBy = implementedBy;
+ }
+
+ /**
+ * @return The actual strategy's name, which can be used to retrieve
+ * that actual strategy via {@link MergeStrategy#get(String)}.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return The strategy label, for display purposes.
+ */
+ public String getLabel() {
+ return label;
+ }
+
+ /**
+ * @return The class of the MergeStrategy registered through the
+ * mergeStrategy extension point.
+ */
+ public Class<?> getImplementedBy() {
+ return implementedBy;
+ }
+ }
+
+ private static class MergeStrategyRegistryListener implements
+ IRegistryEventListener {
+
+ private Map<String, MergeStrategyDescriptor> strategies;
+
+ private MergeStrategyRegistryListener(IExtensionRegistry registry) {
+ strategies = new LinkedHashMap<>();
+ IConfigurationElement[] elements = registry
+ .getConfigurationElementsFor("org.eclipse.egit.core.mergeStrategy"); //$NON-NLS-1$
+ loadMergeStrategies(elements);
+ }
+
+ private Collection<MergeStrategyDescriptor> getStrategies() {
+ return Collections.unmodifiableCollection(strategies.values());
+ }
+
+ @Override
+ public void added(IExtension[] extensions) {
+ for (IExtension extension : extensions) {
+ loadMergeStrategies(extension.getConfigurationElements());
+ }
+ }
+
+ @Override
+ public void added(IExtensionPoint[] extensionPoints) {
+ // Nothing to do here
+ }
+
+ @Override
+ public void removed(IExtension[] extensions) {
+ for (IExtension extension : extensions) {
+ for (IConfigurationElement element : extension
+ .getConfigurationElements()) {
+ try {
+ Object ext = element.createExecutableExtension("class"); //$NON-NLS-1$
+ if (ext instanceof MergeStrategy) {
+ MergeStrategy strategy = (MergeStrategy) ext;
+ strategies.remove(strategy.getName());
+ }
+ } catch (CoreException e) {
+ Activator.logError(CoreText.MergeStrategy_UnloadError,
+ e);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void removed(IExtensionPoint[] extensionPoints) {
+ // Nothing to do here
+ }
+
+ private void loadMergeStrategies(IConfigurationElement[] elements) {
+ for (IConfigurationElement element : elements) {
+ try {
+ Object ext = element.createExecutableExtension("class"); //$NON-NLS-1$
+ if (ext instanceof MergeStrategy) {
+ MergeStrategy strategy = (MergeStrategy) ext;
+ String name = element.getAttribute("name"); //$NON-NLS-1$
+ if (name == null || name.isEmpty()) {
+ name = strategy.getName();
+ }
+ if (canRegister(name, strategy)) {
+ if (MergeStrategy.get(name) == null) {
+ MergeStrategy.register(name, strategy);
+ }
+ strategies
+ .put(name,
+ new MergeStrategyDescriptor(
+ name,
+ element.getAttribute("label"), //$NON-NLS-1$
+ strategy.getClass()));
+ }
+ }
+ } catch (CoreException e) {
+ Activator.logError(CoreText.MergeStrategy_LoadError, e);
+ }
+ }
+ }
+
+ /**
+ * Checks whether it's possible to register the provided strategy with
+ * the given name
+ *
+ * @param name
+ * Name to use to register the strategy
+ * @param strategy
+ * Strategy to register
+ * @return <code>true</code> if the name is neither null nor empty, no
+ * other strategy is already register for the same name, and the
+ * name is not one of the core JGit strategies. If the given
+ * name is that of a core JGit strategy, the method will return
+ * <code>true</code> only if the strategy is the matching JGit
+ * strategy for that name.
+ */
+ private boolean canRegister(String name, MergeStrategy strategy) {
+ boolean result = true;
+ if (name == null || name.isEmpty()) {
+ // name is mandatory
+ Activator.logError(
+ NLS.bind(CoreText.MergeStrategy_MissingName,
+ strategy.getClass()), null);
+ result = false;
+ } else if (strategies.containsKey(name)) {
+ // Other strategy already registered for this name
+ Activator.logError(NLS.bind(
+ CoreText.MergeStrategy_DuplicateName, new Object[] {
+ name, strategies.get(name).getImplementedBy(),
+ strategy.getClass() }), null);
+ result = false;
+ } else if (MergeStrategy.get(name) != null
+ && MergeStrategy.get(name) != strategy) {
+ // The name is reserved by a core JGit strategy, and the
+ // provided instance is not that of JGit
+ Activator.logError(NLS.bind(
+ CoreText.MergeStrategy_ReservedName, new Object[] {
+ name, MergeStrategy.get(name).getClass(),
+ strategy.getClass() }), null);
+ result = false;
+ }
+ return result;
+ }
+ }
}
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/GitCorePreferences.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/GitCorePreferences.java
index a371054600..d9cc15f4c0 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/GitCorePreferences.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/GitCorePreferences.java
@@ -2,6 +2,7 @@
* Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
* Copyright (C) 2011, Robin Rosenberg
* Copyright (C) 2013, Matthias Sohn <matthias.sohn@sap.com>
+ * Copyright (C) 2015, Obeo
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
@@ -41,4 +42,11 @@ public class GitCorePreferences {
*/
public static final String core_defaultRepositoryDir =
"core_defaultRepositoryDir"; //$NON-NLS-1$
+
+ /**
+ * Holds the key to the preferred merge strategy in the MergeStrategy
+ * registry, i.e. the preferred strategy can be obtained by
+ * {@code MergeStrategy.get(key)}.
+ */
+ public static final String core_preferredMergeStrategy = "core_preferredMergeStrategy"; //$NON-NLS-1$
}
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/CoreText.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/CoreText.java
index 2d3c0f6b97..0d84b07d50 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/CoreText.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/CoreText.java
@@ -29,6 +29,9 @@ public class CoreText extends NLS {
private static final String BUNDLE_NAME = "org.eclipse.egit.core.internal.coretext"; //$NON-NLS-1$
/** */
+ public static String Activator_invalidPreferredMergeStrategy;
+
+ /** */
public static String Activator_autoIgnoreDerivedResources;
/** */
@@ -227,6 +230,21 @@ public class CoreText extends NLS {
public static String MergeOperation_ProgressMerge;
/** */
+ public static String MergeStrategy_MissingName;
+
+ /** */
+ public static String MergeStrategy_DuplicateName;
+
+ /** */
+ public static String MergeStrategy_ReservedName;
+
+ /** */
+ public static String MergeStrategy_LoadError;
+
+ /** */
+ public static String MergeStrategy_UnloadError;
+
+ /** */
public static String MoveDeleteHook_cannotModifyFolder;
/** */
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/coretext.properties b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/coretext.properties
index ec8f16e3a7..fd05d7571f 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/coretext.properties
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/coretext.properties
@@ -10,6 +10,8 @@
# Daniel Megert <daniel_megert@ch.ibm.com> - Escaped single quotes where needed
###############################################################################
+Activator_invalidPreferredMergeStrategy=The configuration of the preferred merge strategy is invalid. It refers to a merge strategy called "{0}" which is not registered. The default recursive strategy will be used instead.
+
CherryPickOperation_cherryPicking=Running cherry-pick on commit {0}
CommitFileRevision_pathNotIn=Path {1} not in commit {0}.
CommitFileRevision_errorLookingUpPath=IO error looking up path {1} in {0}.
@@ -172,3 +174,9 @@ GitRemoteFolder_fetchingMembers=Fetching members of {0}
GitURI_InvalidSCMURL=Invalid SCM URL {0}
GitURI_InvalidURI=Invalid uri {0}: {1}
SquashCommitsOperation_squashing=Squashing {0} commits
+
+MergeStrategy_UnloadError=An error occurred while unregistering a merge strategy
+MergeStrategy_LoadError=An error occurred while trying to instantiate a registered merge strategy
+MergeStrategy_MissingName=A merge strategy must have a name. The unnamed strategy implemented by class {1} will be ignored
+MergeStrategy_DuplicateName=Another merge strategy is already registered by class {1} with the same name {0}. The strategy {0} implemented by class {2} will be ignored
+MergeStrategy_ReservedName=The strategy name {0} is reserved by JGit for class {1}. The strategy implemented by class {2} will be ignored
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/CherryPickOperation.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/CherryPickOperation.java
index 8f9592a51a..d70a882430 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/CherryPickOperation.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/CherryPickOperation.java
@@ -1,5 +1,5 @@
/******************************************************************************
- * Copyright (c) 2011 GitHub Inc.
+ * Copyright (c) 2011, 2015 GitHub Inc and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
*
* Contributors:
* Kevin Sawicki (GitHub Inc.) - initial API and implementation
+ * Laurent Delaigue (Obeo) - use of preferred merge strategy
*****************************************************************************/
package org.eclipse.egit.core.op;
@@ -20,6 +21,7 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.egit.core.Activator;
import org.eclipse.egit.core.internal.CoreText;
import org.eclipse.egit.core.internal.job.RuleUtil;
import org.eclipse.egit.core.internal.util.ProjectUtil;
@@ -28,6 +30,7 @@ import org.eclipse.jgit.api.CherryPickResult;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.merge.MergeStrategy;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.team.core.TeamException;
@@ -72,6 +75,11 @@ public class CherryPickOperation implements IEGitOperation {
commit.name()));
CherryPickCommand command = new Git(repo).cherryPick().include(
commit.getId());
+ MergeStrategy strategy = Activator.getDefault()
+ .getPreferredMergeStrategy();
+ if (strategy != null) {
+ command.setStrategy(strategy);
+ }
try {
result = command.call();
} catch (GitAPIException e) {
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/MergeOperation.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/MergeOperation.java
index 87e0b2f016..310bb2f285 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/MergeOperation.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/MergeOperation.java
@@ -2,6 +2,7 @@
* Copyright (c) 2010, 2014 SAP AG and others.
* Copyright (C) 2012, 2013 Tomasz Zarna <tzarna@gmail.com>
* Copyright (C) 2014 Axel Richard <axel.richard@obeo.fr>
+ * Copyright (C) 2015 Obeo
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
@@ -12,6 +13,7 @@
* Stefan Lay (SAP AG) - initial implementation
* Tomasz Zarna (IBM) - merge squash, bug 382720
* Axel Richard (Obeo) - merge message, bug 422886
+ * Laurent Delaigue (Obeo) - use of preferred merge strategy
*******************************************************************************/
package org.eclipse.egit.core.op;
@@ -32,6 +34,7 @@ import org.eclipse.egit.core.Activator;
import org.eclipse.egit.core.internal.CoreText;
import org.eclipse.egit.core.internal.job.RuleUtil;
import org.eclipse.egit.core.internal.util.ProjectUtil;
+import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.MergeCommand;
import org.eclipse.jgit.api.MergeCommand.FastForwardMode;
@@ -57,7 +60,7 @@ public class MergeOperation implements IEGitOperation {
private final String refName;
- private MergeStrategy mergeStrategy;
+ private final MergeStrategy mergeStrategy;
private Boolean squash;
@@ -70,26 +73,39 @@ public class MergeOperation implements IEGitOperation {
private String message;
/**
+ * Create a MergeOperation object. Initializes the MergeStrategy with the
+ * preferred merge strategy, according to preferences.
+ *
* @param repository
- * @param refName name of a commit which should be merged
+ * @param refName
+ * name of a commit which should be merged
*/
- public MergeOperation(Repository repository, String refName) {
+ public MergeOperation(@NonNull Repository repository,
+ @NonNull String refName) {
this.repository = repository;
this.refName = refName;
+ this.mergeStrategy = Activator.getDefault().getPreferredMergeStrategy();
}
/**
- * Create a MergeOperation object
- * @param repository
- * @param refName name of a commit which should be merged
- * @param mergeStrategy the strategy to use for merge
- */
- public MergeOperation(Repository repository, String refName,
- String mergeStrategy) {
+ * Create a MergeOperation object
+ *
+ * @param repository
+ * @param refName
+ * name of a commit which should be merged
+ * @param mergeStrategyName
+ * the strategy to use for merge. If not registered, the default
+ * merge strategy according to preferences will be used.
+ */
+ public MergeOperation(@NonNull Repository repository,
+ @NonNull String refName,
+ @NonNull String mergeStrategyName) {
this.repository = repository;
this.refName = refName;
- if (mergeStrategy != null)
- this.mergeStrategy = MergeStrategy.get(mergeStrategy);
+ MergeStrategy strategy = null;
+ strategy = MergeStrategy.get(mergeStrategyName);
+ this.mergeStrategy = strategy != null ? strategy : Activator.getDefault()
+ .getPreferredMergeStrategy();
}
/**
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/PullOperation.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/PullOperation.java
index 66107d074e..e1a9caf7a6 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/PullOperation.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/PullOperation.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010 SAP AG.
+ * Copyright (c) 2010, 2015 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
*
* Contributors:
* Mathias Kinzler <mathias.kinzler@sap.com> - initial implementation
+ * Laurent Delaigue (Obeo) - use of preferred merge strategy
*******************************************************************************/
package org.eclipse.egit.core.op;
@@ -42,6 +43,7 @@ import org.eclipse.jgit.api.errors.InvalidConfigurationException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.errors.TransportException;
import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.merge.MergeStrategy;
import org.eclipse.jgit.transport.CredentialsProvider;
import org.eclipse.osgi.util.NLS;
@@ -94,6 +96,11 @@ public class PullOperation implements IEGitOperation {
new SubProgressMonitor(mymonitor, 1)));
pull.setTimeout(timeout);
pull.setCredentialsProvider(credentialsProvider);
+ MergeStrategy strategy = Activator.getDefault()
+ .getPreferredMergeStrategy();
+ if (strategy != null) {
+ pull.setStrategy(strategy);
+ }
pullResult = pull.call();
results.put(repository, pullResult);
} catch (DetachedHeadException e) {
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/RebaseOperation.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/RebaseOperation.java
index 83f1d2b1ee..9167d7032a 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/RebaseOperation.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/RebaseOperation.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2013 SAP AG.
+ * Copyright (c) 2010, 2015 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
*
* Contributors:
* Mathias Kinzler <mathias.kinzler@sap.com> - initial implementation
+ * Laurent Delaigue (Obeo) - use of preferred merge strategy
*******************************************************************************/
package org.eclipse.egit.core.op;
@@ -28,15 +29,16 @@ import org.eclipse.egit.core.internal.job.RuleUtil;
import org.eclipse.egit.core.internal.util.ProjectUtil;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.RebaseCommand;
-import org.eclipse.jgit.api.RebaseResult;
import org.eclipse.jgit.api.RebaseCommand.InteractiveHandler;
import org.eclipse.jgit.api.RebaseCommand.Operation;
+import org.eclipse.jgit.api.RebaseResult;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.NoHeadException;
import org.eclipse.jgit.api.errors.RefNotFoundException;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.merge.MergeStrategy;
/**
* This class implements rebase.
@@ -139,6 +141,11 @@ public class RebaseOperation implements IEGitOperation {
RebaseCommand cmd = new Git(repository).rebase()
.setProgressMonitor(
new EclipseGitProgressTransformer(actMonitor));
+ MergeStrategy strategy = Activator.getDefault()
+ .getPreferredMergeStrategy();
+ if (strategy != null) {
+ cmd.setStrategy(strategy);
+ }
try {
if (handler != null)
cmd.runInteractively(handler, true);
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/RevertCommitOperation.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/RevertCommitOperation.java
index 82ff9bbb4a..1646468833 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/RevertCommitOperation.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/RevertCommitOperation.java
@@ -1,5 +1,5 @@
/******************************************************************************
- * Copyright (c) 2011 GitHub Inc.
+ * Copyright (c) 2011, 2015 GitHub Inc and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
*
* Contributors:
* Kevin Sawicki (GitHub Inc.) - initial API and implementation
+ * Laurent Delaigue (Obeo) - use of preferred merge strategy
*****************************************************************************/
package org.eclipse.egit.core.op;
@@ -21,6 +22,7 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.egit.core.Activator;
import org.eclipse.egit.core.internal.CoreText;
import org.eclipse.egit.core.internal.job.RuleUtil;
import org.eclipse.egit.core.internal.util.ProjectUtil;
@@ -30,6 +32,7 @@ import org.eclipse.jgit.api.RevertCommand;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.merge.MergeStrategy;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.team.core.TeamException;
@@ -85,6 +88,11 @@ public class RevertCommitOperation implements IEGitOperation {
CoreText.RevertCommitOperation_reverting,
Integer.valueOf(commits.size())));
RevertCommand command = new Git(repo).revert();
+ MergeStrategy strategy = Activator.getDefault()
+ .getPreferredMergeStrategy();
+ if (strategy != null) {
+ command.setStrategy(strategy);
+ }
for (RevCommit commit : commits)
command.include(commit);
try {
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/SquashCommitsOperation.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/SquashCommitsOperation.java
index 629b0bd246..5627b61c09 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/SquashCommitsOperation.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/SquashCommitsOperation.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2014 Maik Schreiber
+ * Copyright (c) 2014, 2015 Maik Schreiber and others
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
@@ -8,6 +8,7 @@
*
* Contributors:
* Maik Schreiber - initial implementation
+ * Laurent Delaigue (Obeo) - use of preferred merge strategy
*******************************************************************************/
package org.eclipse.egit.core.op;
@@ -22,6 +23,7 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.egit.core.Activator;
import org.eclipse.egit.core.CommitUtil;
import org.eclipse.egit.core.internal.CoreText;
import org.eclipse.egit.core.internal.job.RuleUtil;
@@ -34,6 +36,7 @@ import org.eclipse.jgit.errors.IllegalTodoFileModification;
import org.eclipse.jgit.lib.AbbreviatedObjectId;
import org.eclipse.jgit.lib.RebaseTodoLine;
import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.merge.MergeStrategy;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.team.core.TeamException;
@@ -105,9 +108,16 @@ public class SquashCommitsOperation implements IEGitOperation {
};
try {
Git git = new Git(repository);
- git.rebase().setUpstream(commits.get(0).getParent(0))
+ RebaseCommand command = git.rebase()
+ .setUpstream(commits.get(0).getParent(0))
.runInteractively(handler)
- .setOperation(RebaseCommand.Operation.BEGIN).call();
+ .setOperation(RebaseCommand.Operation.BEGIN);
+ MergeStrategy strategy = Activator.getDefault()
+ .getPreferredMergeStrategy();
+ if (strategy != null) {
+ command.setStrategy(strategy);
+ }
+ command.call();
} catch (GitAPIException e) {
throw new TeamException(e.getLocalizedMessage(),
e.getCause());
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/StashApplyOperation.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/StashApplyOperation.java
index 3ff955a76d..2ead600961 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/StashApplyOperation.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/StashApplyOperation.java
@@ -1,5 +1,5 @@
/******************************************************************************
- * Copyright (c) 2012 GitHub Inc.
+ * Copyright (c) 2012, 2015 GitHub Inc and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
*
* Contributors:
* Kevin Sawicki (GitHub Inc.) - initial API and implementation
+ * Laurent Delaigue (Obeo) - use of preferred merge strategy
*****************************************************************************/
package org.eclipse.egit.core.op;
@@ -19,12 +20,15 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.egit.core.Activator;
import org.eclipse.egit.core.internal.job.RuleUtil;
import org.eclipse.egit.core.internal.util.ProjectUtil;
import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.StashApplyCommand;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.merge.MergeStrategy;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.team.core.TeamException;
@@ -58,8 +62,14 @@ public class StashApplyOperation implements IEGitOperation {
IProject[] validProjects = ProjectUtil
.getValidOpenProjects(repository);
pm.worked(1);
- Git.wrap(repository).stashApply()
- .setStashRef(commit.name()).call();
+ StashApplyCommand command = Git.wrap(repository)
+ .stashApply().setStashRef(commit.name());
+ MergeStrategy strategy = Activator.getDefault()
+ .getPreferredMergeStrategy();
+ if (strategy != null) {
+ command.setStrategy(strategy);
+ }
+ command.call();
pm.worked(1);
ProjectUtil.refreshValidProjects(validProjects,
new SubProgressMonitor(pm, 1));
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/SubmoduleUpdateOperation.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/SubmoduleUpdateOperation.java
index 067a6c8d4c..54575ab739 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/SubmoduleUpdateOperation.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/SubmoduleUpdateOperation.java
@@ -1,5 +1,5 @@
/******************************************************************************
- * Copyright (c) 2012 GitHub Inc.
+ * Copyright (c) 2012, 2015 GitHub Inc and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
*
* Contributors:
* Kevin Sawicki (GitHub Inc.) - initial API and implementation
+ * Laurent Delaigue (Obeo) - use of preferred merge strategy
*****************************************************************************/
package org.eclipse.egit.core.op;
@@ -22,6 +23,7 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.egit.core.Activator;
import org.eclipse.egit.core.EclipseGitProgressTransformer;
import org.eclipse.egit.core.internal.util.ProjectUtil;
import org.eclipse.jgit.api.Git;
@@ -29,6 +31,7 @@ import org.eclipse.jgit.api.SubmoduleInitCommand;
import org.eclipse.jgit.api.SubmoduleUpdateCommand;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.merge.MergeStrategy;
import org.eclipse.jgit.submodule.SubmoduleWalk;
import org.eclipse.team.core.TeamException;
@@ -82,6 +85,11 @@ public class SubmoduleUpdateOperation implements IEGitOperation {
update.addPath(path);
update.setProgressMonitor(new EclipseGitProgressTransformer(
new SubProgressMonitor(pm, 2)));
+ MergeStrategy strategy = Activator.getDefault()
+ .getPreferredMergeStrategy();
+ if (strategy != null) {
+ update.setStrategy(strategy);
+ }
updated = update.call();
pm.worked(1);
SubProgressMonitor refreshMonitor = new SubProgressMonitor(

Back to the top