From 7960fa87354aedbde0c1fedc771346286d6cac06 Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Wed, 27 Jan 2016 15:01:47 -0800 Subject: [PATCH] [gitrepo] Support revision in remote tag. Repo manifest file allows revision attribute in tag. This change teaches JGit to read that information. Change-Id: I1c878a2505b9d09fa09fbd404a119b71f2fb8fdb Signed-off-by: Yuxuan 'fishy' Wang --- .../eclipse/jgit/gitrepo/RepoCommandTest.java | 53 +++++++++++++++++++ .../eclipse/jgit/gitrepo/ManifestParser.java | 42 ++++++++++++--- 2 files changed, 87 insertions(+), 8 deletions(-) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/RepoCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/RepoCommandTest.java index 524d0b8e7..164c4ba4e 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/RepoCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/RepoCommandTest.java @@ -747,6 +747,59 @@ public void testRecordRemoteBranch() throws Exception { } } + @Test + public void testRemoteRevision() throws Exception { + StringBuilder xmlContent = new StringBuilder(); + xmlContent.append("\n") + .append("") + .append("") + .append("") + .append("") + .append("") + .append(""); + 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("\n") + .append("") + .append("") + .append("") + .append("") + .append(""); + 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(); 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 7eb955006..796b422bb 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 remotes; + private final Map remotes; private final Set plusGroups; private final Set minusGroups; private final List projects; @@ -146,7 +146,7 @@ public ManifestParser(IncludedFileReader includedReader, String filename, } } - remotes = new HashMap(); + remotes = new HashMap(); projects = new ArrayList(); filteredProjects = new ArrayList(); } @@ -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; + } + } }