manifest_xml: prevent extend-project from inheriting local groups

When extending a project in a local manifest, the project inherits the
`local:` group. This causes the superproject override logic (which omits
projects with `local:` groups) to incorrectly exclude the project from
the override manifest. This leads to "extend-project element specifies
non-existent project" errors during sync reload.

Fix this by stripping `local:` groups from extended projects, ensuring
they remain visible to superproject overrides while still allowing other
inherited groups to persist.

Bug: 470374343
Change-Id: I1a057ebffebc11a19dc14dde7cc13b9f18cdd0a3
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/543222
Reviewed-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com>
Reviewed-by: Mike Frysinger <vapier@google.com>
Tested-by: Gavin Mak <gavinmak@google.com>
Commit-Queue: Gavin Mak <gavinmak@google.com>
diff --git a/manifest_xml.py b/manifest_xml.py
index 7987061..6989aad 100644
--- a/manifest_xml.py
+++ b/manifest_xml.py
@@ -1487,6 +1487,14 @@
                         continue
                     if groups:
                         p.groups |= groups
+                    # Drop local groups so we don't mistakenly omit this
+                    # project from the superproject override manifest.
+                    p.groups = {
+                        g
+                        for g in p.groups
+                        if not g.startswith(LOCAL_MANIFEST_GROUP_PREFIX)
+                    }
+
                     if revision:
                         if base_revision:
                             if p.revisionExpr != base_revision:
diff --git a/tests/test_manifest_xml.py b/tests/test_manifest_xml.py
index 039921f..97fea3d 100644
--- a/tests/test_manifest_xml.py
+++ b/tests/test_manifest_xml.py
@@ -549,6 +549,33 @@
         # Check project has set group via extend-project element.
         self.assertIn("eg1", proj.groups)
 
+    def test_extend_project_does_not_inherit_local_groups(self):
+        """Check that extend-project does not inherit local groups."""
+        root_m = self.manifest_dir / "root.xml"
+        root_m.write_text(
+            """
+<manifest>
+  <remote name="test-remote" fetch="http://localhost" />
+  <default remote="test-remote" revision="refs/heads/main" />
+  <project name="project1" path="project1" />
+  <include name="man1.xml" groups="g1,local:g2" />
+</manifest>
+"""
+        )
+        (self.manifest_dir / "man1.xml").write_text(
+            """
+<manifest>
+  <extend-project name="project1" groups="g3" />
+</manifest>
+"""
+        )
+        include_m = manifest_xml.XmlManifest(str(self.repodir), str(root_m))
+        proj = include_m.projects[0]
+
+        self.assertIn("g1", proj.groups)
+        self.assertNotIn("local:g2", proj.groups)
+        self.assertIn("g3", proj.groups)
+
     def test_allow_bad_name_from_user(self):
         """Check handling of bad name attribute from the user's input."""