diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PushConfigTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PushConfigTest.java index 6109d6cb4..cbc1d546a 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PushConfigTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PushConfigTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017, David Pursehouse and others + * Copyright (C) 2017, 2022 David Pursehouse and others * * This program and the accompanying materials are made available under the * terms of the Eclipse Distribution License v. 1.0 which is available at @@ -14,10 +14,13 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.transport.PushConfig.PushDefault; import org.eclipse.jgit.transport.PushConfig.PushRecurseSubmodulesMode; import org.junit.Test; public class PushConfigTest { + @Test public void pushRecurseSubmoduleMatch() throws Exception { assertTrue(PushRecurseSubmodulesMode.CHECK.matchConfigValue("check")); @@ -52,4 +55,59 @@ public void pushRecurseSubmoduleToConfigValue() { assertEquals("check", PushRecurseSubmodulesMode.CHECK.toConfigValue()); assertEquals("false", PushRecurseSubmodulesMode.NO.toConfigValue()); } + + @Test + public void pushDefaultMatch() throws Exception { + assertTrue(PushDefault.NOTHING.matchConfigValue("nothing")); + assertTrue(PushDefault.NOTHING.matchConfigValue("NOTHING")); + assertTrue(PushDefault.CURRENT.matchConfigValue("current")); + assertTrue(PushDefault.CURRENT.matchConfigValue("CURRENT")); + assertTrue(PushDefault.UPSTREAM.matchConfigValue("upstream")); + assertTrue(PushDefault.UPSTREAM.matchConfigValue("UPSTREAM")); + assertTrue(PushDefault.UPSTREAM.matchConfigValue("tracking")); + assertTrue(PushDefault.UPSTREAM.matchConfigValue("TRACKING")); + assertTrue(PushDefault.SIMPLE.matchConfigValue("simple")); + assertTrue(PushDefault.SIMPLE.matchConfigValue("SIMPLE")); + assertTrue(PushDefault.MATCHING.matchConfigValue("matching")); + assertTrue(PushDefault.MATCHING.matchConfigValue("MATCHING")); + } + + @Test + public void pushDefaultNoMatch() throws Exception { + assertFalse(PushDefault.NOTHING.matchConfigValue("n")); + assertFalse(PushDefault.CURRENT.matchConfigValue("")); + assertFalse(PushDefault.UPSTREAM.matchConfigValue("track")); + } + + @Test + public void pushDefaultToConfigValue() throws Exception { + assertEquals("nothing", PushDefault.NOTHING.toConfigValue()); + assertEquals("current", PushDefault.CURRENT.toConfigValue()); + assertEquals("upstream", PushDefault.UPSTREAM.toConfigValue()); + assertEquals("simple", PushDefault.SIMPLE.toConfigValue()); + assertEquals("matching", PushDefault.MATCHING.toConfigValue()); + } + + @Test + public void testEmptyConfig() throws Exception { + PushConfig cfg = parse(""); + assertEquals(PushRecurseSubmodulesMode.NO, cfg.getRecurseSubmodules()); + assertEquals(PushDefault.SIMPLE, cfg.getPushDefault()); + } + + @Test + public void testConfig() throws Exception { + PushConfig cfg = parse( + "[push]\n\tdefault = tracking\n\trecurseSubmodules = on-demand\n"); + assertEquals(PushRecurseSubmodulesMode.ON_DEMAND, + cfg.getRecurseSubmodules()); + assertEquals(PushDefault.UPSTREAM, cfg.getPushDefault()); + } + + private static PushConfig parse(String content) throws Exception { + Config c = new Config(); + c.fromText(content); + return c.get(PushConfig::new); + } + } diff --git a/org.eclipse.jgit/.settings/.api_filters b/org.eclipse.jgit/.settings/.api_filters index cdf17402a..792a0c91c 100644 --- a/org.eclipse.jgit/.settings/.api_filters +++ b/org.eclipse.jgit/.settings/.api_filters @@ -17,4 +17,12 @@ + + + + + + + + diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java index af2b4ccdd..205999f8c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java @@ -808,4 +808,18 @@ public final class ConfigConstants { */ public static final String CONFIG_KEY_SEARCH_FOR_REUSE_TIMEOUT = "searchforreusetimeout"; + /** + * The "push" section. + * + * @since 6.1 + */ + public static final String CONFIG_PUSH_SECTION = "push"; + + /** + * The "default" key. + * + * @since 6.1 + */ + public static final String CONFIG_KEY_DEFAULT = "default"; + } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushConfig.java index fda7a8152..0de270261 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushConfig.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017, David Pursehouse and others + * Copyright (C) 2017, 2022 David Pursehouse and others * * This program and the accompanying materials are made available under the * terms of the Eclipse Distribution License v. 1.0 which is available at @@ -10,7 +10,10 @@ package org.eclipse.jgit.transport; +import java.util.Locale; + import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.ConfigConstants; import org.eclipse.jgit.util.StringUtils; /** @@ -19,8 +22,9 @@ * @since 4.9 */ public class PushConfig { + /** - * Config values for push.recurseSubmodules. + * Git config values for {@code push.recurseSubmodules}. */ public enum PushRecurseSubmodulesMode implements Config.ConfigEnum { /** @@ -59,4 +63,100 @@ public boolean matchConfigValue(String s) { || configValue.equalsIgnoreCase(s); } } + + /** + * Git config values for {@code push.default}. + * + * @since 6.1 + */ + public enum PushDefault implements Config.ConfigEnum { + + /** + * Do not push if there are no explicit refspecs. + */ + NOTHING, + + /** + * Push the current branch to an upstream branch of the same name. + */ + CURRENT, + + /** + * Push the current branch to an upstream branch determined by git + * config {@code branch..merge}. + */ + UPSTREAM("tracking"), //$NON-NLS-1$ + + /** + * Like {@link #UPSTREAM}, but only if the upstream name is the same as + * the name of the current local branch. + */ + SIMPLE, + + /** + * Push all current local branches that match a configured push refspec + * of the remote configuration. + */ + MATCHING; + + private final String alias; + + private PushDefault() { + alias = null; + } + + private PushDefault(String alias) { + this.alias = alias; + } + + @Override + public String toConfigValue() { + return name().toLowerCase(Locale.ROOT); + } + + @Override + public boolean matchConfigValue(String in) { + return toConfigValue().equalsIgnoreCase(in) + || alias != null && alias.equalsIgnoreCase(in); + } + } + + private final PushRecurseSubmodulesMode recurseSubmodules; + + private final PushDefault pushDefault; + + /** + * Creates a new instance. + * + * @param config + * {@link Config} to fill the {@link PushConfig} from + * @since 6.1 + */ + public PushConfig(Config config) { + recurseSubmodules = config.getEnum(ConfigConstants.CONFIG_PUSH_SECTION, + null, ConfigConstants.CONFIG_KEY_RECURSE_SUBMODULES, + PushRecurseSubmodulesMode.NO); + pushDefault = config.getEnum(ConfigConstants.CONFIG_PUSH_SECTION, null, + ConfigConstants.CONFIG_KEY_DEFAULT, PushDefault.SIMPLE); + } + + /** + * Retrieves the value of git config {@code push.recurseSubmodules}. + * + * @return the value + * @since 6.1 + */ + public PushRecurseSubmodulesMode getRecurseSubmodules() { + return recurseSubmodules; + } + + /** + * Retrieves the value of git config {@code push.default}. + * + * @return the value + * @since 6.1 + */ + public PushDefault getPushDefault() { + return pushDefault; + } }