Skip to content
Snippets Groups Projects
Commit e5534111 authored by Ivan Frade's avatar Ivan Frade Committed by Matthias Sohn
Browse files

RepoProject: read the "upstream" attribute of a project

The manifest spec [1] defines the "upstream" attribute: "name of the
git ref in which a sha1 can be found", when the revision is a
sha1. The parser is ignoring it, but RepoCommand could use it to
populate the "ref=" field of pinned submodules.

Parse the value and store it in the RepoProject.

RepoProject is public API and the current constructors are not
telescopic, so we cannot just add a new constructor with an extra
argument. Use plain getter/setters.j

[1] https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.md#Element-project

Change-Id: Ia50b85b95bfd3710f9fbda2050be5950dd686941
(cherry picked from commit 1dd6324d)
parent e0ff3986
No related branches found
No related tags found
No related merge requests found
......@@ -11,6 +11,7 @@
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
......@@ -18,7 +19,9 @@
import java.io.IOException;
import java.net.URI;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
......@@ -138,6 +141,42 @@ public void testRemoveProject() throws Exception {
.collect(Collectors.toSet()));
}
@Test
public void testPinProjectWithUpstream() throws Exception {
StringBuilder xmlContent = new StringBuilder();
xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
.append("<manifest>")
.append("<remote name=\"remote1\" fetch=\".\" />")
.append("<default revision=\"master\" remote=\"remote1\" />")
.append("<project path=\"foo\" name=\"pin-with-upstream\"")
.append(" revision=\"9b2fe85c0279f4d5ac69f07ddcd48566c3555405\"")
.append(" upstream=\"branchX\"/>")
.append("<project path=\"bar\" name=\"pin-without-upstream\"")
.append(" revision=\"76ce6d91a2e07fdfcbfc8df6970c9e98a98e36a0\" />")
.append("</manifest>");
ManifestParser parser = new ManifestParser(null, null, "master",
"https://git.google.com/", null, null);
parser.read(new ByteArrayInputStream(
xmlContent.toString().getBytes(UTF_8)));
Map<String, RepoProject> repos = parser.getProjects().stream().collect(
Collectors.toMap(RepoProject::getName, Function.identity()));
assertEquals(2, repos.size());
RepoProject foo = repos.get("pin-with-upstream");
assertEquals("pin-with-upstream", foo.getName());
assertEquals("9b2fe85c0279f4d5ac69f07ddcd48566c3555405",
foo.getRevision());
assertEquals("branchX", foo.getUpstream());
RepoProject bar = repos.get("pin-without-upstream");
assertEquals("pin-without-upstream", bar.getName());
assertEquals("76ce6d91a2e07fdfcbfc8df6970c9e98a98e36a0",
bar.getRevision());
assertNull(bar.getUpstream());
}
void testNormalize(String in, String want) {
URI got = ManifestParser.normalizeEmptyPath(URI.create(in));
if (!got.toString().equals(want)) {
......
......@@ -176,6 +176,8 @@ public void startElement(
attributes.getValue("groups"));
currentProject
.setRecommendShallow(attributes.getValue("clone-depth"));
currentProject
.setUpstream(attributes.getValue("upstream"));
break;
case "remote":
String alias = attributes.getValue("alias");
......
......@@ -38,6 +38,7 @@ public class RepoProject implements Comparable<RepoProject> {
private final Set<String> groups;
private final List<CopyFile> copyfiles;
private final List<LinkFile> linkfiles;
private String upstream;
private String recommendShallow;
private String url;
private String defaultRevision;
......@@ -389,6 +390,31 @@ public void clearLinkFiles() {
this.linkfiles.clear();
}
/**
* Return the upstream attribute of the project
*
* @return the upstream value if present, null otherwise.
*
* @since 6.10
*/
public String getUpstream() {
return this.upstream;
}
/**
* Set the upstream attribute of the project
*
* Name of the git ref in which a sha1 can be found, when the revision is a
* sha1.
*
* @param upstream value of the attribute in the manifest
*
* @since 6.10
*/
void setUpstream(String upstream) {
this.upstream = upstream;
}
private String getPathWithSlash() {
if (path.endsWith("/")) { //$NON-NLS-1$
return path;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment