Browse Source

Support insteadOf and pushInsteadOf URL replacement

Bug: 346873
Change-Id: I4116328f93f411da56a633bc32fd064b2ac083f2
Signed-off-by: Chris Aniszczyk <zx@twitter.com>
tags/v2.0.0.201206130900-r
Kevin Sawicki 12 years ago
parent
commit
9908c203a5

+ 63
- 0
org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/RemoteConfigTest.java View File

import static org.junit.Assert.assertSame; import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;


import java.util.Arrays;
import java.util.List; import java.util.List;


import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.ConfigInvalidException;
+ "\tfetch = +refs/heads/*:refs/remotes/origin/*\n" + "\tfetch = +refs/heads/*:refs/remotes/origin/*\n"
+ "\ttimeout = 60\n"); + "\ttimeout = 60\n");
} }

@Test
public void noInsteadOf() throws Exception {
config.setString("remote", "origin", "url", "short:project.git");
config.setString("url", "https://server/repos/", "name", "short:");
RemoteConfig rc = new RemoteConfig(config, "origin");
assertFalse(rc.getURIs().isEmpty());
assertEquals("short:project.git", rc.getURIs().get(0).toASCIIString());
}

@Test
public void singleInsteadOf() throws Exception {
config.setString("remote", "origin", "url", "short:project.git");
config.setString("url", "https://server/repos/", "insteadOf", "short:");
RemoteConfig rc = new RemoteConfig(config, "origin");
assertFalse(rc.getURIs().isEmpty());
assertEquals("https://server/repos/project.git", rc.getURIs().get(0)
.toASCIIString());
}

@Test
public void multipleInsteadOf() throws Exception {
config.setString("remote", "origin", "url", "prefixproject.git");
config.setStringList("url", "https://server/repos/", "insteadOf",
Arrays.asList("pre", "prefix", "pref", "perf"));
RemoteConfig rc = new RemoteConfig(config, "origin");
assertFalse(rc.getURIs().isEmpty());
assertEquals("https://server/repos/project.git", rc.getURIs().get(0)
.toASCIIString());
}

@Test
public void noPushInsteadOf() throws Exception {
config.setString("remote", "origin", "pushurl", "short:project.git");
config.setString("url", "https://server/repos/", "name", "short:");
RemoteConfig rc = new RemoteConfig(config, "origin");
assertFalse(rc.getPushURIs().isEmpty());
assertEquals("short:project.git", rc.getPushURIs().get(0)
.toASCIIString());
}

@Test
public void singlePushInsteadOf() throws Exception {
config.setString("remote", "origin", "pushurl", "short:project.git");
config.setString("url", "https://server/repos/", "pushInsteadOf",
"short:");
RemoteConfig rc = new RemoteConfig(config, "origin");
assertFalse(rc.getPushURIs().isEmpty());
assertEquals("https://server/repos/project.git", rc.getPushURIs()
.get(0).toASCIIString());
}

@Test
public void multiplePushInsteadOf() throws Exception {
config.setString("remote", "origin", "pushurl", "prefixproject.git");
config.setStringList("url", "https://server/repos/", "pushInsteadOf",
Arrays.asList("pre", "prefix", "pref", "perf"));
RemoteConfig rc = new RemoteConfig(config, "origin");
assertFalse(rc.getPushURIs().isEmpty());
assertEquals("https://server/repos/project.git", rc.getPushURIs()
.get(0).toASCIIString());
}
} }

+ 41
- 2
org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteConfig.java View File

import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Map.Entry;


import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.Config;




private static final String KEY_TIMEOUT = "timeout"; private static final String KEY_TIMEOUT = "timeout";


private static final String KEY_INSTEADOF = "insteadof";

private static final String KEY_PUSHINSTEADOF = "pushinsteadof";

private static final boolean DEFAULT_MIRROR = false; private static final boolean DEFAULT_MIRROR = false;


/** Default value for {@link #getUploadPack()} if not specified. */ /** Default value for {@link #getUploadPack()} if not specified. */
String val; String val;


vlst = rc.getStringList(SECTION, name, KEY_URL); vlst = rc.getStringList(SECTION, name, KEY_URL);
Map<String, String> insteadOf = getReplacements(rc, KEY_INSTEADOF);
uris = new ArrayList<URIish>(vlst.length); uris = new ArrayList<URIish>(vlst.length);
for (final String s : vlst) for (final String s : vlst)
uris.add(new URIish(s));
uris.add(new URIish(replaceUri(s, insteadOf)));


Map<String, String> pushInsteadOf = getReplacements(rc,
KEY_PUSHINSTEADOF);
vlst = rc.getStringList(SECTION, name, KEY_PUSHURL); vlst = rc.getStringList(SECTION, name, KEY_PUSHURL);
pushURIs = new ArrayList<URIish>(vlst.length); pushURIs = new ArrayList<URIish>(vlst.length);
for (final String s : vlst) for (final String s : vlst)
pushURIs.add(new URIish(s));
pushURIs.add(new URIish(replaceUri(s, pushInsteadOf)));


vlst = rc.getStringList(SECTION, name, KEY_FETCH); vlst = rc.getStringList(SECTION, name, KEY_FETCH);
fetch = new ArrayList<RefSpec>(vlst.length); fetch = new ArrayList<RefSpec>(vlst.length);
rc.unset(SECTION, getName(), key); rc.unset(SECTION, getName(), key);
} }


private Map<String, String> getReplacements(final Config config,
final String keyName) {
final Map<String, String> replacements = new HashMap<String, String>();
for (String url : config.getSubsections(KEY_URL))
for (String insteadOf : config.getStringList(KEY_URL, url, keyName))
replacements.put(insteadOf, url);
return replacements;
}

private String replaceUri(final String uri,
final Map<String, String> replacements) {
if (replacements.isEmpty())
return uri;
Entry<String, String> match = null;
for (Entry<String, String> replacement : replacements.entrySet()) {
// Ignore current entry if not longer than previous match
if (match != null
&& match.getKey().length() > replacement.getKey().length())
continue;
if (!uri.startsWith(replacement.getKey()))
continue;
match = replacement;
}
if (match != null)
return match.getValue() + uri.substring(match.getKey().length());
else
return uri;
}

/** /**
* Get the local name this remote configuration is recognized as. * Get the local name this remote configuration is recognized as.
* *

Loading…
Cancel
Save