]> source.dussan.org Git - jgit.git/commitdiff
Support non-default remotes in project tag. 53/31853/1
authorYuxuan 'fishy' Wang <fishywang@google.com>
Mon, 18 Aug 2014 17:57:09 +0000 (10:57 -0700)
committerYuxuan 'fishy' Wang <fishywang@google.com>
Mon, 18 Aug 2014 17:57:09 +0000 (10:57 -0700)
Change-Id: I3c730a1ce379d142d3ed81dda4a73f86f1f9c3eb
Signed-off-by: Yuxuan 'fishy' Wang <fishywang@google.com>
org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/RepoCommandTest.java
org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoCommand.java

index 41a086f6bebcc5c51620c3a4956ddf037557ae94..5f2aece47ee0fbf8db5e3b996c4b76297c3c76bf 100644 (file)
@@ -611,6 +611,36 @@ public class RepoCommandTest extends RepositoryTestCase {
                                "master world", content);
        }
 
+       @Test
+       public void testNonDefaultRemotes() throws Exception {
+               StringBuilder xmlContent = new StringBuilder();
+               xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
+                       .append("<manifest>")
+                       .append("<remote name=\"remote1\" fetch=\".\" />")
+                       .append("<remote name=\"remote2\" fetch=\"")
+                       .append(notDefaultUri)
+                       .append("\" />")
+                       .append("<default revision=\"master\" remote=\"remote1\" />")
+                       .append("<project path=\"foo\" name=\"")
+                       .append(defaultUri)
+                       .append("\" />")
+                       .append("<project path=\"bar\" name=\".\" remote=\"remote2\" />")
+                       .append("</manifest>");
+
+               Repository localDb = createWorkRepository();
+               JGitTestUtil.writeTrashFile(
+                               localDb, "manifest.xml", xmlContent.toString());
+               RepoCommand command = new RepoCommand(localDb);
+               command
+                       .setPath(localDb.getWorkTree().getAbsolutePath() + "/manifest.xml")
+                       .setURI(rootUri)
+                       .call();
+               File file = new File(localDb.getWorkTree(), "foo/hello.txt");
+               assertTrue("We should have foo", file.exists());
+               file = new File(localDb.getWorkTree(), "bar/world.txt");
+               assertTrue("We should have bar", file.exists());
+       }
+
        private void resolveRelativeUris() {
                // Find the longest common prefix ends with "/" as rootUri.
                defaultUri = defaultDb.getDirectory().toURI().toString();
index 0350e1c0fc9cff911d435c350df6708002dd015e..3bf3c18840ab961026b41b32ce8b93b99024f2fb 100644 (file)
@@ -281,13 +281,16 @@ public class RepoCommand extends GitCommand<RevCommit> {
                final String name;
                final String path;
                final String revision;
+               final String remote;
                final Set<String> groups;
                final List<CopyFile> copyfiles;
 
-               Project(String name, String path, String revision, String groups) {
+               Project(String name, String path, String revision,
+                               String remote, String groups) {
                        this.name = name;
                        this.path = path;
                        this.revision = revision;
+                       this.remote = remote;
                        this.groups = new HashSet<String>();
                        if (groups != null && groups.length() > 0)
                                this.groups.addAll(Arrays.asList(groups.split(","))); //$NON-NLS-1$
@@ -401,6 +404,7 @@ public class RepoCommand extends GitCommand<RevCommit> {
                                                attributes.getValue("name"), //$NON-NLS-1$
                                                attributes.getValue("path"), //$NON-NLS-1$
                                                attributes.getValue("revision"), //$NON-NLS-1$
+                                               attributes.getValue("remote"), //$NON-NLS-1$
                                                attributes.getValue("groups")); //$NON-NLS-1$
                        } else if ("remote".equals(qName)) { //$NON-NLS-1$
                                remotes.put(attributes.getValue("name"), //$NON-NLS-1$
@@ -474,18 +478,28 @@ public class RepoCommand extends GitCommand<RevCommit> {
                                else
                                        throw new SAXException(RepoText.get().errorNoDefault);
                        }
-                       String remoteUrl;
+                       removeNotInGroup();
+                       removeOverlaps();
+
+                       Map<String, String> remoteUrls = new HashMap<String, String>();
+                       URI baseUri;
                        try {
-                               URI uri = new URI(baseUrl);
-                               remoteUrl = uri.resolve(remotes.get(defaultRemote)).toString();
-                               if (!remoteUrl.endsWith("/"))
-                                       remoteUrl = remoteUrl + "/";
+                               baseUri = new URI(baseUrl);
                        } catch (URISyntaxException e) {
                                throw new SAXException(e);
                        }
-                       removeNotInGroup();
-                       removeOverlaps();
                        for (Project proj : projects) {
+                               String remote = proj.remote;
+                               if (remote == null)
+                                       remote = defaultRemote;
+                               String remoteUrl = remoteUrls.get(remote);
+                               if (remoteUrl == null) {
+                                       remoteUrl = baseUri.resolve(remotes.get(remote)).toString();
+                                       if (!remoteUrl.endsWith("/"))
+                                               remoteUrl = remoteUrl + "/";
+                                       remoteUrls.put(remote, remoteUrl);
+                               }
+
                                command.addSubmodule(remoteUrl + proj.name,
                                                proj.path,
                                                proj.revision == null
@@ -819,7 +833,7 @@ public class RepoCommand extends GitCommand<RevCommit> {
        private void addSubmodule(String url, String name, String revision,
                        List<CopyFile> copyfiles) throws SAXException {
                if (repo.isBare()) {
-                       Project proj = new Project(url, name, revision, null);
+                       Project proj = new Project(url, name, revision, null, null);
                        proj.copyfiles.addAll(copyfiles);
                        bareProjects.add(proj);
                } else {