diff options
Diffstat (limited to 'org.eclipse.jgit')
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java index 7eb955006e..796b422bb2 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java @@ -80,7 +80,7 @@ public class ManifestParser extends DefaultHandler { private final String baseUrl; private final String defaultBranch; private final Repository rootRepo; - private final Map<String, String> remotes; + private final Map<String, Remote> remotes; private final Set<String> plusGroups; private final Set<String> minusGroups; private final List<RepoProject> projects; @@ -146,7 +146,7 @@ public class ManifestParser extends DefaultHandler { } } - remotes = new HashMap<String, String>(); + remotes = new HashMap<String, Remote>(); projects = new ArrayList<RepoProject>(); filteredProjects = new ArrayList<RepoProject>(); } @@ -195,14 +195,14 @@ public class ManifestParser extends DefaultHandler { } else if ("remote".equals(qName)) { //$NON-NLS-1$ String alias = attributes.getValue("alias"); //$NON-NLS-1$ String fetch = attributes.getValue("fetch"); //$NON-NLS-1$ - remotes.put(attributes.getValue("name"), fetch); //$NON-NLS-1$ + String revision = attributes.getValue("revision"); //$NON-NLS-1$ + Remote remote = new Remote(fetch, revision); + remotes.put(attributes.getValue("name"), remote); //$NON-NLS-1$ if (alias != null) - remotes.put(alias, fetch); + remotes.put(alias, remote); } else if ("default".equals(qName)) { //$NON-NLS-1$ defaultRemote = attributes.getValue("remote"); //$NON-NLS-1$ defaultRevision = attributes.getValue("revision"); //$NON-NLS-1$ - if (defaultRevision == null) - defaultRevision = defaultBranch; } else if ("copyfile".equals(qName)) { //$NON-NLS-1$ if (currentProject == null) throw new SAXException(RepoText.get().invalidManifest); @@ -268,8 +268,18 @@ public class ManifestParser extends DefaultHandler { } catch (URISyntaxException e) { throw new SAXException(e); } + if (defaultRevision == null && defaultRemote != null) { + Remote remote = remotes.get(defaultRemote); + if (remote != null) { + defaultRevision = remote.revision; + } + if (defaultRevision == null) { + defaultRevision = defaultBranch; + } + } for (RepoProject proj : projects) { String remote = proj.getRemote(); + String revision = defaultRevision; if (remote == null) { if (defaultRemote == null) { if (filename != null) @@ -281,16 +291,22 @@ public class ManifestParser extends DefaultHandler { RepoText.get().errorNoDefault); } remote = defaultRemote; + } else { + Remote r = remotes.get(remote); + if (r != null && r.revision != null) { + revision = r.revision; + } } String remoteUrl = remoteUrls.get(remote); if (remoteUrl == null) { - remoteUrl = baseUri.resolve(remotes.get(remote)).toString(); + remoteUrl = + baseUri.resolve(remotes.get(remote).fetch).toString(); if (!remoteUrl.endsWith("/")) //$NON-NLS-1$ remoteUrl = remoteUrl + "/"; //$NON-NLS-1$ remoteUrls.put(remote, remoteUrl); } proj.setUrl(remoteUrl + proj.getName()) - .setDefaultRevision(defaultRevision); + .setDefaultRevision(revision); } filteredProjects.addAll(projects); @@ -389,4 +405,14 @@ public class ManifestParser extends DefaultHandler { } return false; } + + private static class Remote { + final String fetch; + final String revision; + + Remote(String fetch, String revision) { + this.fetch = fetch; + this.revision = revision; + } + } } |