aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java32
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RenameBranchCommandTest.java63
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java5
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java104
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/BranchConfig.java48
5 files changed, 174 insertions, 78 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java
index ce11e1b1bc..8a728caf73 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java
@@ -62,6 +62,7 @@ import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.errors.NoWorkTreeException;
import org.eclipse.jgit.junit.RepositoryTestCase;
import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.BranchConfig.BranchRebaseMode;
import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
@@ -605,11 +606,10 @@ public class CloneCommandTest extends RepositoryTestCase {
command.setURI(fileUri());
Git git2 = command.call();
addRepoToClose(git2.getRepository());
- assertFalse(git2
- .getRepository()
- .getConfig()
- .getBoolean(ConfigConstants.CONFIG_BRANCH_SECTION, "test",
- ConfigConstants.CONFIG_KEY_REBASE, false));
+ assertNull(git2.getRepository().getConfig().getEnum(
+ BranchRebaseMode.values(),
+ ConfigConstants.CONFIG_BRANCH_SECTION, "test",
+ ConfigConstants.CONFIG_KEY_REBASE, null));
FileBasedConfig userConfig = SystemReader.getInstance().openUserConfig(
null, git.getRepository().getFS());
@@ -623,11 +623,12 @@ public class CloneCommandTest extends RepositoryTestCase {
command.setURI(fileUri());
git2 = command.call();
addRepoToClose(git2.getRepository());
- assertTrue(git2
- .getRepository()
- .getConfig()
- .getBoolean(ConfigConstants.CONFIG_BRANCH_SECTION, "test",
- ConfigConstants.CONFIG_KEY_REBASE, false));
+ assertEquals(BranchRebaseMode.REBASE,
+ git2.getRepository().getConfig().getEnum(
+ BranchRebaseMode.values(),
+ ConfigConstants.CONFIG_BRANCH_SECTION, "test",
+ ConfigConstants.CONFIG_KEY_REBASE,
+ BranchRebaseMode.NONE));
userConfig.setString(ConfigConstants.CONFIG_BRANCH_SECTION, null,
ConfigConstants.CONFIG_KEY_AUTOSETUPREBASE,
@@ -639,11 +640,12 @@ public class CloneCommandTest extends RepositoryTestCase {
command.setURI(fileUri());
git2 = command.call();
addRepoToClose(git2.getRepository());
- assertTrue(git2
- .getRepository()
- .getConfig()
- .getBoolean(ConfigConstants.CONFIG_BRANCH_SECTION, "test",
- ConfigConstants.CONFIG_KEY_REBASE, false));
+ assertEquals(BranchRebaseMode.REBASE,
+ git2.getRepository().getConfig().getEnum(
+ BranchRebaseMode.values(),
+ ConfigConstants.CONFIG_BRANCH_SECTION, "test",
+ ConfigConstants.CONFIG_KEY_REBASE,
+ BranchRebaseMode.NONE));
}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RenameBranchCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RenameBranchCommandTest.java
index 181e4a135a..4c09a82572 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RenameBranchCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RenameBranchCommandTest.java
@@ -43,11 +43,14 @@
package org.eclipse.jgit.api;
import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import org.eclipse.jgit.junit.RepositoryTestCase;
+import org.eclipse.jgit.lib.BranchConfig.BranchRebaseMode;
import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.StoredConfig;
@@ -98,32 +101,40 @@ public class RenameBranchCommandTest extends RepositoryTestCase {
@Test
public void renameBranchSingleConfigValue() throws Exception {
StoredConfig config = git.getRepository().getConfig();
- config.setBoolean(ConfigConstants.CONFIG_BRANCH_SECTION,
- Constants.MASTER, ConfigConstants.CONFIG_KEY_REBASE, true);
+ config.setEnum(ConfigConstants.CONFIG_BRANCH_SECTION, Constants.MASTER,
+ ConfigConstants.CONFIG_KEY_REBASE, BranchRebaseMode.REBASE);
config.save();
String branch = "b1";
- assertTrue(config.getBoolean(ConfigConstants.CONFIG_BRANCH_SECTION,
- Constants.MASTER, ConfigConstants.CONFIG_KEY_REBASE, true));
- assertFalse(config.getBoolean(ConfigConstants.CONFIG_BRANCH_SECTION,
- branch, ConfigConstants.CONFIG_KEY_REBASE, false));
+ assertEquals(BranchRebaseMode.REBASE,
+ config.getEnum(BranchRebaseMode.values(),
+ ConfigConstants.CONFIG_BRANCH_SECTION, Constants.MASTER,
+ ConfigConstants.CONFIG_KEY_REBASE,
+ BranchRebaseMode.NONE));
+ assertNull(config.getEnum(BranchRebaseMode.values(),
+ ConfigConstants.CONFIG_BRANCH_SECTION, branch,
+ ConfigConstants.CONFIG_KEY_REBASE, null));
assertNotNull(git.branchRename().setNewName(branch).call());
config = git.getRepository().getConfig();
- assertFalse(config.getBoolean(ConfigConstants.CONFIG_BRANCH_SECTION,
- Constants.MASTER, ConfigConstants.CONFIG_KEY_REBASE, false));
- assertTrue(config.getBoolean(ConfigConstants.CONFIG_BRANCH_SECTION,
- branch, ConfigConstants.CONFIG_KEY_REBASE, false));
+ assertNull(config.getEnum(BranchRebaseMode.values(),
+ ConfigConstants.CONFIG_BRANCH_SECTION, Constants.MASTER,
+ ConfigConstants.CONFIG_KEY_REBASE, null));
+ assertEquals(BranchRebaseMode.REBASE,
+ config.getEnum(BranchRebaseMode.values(),
+ ConfigConstants.CONFIG_BRANCH_SECTION, branch,
+ ConfigConstants.CONFIG_KEY_REBASE,
+ BranchRebaseMode.NONE));
}
@Test
public void renameBranchExistingSection() throws Exception {
String branch = "b1";
StoredConfig config = git.getRepository().getConfig();
- config.setBoolean(ConfigConstants.CONFIG_BRANCH_SECTION,
- Constants.MASTER, ConfigConstants.CONFIG_KEY_REBASE, true);
+ config.setEnum(ConfigConstants.CONFIG_BRANCH_SECTION, Constants.MASTER,
+ ConfigConstants.CONFIG_KEY_REBASE, BranchRebaseMode.REBASE);
config.setString(ConfigConstants.CONFIG_BRANCH_SECTION,
Constants.MASTER, "a", "a");
config.setString(ConfigConstants.CONFIG_BRANCH_SECTION, branch, "a",
@@ -140,18 +151,22 @@ public class RenameBranchCommandTest extends RepositoryTestCase {
@Test
public void renameBranchMultipleConfigValues() throws Exception {
StoredConfig config = git.getRepository().getConfig();
- config.setBoolean(ConfigConstants.CONFIG_BRANCH_SECTION,
- Constants.MASTER, ConfigConstants.CONFIG_KEY_REBASE, true);
+ config.setEnum(ConfigConstants.CONFIG_BRANCH_SECTION, Constants.MASTER,
+ ConfigConstants.CONFIG_KEY_REBASE, BranchRebaseMode.REBASE);
config.setBoolean(ConfigConstants.CONFIG_BRANCH_SECTION,
Constants.MASTER, ConfigConstants.CONFIG_KEY_MERGE, true);
config.save();
String branch = "b1";
- assertTrue(config.getBoolean(ConfigConstants.CONFIG_BRANCH_SECTION,
- Constants.MASTER, ConfigConstants.CONFIG_KEY_REBASE, true));
- assertFalse(config.getBoolean(ConfigConstants.CONFIG_BRANCH_SECTION,
- branch, ConfigConstants.CONFIG_KEY_REBASE, false));
+ assertEquals(BranchRebaseMode.REBASE,
+ config.getEnum(BranchRebaseMode.values(),
+ ConfigConstants.CONFIG_BRANCH_SECTION, Constants.MASTER,
+ ConfigConstants.CONFIG_KEY_REBASE,
+ BranchRebaseMode.NONE));
+ assertNull(config.getEnum(BranchRebaseMode.values(),
+ ConfigConstants.CONFIG_BRANCH_SECTION, branch,
+ ConfigConstants.CONFIG_KEY_REBASE, null));
assertTrue(config.getBoolean(ConfigConstants.CONFIG_BRANCH_SECTION,
Constants.MASTER, ConfigConstants.CONFIG_KEY_MERGE, true));
assertFalse(config.getBoolean(ConfigConstants.CONFIG_BRANCH_SECTION,
@@ -160,10 +175,14 @@ public class RenameBranchCommandTest extends RepositoryTestCase {
assertNotNull(git.branchRename().setNewName(branch).call());
config = git.getRepository().getConfig();
- assertFalse(config.getBoolean(ConfigConstants.CONFIG_BRANCH_SECTION,
- Constants.MASTER, ConfigConstants.CONFIG_KEY_REBASE, false));
- assertTrue(config.getBoolean(ConfigConstants.CONFIG_BRANCH_SECTION,
- branch, ConfigConstants.CONFIG_KEY_REBASE, false));
+ assertNull(config.getEnum(BranchRebaseMode.values(),
+ ConfigConstants.CONFIG_BRANCH_SECTION, Constants.MASTER,
+ ConfigConstants.CONFIG_KEY_REBASE, null));
+ assertEquals(BranchRebaseMode.REBASE,
+ config.getEnum(BranchRebaseMode.values(),
+ ConfigConstants.CONFIG_BRANCH_SECTION, branch,
+ ConfigConstants.CONFIG_KEY_REBASE,
+ BranchRebaseMode.NONE));
assertFalse(config.getBoolean(ConfigConstants.CONFIG_BRANCH_SECTION,
Constants.MASTER, ConfigConstants.CONFIG_KEY_MERGE, false));
assertTrue(config.getBoolean(ConfigConstants.CONFIG_BRANCH_SECTION,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java
index ff15fd00c6..dd5da1582f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java
@@ -58,6 +58,7 @@ import org.eclipse.jgit.dircache.DirCacheCheckout;
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.internal.JGitText;
+import org.eclipse.jgit.lib.BranchConfig.BranchRebaseMode;
import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.NullProgressMonitor;
@@ -326,9 +327,9 @@ public class CloneCommand extends TransportCommand<CloneCommand, Git> {
ConfigConstants.CONFIG_KEY_AUTOSETUPREBASE);
if (ConfigConstants.CONFIG_KEY_ALWAYS.equals(autosetupRebase)
|| ConfigConstants.CONFIG_KEY_REMOTE.equals(autosetupRebase))
- clonedRepo.getConfig().setBoolean(
+ clonedRepo.getConfig().setEnum(
ConfigConstants.CONFIG_BRANCH_SECTION, branchName,
- ConfigConstants.CONFIG_KEY_REBASE, true);
+ ConfigConstants.CONFIG_KEY_REBASE, BranchRebaseMode.REBASE);
clonedRepo.getConfig().save();
}
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 549ef6cf13..a4d9ec1a07 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java
@@ -60,6 +60,7 @@ import org.eclipse.jgit.api.errors.RefNotFoundException;
import org.eclipse.jgit.api.errors.WrongRepositoryStateException;
import org.eclipse.jgit.internal.JGitText;
import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.lib.BranchConfig.BranchRebaseMode;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.lib.Constants;
@@ -83,7 +84,7 @@ public class PullCommand extends TransportCommand<PullCommand, PullResult> {
private ProgressMonitor monitor = NullProgressMonitor.INSTANCE;
- private PullRebaseMode pullRebaseMode = null;
+ private BranchRebaseMode pullRebaseMode = null;
private String remote;
@@ -91,33 +92,6 @@ public class PullCommand extends TransportCommand<PullCommand, PullResult> {
private MergeStrategy strategy = MergeStrategy.RECURSIVE;
- private enum PullRebaseMode implements Config.ConfigEnum {
- REBASE_PRESERVE("preserve", true, true), //$NON-NLS-1$
- REBASE("true", true, false), //$NON-NLS-1$
- NO_REBASE("false", false, false); //$NON-NLS-1$
-
- private final String configValue;
-
- private final boolean rebase;
-
- private final boolean preserveMerges;
-
- PullRebaseMode(String configValue, boolean rebase,
- boolean preserveMerges) {
- this.configValue = configValue;
- this.rebase = rebase;
- this.preserveMerges = preserveMerges;
- }
-
- public String toConfigValue() {
- return configValue;
- }
-
- public boolean matchConfigValue(String in) {
- return in.equals(configValue);
- }
- }
-
/**
* @param repo
*/
@@ -158,7 +132,46 @@ public class PullCommand extends TransportCommand<PullCommand, PullResult> {
*/
public PullCommand setRebase(boolean useRebase) {
checkCallable();
- pullRebaseMode = useRebase ? PullRebaseMode.REBASE : PullRebaseMode.NO_REBASE;
+ pullRebaseMode = useRebase ? BranchRebaseMode.REBASE
+ : BranchRebaseMode.NONE;
+ return this;
+ }
+
+ /**
+ * Sets the {@link BranchRebaseMode} to use after fetching.
+ *
+ * <dl>
+ * <dt>BranchRebaseMode.REBASE</dt>
+ * <dd>Equivalent to {@code --rebase} on the command line: use rebase
+ * instead of merge after fetching.</dd>
+ * <dt>BranchRebaseMode.PRESERVE</dt>
+ * <dd>Equivalent to {@code --preserve-merges} on the command line: rebase
+ * preserving local merge commits.</dd>
+ * <dt>BranchRebaseMode.INTERACTIVE</dt>
+ * <dd>Equivalent to {@code --interactive} on the command line: use
+ * interactive rebase.</dd>
+ * <dt>BranchRebaseMode.NONE</dt>
+ * <dd>Equivalent to {@code --no-rebase}: merge instead of rebasing.
+ * <dt>{@code null}</dt>
+ * <dd>Use the setting defined in the git configuration, either {@code
+ * branch.[name].rebase} or, if not set, {@code pull.rebase}</dd>
+ * </dl>
+ *
+ * This setting overrides the settings in the configuration file. By
+ * default, the setting in the repository configuration file is used.
+ * <p>
+ * A branch can be configured to use rebase by default. See
+ * {@code branch.[name].rebase}, {@code branch.autosetuprebase}, and
+ * {@code pull.rebase}.
+ *
+ * @param rebaseMode
+ * the {@link BranchRebaseMode} to use
+ * @return {@code this}
+ * @since 4.5
+ */
+ public PullCommand setRebase(BranchRebaseMode rebaseMode) {
+ checkCallable();
+ pullRebaseMode = rebaseMode;
return this;
}
@@ -315,12 +328,13 @@ public class PullCommand extends TransportCommand<PullCommand, PullResult> {
Repository.shortenRefName(remoteBranchName), remoteUri);
PullResult result;
- if (pullRebaseMode.rebase) {
+ if (pullRebaseMode != BranchRebaseMode.NONE) {
RebaseCommand rebase = new RebaseCommand(repo);
RebaseResult rebaseRes = rebase.setUpstream(commitToMerge)
.setUpstreamName(upstreamName).setProgressMonitor(monitor)
.setOperation(Operation.BEGIN).setStrategy(strategy)
- .setPreserveMerges(pullRebaseMode.preserveMerges)
+ .setPreserveMerges(
+ pullRebaseMode == BranchRebaseMode.PRESERVE)
.call();
result = new PullResult(fetchRes, remote, rebaseRes);
} else {
@@ -397,13 +411,29 @@ public class PullCommand extends TransportCommand<PullCommand, PullResult> {
return this;
}
- private static PullRebaseMode getRebaseMode(String branchName, Config config) {
- PullRebaseMode mode = config.getEnum(PullRebaseMode.values(),
- ConfigConstants.CONFIG_PULL_SECTION, null,
- ConfigConstants.CONFIG_KEY_REBASE, PullRebaseMode.NO_REBASE);
- mode = config.getEnum(PullRebaseMode.values(),
+ /**
+ * Reads the rebase mode to use for a pull command from the repository
+ * configuration. This is the value defined for the configurations
+ * {@code branch.[branchName].rebase}, or,if not set, {@code pull.rebase}.
+ * If neither is set, yields {@link BranchRebaseMode#NONE}.
+ *
+ * @param branchName
+ * name of the local branch
+ * @param config
+ * the {@link Config} to read the value from
+ * @return the {@link BranchRebaseMode}
+ * @since 4.5
+ */
+ public static BranchRebaseMode getRebaseMode(String branchName,
+ Config config) {
+ BranchRebaseMode mode = config.getEnum(BranchRebaseMode.values(),
ConfigConstants.CONFIG_BRANCH_SECTION,
- branchName, ConfigConstants.CONFIG_KEY_REBASE, mode);
+ branchName, ConfigConstants.CONFIG_KEY_REBASE, null);
+ if (mode == null) {
+ mode = config.getEnum(BranchRebaseMode.values(),
+ ConfigConstants.CONFIG_PULL_SECTION, null,
+ ConfigConstants.CONFIG_KEY_REBASE, BranchRebaseMode.NONE);
+ }
return mode;
}
}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BranchConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BranchConfig.java
index a62f6c3b5d..f1b7fb2172 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BranchConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BranchConfig.java
@@ -55,6 +55,39 @@ import org.eclipse.jgit.transport.RemoteConfig;
public class BranchConfig {
/**
+ * Config values for branch.[name].rebase (and pull.rebase).
+ *
+ * @since 4.5
+ */
+ public enum BranchRebaseMode implements Config.ConfigEnum {
+
+ /** Value for rebasing */
+ REBASE("true"), //$NON-NLS-1$
+ /** Value for rebasing preserving local merge commits */
+ PRESERVE("preserve"), //$NON-NLS-1$
+ /** Value for rebasing interactively */
+ INTERACTIVE("interactive"), //$NON-NLS-1$
+ /** Value for not rebasing at all but merging */
+ NONE("false"); //$NON-NLS-1$
+
+ private final String configValue;
+
+ private BranchRebaseMode(String configValue) {
+ this.configValue = configValue;
+ }
+
+ @Override
+ public String toConfigValue() {
+ return configValue;
+ }
+
+ @Override
+ public boolean matchConfigValue(String s) {
+ return configValue.equals(s);
+ }
+ }
+
+ /**
* The value that means "local repository" for {@link #getRemote()}:
* {@value}
*
@@ -143,8 +176,19 @@ public class BranchConfig {
* @since 3.5
*/
public boolean isRebase() {
- return config.getBoolean(ConfigConstants.CONFIG_BRANCH_SECTION,
- branchName, ConfigConstants.CONFIG_KEY_REBASE, false);
+ return getRebaseMode() != BranchRebaseMode.NONE;
+ }
+
+ /**
+ * Retrieves the config value of branch.[name].rebase.
+ *
+ * @return the {@link BranchRebaseMode}
+ * @since 4.5
+ */
+ public BranchRebaseMode getRebaseMode() {
+ return config.getEnum(BranchRebaseMode.values(),
+ ConfigConstants.CONFIG_BRANCH_SECTION, branchName,
+ ConfigConstants.CONFIG_KEY_REBASE, BranchRebaseMode.NONE);
}
/**