[gitrepo] Support revision in remote tag.
Repo manifest file allows revision attribute in <remote> tag. This change teaches JGit to read that information. Change-Id: I1c878a2505b9d09fa09fbd404a119b71f2fb8fdb Signed-off-by: Yuxuan 'fishy' Wang <fishywang@google.com>
This commit is contained in:
parent
114ee5a613
commit
7960fa8735
|
@ -747,6 +747,59 @@ public void testRecordRemoteBranch() throws Exception {
|
|||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRemoteRevision() 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=\".\" revision=\"")
|
||||
.append(BRANCH)
|
||||
.append("\" />")
|
||||
.append("<default remote=\"remote1\" revision=\"master\" />")
|
||||
.append("<project path=\"foo\" remote=\"remote2\" name=\"")
|
||||
.append(defaultUri)
|
||||
.append("\" />")
|
||||
.append("</manifest>");
|
||||
writeTrashFile("manifest.xml", xmlContent.toString());
|
||||
RepoCommand command = new RepoCommand(db);
|
||||
command.setPath(db.getWorkTree().getAbsolutePath() + "/manifest.xml")
|
||||
.setURI(rootUri)
|
||||
.call();
|
||||
File hello = new File(db.getWorkTree(), "foo/hello.txt");
|
||||
BufferedReader reader = new BufferedReader(new FileReader(hello));
|
||||
String content = reader.readLine();
|
||||
reader.close();
|
||||
assertEquals("submodule content should be as expected",
|
||||
"branch world", content);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDefaultRemoteRevision() throws Exception {
|
||||
StringBuilder xmlContent = new StringBuilder();
|
||||
xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
|
||||
.append("<manifest>")
|
||||
.append("<remote name=\"remote1\" fetch=\".\" revision=\"")
|
||||
.append(BRANCH)
|
||||
.append("\" />")
|
||||
.append("<default remote=\"remote1\" />")
|
||||
.append("<project path=\"foo\" name=\"")
|
||||
.append(defaultUri)
|
||||
.append("\" />")
|
||||
.append("</manifest>");
|
||||
writeTrashFile("manifest.xml", xmlContent.toString());
|
||||
RepoCommand command = new RepoCommand(db);
|
||||
command.setPath(db.getWorkTree().getAbsolutePath() + "/manifest.xml")
|
||||
.setURI(rootUri)
|
||||
.call();
|
||||
File hello = new File(db.getWorkTree(), "foo/hello.txt");
|
||||
BufferedReader reader = new BufferedReader(new FileReader(hello));
|
||||
String content = reader.readLine();
|
||||
reader.close();
|
||||
assertEquals("submodule content should be as expected",
|
||||
"branch world", content);
|
||||
}
|
||||
|
||||
private void resolveRelativeUris() {
|
||||
// Find the longest common prefix ends with "/" as rootUri.
|
||||
defaultUri = defaultDb.getDirectory().toURI().toString();
|
||||
|
|
|
@ -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 ManifestParser(IncludedFileReader includedReader, String filename,
|
|||
}
|
||||
}
|
||||
|
||||
remotes = new HashMap<String, String>();
|
||||
remotes = new HashMap<String, Remote>();
|
||||
projects = new ArrayList<RepoProject>();
|
||||
filteredProjects = new ArrayList<RepoProject>();
|
||||
}
|
||||
|
@ -195,14 +195,14 @@ public void startElement(
|
|||
} 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 void endDocument() throws SAXException {
|
|||
} 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 void endDocument() throws SAXException {
|
|||
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 @@ private boolean isNestedCopyfile(CopyFile copyfile) {
|
|||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static class Remote {
|
||||
final String fetch;
|
||||
final String revision;
|
||||
|
||||
Remote(String fetch, String revision) {
|
||||
this.fetch = fetch;
|
||||
this.revision = revision;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue