Browse Source

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 <thomas.wolf@paranor.ch>
stable-4.9
Thomas Wolf 7 years ago committed by Matthias Sohn
parent
commit
8cbdf523cd
  1. 18
      org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java
  2. 15
      org.eclipse.jgit/src/org/eclipse/jgit/lib/DefaultTypedConfigGetter.java
  3. 21
      org.eclipse.jgit/src/org/eclipse/jgit/lib/TypedConfigGetter.java
  4. 18
      org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteConfig.java

18
org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java

@ -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.

15
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 @@ 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;
}
}

21
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 @@ 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);
}

18
org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteConfig.java

@ -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);

Loading…
Cancel
Save