]> source.dussan.org Git - jgit.git/commitdiff
Add a getter for a list of RefSpecs to Config 23/103423/3
authorThomas Wolf <thomas.wolf@paranor.ch>
Tue, 22 Aug 2017 07:02:31 +0000 (09:02 +0200)
committerMatthias Sohn <matthias.sohn@sap.com>
Sat, 26 Aug 2017 07:11:02 +0000 (09:11 +0200)
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 <thomas.wolf@paranor.ch>
org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java
org.eclipse.jgit/src/org/eclipse/jgit/lib/DefaultTypedConfigGetter.java
org.eclipse.jgit/src/org/eclipse/jgit/lib/TypedConfigGetter.java
org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteConfig.java

index 338216bc6cfacdbb80e9f0096f48733e04a86a50..6281bcfb3d3639b67d0ac3d89b31a70866010fd8 100644 (file)
@@ -69,6 +69,7 @@ import org.eclipse.jgit.events.ConfigChangedListener;
 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 class Config {
                                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<RefSpec> getRefSpecs(String section, String subsection,
+                       String name) {
+               return typedGetter.getRefSpecs(this, section, subsection, name);
+       }
+
        /**
         * @param section
         *            section to search for.
index c77d0dd6db53857047b375bf078e5ae52c91910e..fd3774760173f91f88595e2ab41fad4b1a4321b9 100644 (file)
 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 @@ public class DefaultTypedConfigGetter implements TypedConfigGetter {
                                MessageFormat.format(JGitText.get().invalidTimeUnitValue2,
                                                section, name, valueString));
        }
+
+       @Override
+       public @NonNull List<RefSpec> getRefSpecs(Config config, String section,
+                       String subsection, String name) {
+               String[] values = config.getStringList(section, subsection, name);
+               List<RefSpec> result = new ArrayList<>(values.length);
+               for (String spec : values) {
+                       result.add(new RefSpec(spec));
+               }
+               return result;
+       }
 }
index 7c34a03c9c6304a710097a0e8ca67f95a78e3e7d..594edef665b882e102aaef18a7d355e9ff665d1b 100644 (file)
 
 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 @@ public interface TypedConfigGetter {
        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<RefSpec> getRefSpecs(Config config, String section, String subsection,
+                       String name);
 }
index a0d81c00f063dc646fb78b77cf110fb040a55d80..5449cf15b3ea6932b1e8f6760d1d1887b2ea8bad 100644 (file)
@@ -192,24 +192,18 @@ public class RemoteConfig implements Serializable {
                                }
                        }
                }
-               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);