diff --git a/docs/manifest-format.md b/docs/manifest-format.md index bcdf5a8e..edcb28cb 100644 --- a/docs/manifest-format.md +++ b/docs/manifest-format.md @@ -125,8 +125,9 @@ following DTD: - - + + + ]> ``` @@ -553,6 +554,9 @@ in the included manifest belong. This appends and recurses, meaning all projects in included manifests carry all parent include groups. Same syntax as the corresponding element of `project`. +Attribute `revision`: Name of a Git branch (e.g. `main` or `refs/heads/main`) +default to which all projects in the included manifest belong. + ## Local Manifests {#local-manifests} Additional remotes and projects may be added through local manifest diff --git a/manifest_xml.py b/manifest_xml.py index 9603906f..14b03a30 100644 --- a/manifest_xml.py +++ b/manifest_xml.py @@ -1233,7 +1233,12 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md ) def _ParseManifestXml( - self, path, include_root, parent_groups="", restrict_includes=True + self, + path, + include_root, + parent_groups="", + restrict_includes=True, + parent_node=None, ): """Parse a manifest XML and return the computed nodes. @@ -1243,6 +1248,8 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md parent_groups: The groups to apply to this projects. restrict_includes: Whether to constrain the "name" attribute of includes. + parent_node: The parent include node, to apply attribute to this + projects. Returns: List of XML nodes. @@ -1288,7 +1295,9 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md ) try: nodes.extend( - self._ParseManifestXml(fp, include_root, include_groups) + self._ParseManifestXml( + fp, include_root, include_groups, parent_node=node + ) ) # should isolate this to the exact exception, but that's # tricky. actual parsing implementation may vary. @@ -1311,6 +1320,14 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md node.getAttribute("groups") + "," + nodeGroups ) node.setAttribute("groups", nodeGroups) + if ( + parent_node + and node.nodeName == "project" + and not node.hasAttribute("revision") + ): + node.setAttribute( + "revision", parent_node.getAttribute("revision") + ) nodes.append(node) return nodes diff --git a/tests/test_manifest_xml.py b/tests/test_manifest_xml.py index 648acde8..ef511055 100644 --- a/tests/test_manifest_xml.py +++ b/tests/test_manifest_xml.py @@ -389,6 +389,45 @@ class XmlManifestTests(ManifestParseTestCase): class IncludeElementTests(ManifestParseTestCase): """Tests for .""" + def test_revision_default(self): + """Check handling of revision attribute.""" + root_m = os.path.join(self.manifest_dir, "root.xml") + with open(root_m, "w") as fp: + fp.write( + """ + + + + + + + +""" + ) + with open(os.path.join(self.manifest_dir, "stable.xml"), "w") as fp: + fp.write( + """ + + + + +""" + ) + include_m = manifest_xml.XmlManifest(self.repodir, root_m) + for proj in include_m.projects: + if proj.name == "root-name1": + # Check include revision not set on root level proj. + self.assertNotEqual("stable-branch", proj.revisionExpr) + if proj.name == "root-name2": + # Check root proj revision not removed. + self.assertEqual("refs/heads/main", proj.revisionExpr) + if proj.name == "stable-name1": + # Check stable proj has inherited revision include node. + self.assertEqual("stable-branch", proj.revisionExpr) + if proj.name == "stable-name2": + # Check stable proj revision can override include node. + self.assertEqual("stable-branch2", proj.revisionExpr) + def test_group_levels(self): root_m = os.path.join(self.manifest_dir, "root.xml") with open(root_m, "w") as fp: