Browse Source

RepoCommand: generate relative submodule URLs from absolute URLs.

If a manifest file specifies an absolute URL on the same host on which
the superproject resides, rewrite the URLs to be relative.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Change-Id: Id616611e5195998fb665c8e7806539a3a02e219a
stable-4.11
Han-Wen Nienhuys 7 years ago
parent
commit
6a420613f7
  1. 58
      org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/RepoCommandTest.java
  2. 8
      org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoCommand.java

58
org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/RepoCommandTest.java

@ -438,6 +438,63 @@ public class RepoCommandTest extends RepositoryTestCase {
dest.close(); dest.close();
} }
@Test
public void absoluteRemoteURLAbsoluteTargetURL() throws Exception {
Repository child =
Git.cloneRepository().setURI(groupADb.getDirectory().toURI().toString())
.setDirectory(createUniqueTestGitDir(true))
.setBare(true).call().getRepository();
Repository dest = Git.cloneRepository()
.setURI(db.getDirectory().toURI().toString()).setDirectory(createUniqueTestGitDir(true))
.setBare(true).call().getRepository();
String abs = "https://chromium.googlesource.com";
String repoUrl = "https://chromium.googlesource.com/chromium/src";
boolean fetchSlash = false;
boolean baseSlash = false;
do {
do {
String fetchUrl = fetchSlash ? abs + "/" : abs;
String baseUrl = baseSlash ? abs + "/" : abs;
StringBuilder xmlContent = new StringBuilder();
xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
.append("<manifest>")
.append("<remote name=\"origin\" fetch=\"" + fetchUrl + "\" />")
.append("<default revision=\"master\" remote=\"origin\" />")
.append("<project path=\"src\" name=\"chromium/src\" />")
.append("</manifest>");
RepoCommand cmd = new RepoCommand(dest);
IndexedRepos repos = new IndexedRepos();
repos.put(repoUrl, child);
RevCommit commit = cmd
.setInputStream(new ByteArrayInputStream(xmlContent.toString().getBytes(UTF_8)))
.setRemoteReader(repos)
.setURI(baseUrl)
.setTargetURI(abs + "/superproject")
.setRecordRemoteBranch(true)
.setRecordSubmoduleLabels(true)
.call();
String idStr = commit.getId().name() + ":" + ".gitmodules";
ObjectId modId = dest.resolve(idStr);
try (ObjectReader reader = dest.newObjectReader()) {
byte[] bytes = reader.open(modId).getCachedBytes(Integer.MAX_VALUE);
Config base = new Config();
BlobBasedConfig cfg = new BlobBasedConfig(base, bytes);
String subUrl = cfg.getString("submodule", "src", "url");
assertEquals("../chromium/src", subUrl);
}
fetchSlash = !fetchSlash;
} while (fetchSlash);
baseSlash = !baseSlash;
} while (baseSlash);
child.close();
dest.close();
}
@Test @Test
public void testAddRepoManifest() throws Exception { public void testAddRepoManifest() throws Exception {
StringBuilder xmlContent = new StringBuilder(); StringBuilder xmlContent = new StringBuilder();
@ -1188,5 +1245,6 @@ public class RepoCommandTest extends RepositoryTestCase {
testRelative("abc", "/bcd", "/bcd"); testRelative("abc", "/bcd", "/bcd");
testRelative("http://a", "a/b", "a/b"); testRelative("http://a", "a/b", "a/b");
testRelative("http://base.com/a/", "http://child.com/a/b", "http://child.com/a/b"); testRelative("http://base.com/a/", "http://child.com/a/b", "http://child.com/a/b");
testRelative("http://base.com/a/", "http://base.com/a/b", "b");
} }
} }

8
org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoCommand.java

@ -54,6 +54,7 @@ import java.text.MessageFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.StringJoiner; import java.util.StringJoiner;
@ -749,12 +750,7 @@ public class RepoCommand extends GitCommand<RevCommit> {
*/ */
private static final String SLASH = "/"; //$NON-NLS-1$ private static final String SLASH = "/"; //$NON-NLS-1$
static URI relativize(URI current, URI target) { static URI relativize(URI current, URI target) {
if (!Objects.equals(current.getHost(), target.getHost())) {
// We only handle bare paths for now.
if (!target.toString().equals(target.getPath())) {
return target;
}
if (!current.toString().equals(current.getPath())) {
return target; return target;
} }

Loading…
Cancel
Save