]> source.dussan.org Git - jgit.git/commitdiff
RepoProject: read the "upstream" attribute of a project 28/1195528/2
authorIvan Frade <ifrade@google.com>
Thu, 30 May 2024 17:56:20 +0000 (10:56 -0700)
committerIvan Frade <ifrade@google.com>
Thu, 30 May 2024 21:17:53 +0000 (14:17 -0700)
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

org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/ManifestParserTest.java
org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java
org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoProject.java

index 20958a812c7e59d396144d45eb4d540a282ca2ed..76176fe34773f7b90ee714d7799f209c842a359b 100644 (file)
@@ -11,6 +11,7 @@ package org.eclipse.jgit.gitrepo;
 
 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.ByteArrayInputStream;
 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 class ManifestParserTest {
                                                .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)) {
index 957b3869f21f53d0135877e3e6e03aca7620ea44..7402c760c3fc6035bcf8a0cf375328531e837fd4 100644 (file)
@@ -176,6 +176,8 @@ public class ManifestParser extends DefaultHandler {
                                        attributes.getValue("groups"));
                        currentProject
                                        .setRecommendShallow(attributes.getValue("clone-depth"));
+                       currentProject
+                                       .setUpstream(attributes.getValue("upstream"));
                        break;
                case "remote":
                        String alias = attributes.getValue("alias");
index 8deb7386a632991bbd0bfad42fe5fc21eb6e943c..aa1af21d2326436fd9291587fc010cca88e4359d 100644 (file)
@@ -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 class RepoProject implements Comparable<RepoProject> {
                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;