From 8cbdf523cd60813f69dddece5393c321e5dbe037 Mon Sep 17 00:00:00 2001 From: Thomas Wolf Date: Tue, 22 Aug 2017 09:02:31 +0200 Subject: [PATCH] Add a getter for a list of RefSpecs to Config Reading RefSpecs from a Config can be seen as another typed value conversion, so add a getter to Config and to TypedConfigGetter. Use it in RemoteConfig. Doing this allows clients of the JGit library to customize the handling of invalid RefSpecs in git config files by installing a custom TypedConfigGetter. Bug: 517314 Change-Id: I0ebc0f073fabc85c2a693b43f5ba5962d8a795ff Signed-off-by: Thomas Wolf --- .../src/org/eclipse/jgit/lib/Config.java | 18 ++++++++++++++++ .../jgit/lib/DefaultTypedConfigGetter.java | 15 +++++++++++++ .../eclipse/jgit/lib/TypedConfigGetter.java | 21 +++++++++++++++++++ .../eclipse/jgit/transport/RemoteConfig.java | 18 ++++++---------- 4 files changed, 60 insertions(+), 12 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java index 338216bc6..6281bcfb3 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java @@ -69,6 +69,7 @@ import org.eclipse.jgit.events.ListenerHandle; import org.eclipse.jgit.events.ListenerList; import org.eclipse.jgit.internal.JGitText; +import org.eclipse.jgit.transport.RefSpec; import org.eclipse.jgit.util.IO; import org.eclipse.jgit.util.RawParseUtils; @@ -446,6 +447,23 @@ public long getTimeUnit(String section, String subsection, String name, defaultValue, wantUnit); } + /** + * Parse a list of {@link RefSpec}s from the configuration. + * + * @param section + * section the key is in. + * @param subsection + * subsection the key is in, or null if not in a subsection. + * @param name + * the key name. + * @return a possibly empty list of {@link RefSpec}s + * @since 4.9 + */ + public List getRefSpecs(String section, String subsection, + String name) { + return typedGetter.getRefSpecs(this, section, subsection, name); + } + /** * @param section * section to search for. diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/DefaultTypedConfigGetter.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/DefaultTypedConfigGetter.java index c77d0dd6d..fd3774760 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/DefaultTypedConfigGetter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/DefaultTypedConfigGetter.java @@ -44,12 +44,16 @@ package org.eclipse.jgit.lib; import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.eclipse.jgit.annotations.NonNull; import org.eclipse.jgit.internal.JGitText; import org.eclipse.jgit.lib.Config.ConfigEnum; +import org.eclipse.jgit.transport.RefSpec; import org.eclipse.jgit.util.StringUtils; /** @@ -281,4 +285,15 @@ private static IllegalArgumentException notTimeUnit(String section, MessageFormat.format(JGitText.get().invalidTimeUnitValue2, section, name, valueString)); } + + @Override + public @NonNull List getRefSpecs(Config config, String section, + String subsection, String name) { + String[] values = config.getStringList(section, subsection, name); + List result = new ArrayList<>(values.length); + for (String spec : values) { + result.add(new RefSpec(spec)); + } + return result; + } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/TypedConfigGetter.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/TypedConfigGetter.java index 7c34a03c9..594edef66 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/TypedConfigGetter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/TypedConfigGetter.java @@ -43,8 +43,12 @@ package org.eclipse.jgit.lib; +import java.util.List; import java.util.concurrent.TimeUnit; +import org.eclipse.jgit.annotations.NonNull; +import org.eclipse.jgit.transport.RefSpec; + /** * Something that knows how to convert plain strings from a git {@link Config} * to typed values. @@ -155,4 +159,21 @@ long getLong(Config config, String section, String subsection, String name, long getTimeUnit(Config config, String section, String subsection, String name, long defaultValue, TimeUnit wantUnit); + + /** + * Parse a list of {@link RefSpec}s from a git {@link Config}. + * + * @param config + * to get the list from + * @param section + * section the key is in. + * @param subsection + * subsection the key is in, or null if not in a subsection. + * @param name + * the key name. + * @return a possibly empty list of {@link RefSpec}s + */ + @NonNull + List getRefSpecs(Config config, String section, String subsection, + String name); } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteConfig.java index a0d81c00f..5449cf15b 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteConfig.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteConfig.java @@ -192,24 +192,18 @@ public RemoteConfig(final Config rc, final String remoteName) } } } - vlst = rc.getStringList(SECTION, name, KEY_FETCH); - fetch = new ArrayList<>(vlst.length); - for (final String s : vlst) - fetch.add(new RefSpec(s)); - - vlst = rc.getStringList(SECTION, name, KEY_PUSH); - push = new ArrayList<>(vlst.length); - for (final String s : vlst) - push.add(new RefSpec(s)); - + fetch = rc.getRefSpecs(SECTION, name, KEY_FETCH); + push = rc.getRefSpecs(SECTION, name, KEY_PUSH); val = rc.getString(SECTION, name, KEY_UPLOADPACK); - if (val == null) + if (val == null) { val = DEFAULT_UPLOAD_PACK; + } uploadpack = val; val = rc.getString(SECTION, name, KEY_RECEIVEPACK); - if (val == null) + if (val == null) { val = DEFAULT_RECEIVE_PACK; + } receivepack = val; val = rc.getString(SECTION, name, KEY_TAGOPT);