mirror of
https://gerrit.googlesource.com/git-repo
synced 2024-12-21 07:16:21 +00:00
Gracefully ignore bad remove-project line
Sometimes, we don't care if the remove project is referring to a non-existing project and we can just ignore it. This change allows us to ignore remove-project entries if the project that they refer to doesn't exist, making them effectively a no-op. Because this change breaks existing configuration, we allow this to be configuration controlled using the `optional` attribute in the remove-project tag. Change-Id: I6313a02983e81344eadcb4e47d7d6b037ee7420e Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/310964 Tested-by: Michael Kelly <mkelly@arista.com> Reviewed-by: Mike Frysinger <vapier@google.com>
This commit is contained in:
parent
5892973212
commit
06da9987f6
@ -96,6 +96,7 @@ following DTD:
|
|||||||
|
|
||||||
<!ELEMENT remove-project EMPTY>
|
<!ELEMENT remove-project EMPTY>
|
||||||
<!ATTLIST remove-project name CDATA #REQUIRED>
|
<!ATTLIST remove-project name CDATA #REQUIRED>
|
||||||
|
<!ATTLIST remove-project optional CDATA #IMPLIED>
|
||||||
|
|
||||||
<!ELEMENT repo-hooks EMPTY>
|
<!ELEMENT repo-hooks EMPTY>
|
||||||
<!ATTLIST repo-hooks in-project CDATA #REQUIRED>
|
<!ATTLIST repo-hooks in-project CDATA #REQUIRED>
|
||||||
@ -393,6 +394,9 @@ This element is mostly useful in a local manifest file, where
|
|||||||
the user can remove a project, and possibly replace it with their
|
the user can remove a project, and possibly replace it with their
|
||||||
own definition.
|
own definition.
|
||||||
|
|
||||||
|
Attribute `optional`: Set to true to ignore remove-project elements with no
|
||||||
|
matching `project` element.
|
||||||
|
|
||||||
### Element repo-hooks
|
### Element repo-hooks
|
||||||
|
|
||||||
NB: See the [practical documentation](./repo-hooks.md) for using repo hooks.
|
NB: See the [practical documentation](./repo-hooks.md) for using repo hooks.
|
||||||
|
@ -918,10 +918,7 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
|
|||||||
if node.nodeName == 'remove-project':
|
if node.nodeName == 'remove-project':
|
||||||
name = self._reqatt(node, 'name')
|
name = self._reqatt(node, 'name')
|
||||||
|
|
||||||
if name not in self._projects:
|
if name in self._projects:
|
||||||
raise ManifestParseError('remove-project element specifies non-existent '
|
|
||||||
'project: %s' % name)
|
|
||||||
|
|
||||||
for p in self._projects[name]:
|
for p in self._projects[name]:
|
||||||
del self._paths[p.relpath]
|
del self._paths[p.relpath]
|
||||||
del self._projects[name]
|
del self._projects[name]
|
||||||
@ -930,6 +927,9 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
|
|||||||
# the repo-hooks element too.
|
# the repo-hooks element too.
|
||||||
if self._repo_hooks_project and (self._repo_hooks_project.name == name):
|
if self._repo_hooks_project and (self._repo_hooks_project.name == name):
|
||||||
self._repo_hooks_project = None
|
self._repo_hooks_project = None
|
||||||
|
elif not XmlBool(node, 'optional', False):
|
||||||
|
raise ManifestParseError('remove-project element specifies non-existent '
|
||||||
|
'project: %s' % name)
|
||||||
|
|
||||||
def _AddMetaProjectMirror(self, m):
|
def _AddMetaProjectMirror(self, m):
|
||||||
name = None
|
name = None
|
||||||
|
@ -638,3 +638,53 @@ class RemoteElementTests(ManifestParseTestCase):
|
|||||||
self.assertNotEqual(a, manifest_xml._Default())
|
self.assertNotEqual(a, manifest_xml._Default())
|
||||||
self.assertNotEqual(a, 123)
|
self.assertNotEqual(a, 123)
|
||||||
self.assertNotEqual(a, None)
|
self.assertNotEqual(a, None)
|
||||||
|
|
||||||
|
|
||||||
|
class RemoveProjectElementTests(ManifestParseTestCase):
|
||||||
|
"""Tests for <remove-project>."""
|
||||||
|
|
||||||
|
def test_remove_one_project(self):
|
||||||
|
manifest = self.getXmlManifest("""
|
||||||
|
<manifest>
|
||||||
|
<remote name="default-remote" fetch="http://localhost" />
|
||||||
|
<default remote="default-remote" revision="refs/heads/main" />
|
||||||
|
<project name="myproject" />
|
||||||
|
<remove-project name="myproject" />
|
||||||
|
</manifest>
|
||||||
|
""")
|
||||||
|
self.assertEqual(manifest.projects, [])
|
||||||
|
|
||||||
|
def test_remove_one_project_one_remains(self):
|
||||||
|
manifest = self.getXmlManifest("""
|
||||||
|
<manifest>
|
||||||
|
<remote name="default-remote" fetch="http://localhost" />
|
||||||
|
<default remote="default-remote" revision="refs/heads/main" />
|
||||||
|
<project name="myproject" />
|
||||||
|
<project name="yourproject" />
|
||||||
|
<remove-project name="myproject" />
|
||||||
|
</manifest>
|
||||||
|
""")
|
||||||
|
|
||||||
|
self.assertEqual(len(manifest.projects), 1)
|
||||||
|
self.assertEqual(manifest.projects[0].name, 'yourproject')
|
||||||
|
|
||||||
|
def test_remove_one_project_doesnt_exist(self):
|
||||||
|
with self.assertRaises(manifest_xml.ManifestParseError):
|
||||||
|
manifest = self.getXmlManifest("""
|
||||||
|
<manifest>
|
||||||
|
<remote name="default-remote" fetch="http://localhost" />
|
||||||
|
<default remote="default-remote" revision="refs/heads/main" />
|
||||||
|
<remove-project name="myproject" />
|
||||||
|
</manifest>
|
||||||
|
""")
|
||||||
|
manifest.projects
|
||||||
|
|
||||||
|
def test_remove_one_optional_project_doesnt_exist(self):
|
||||||
|
manifest = self.getXmlManifest("""
|
||||||
|
<manifest>
|
||||||
|
<remote name="default-remote" fetch="http://localhost" />
|
||||||
|
<default remote="default-remote" revision="refs/heads/main" />
|
||||||
|
<remove-project name="myproject" optional="true" />
|
||||||
|
</manifest>
|
||||||
|
""")
|
||||||
|
self.assertEqual(manifest.projects, [])
|
||||||
|
Loading…
Reference in New Issue
Block a user