mirror of
https://gerrit.googlesource.com/git-repo
synced 2025-01-02 16:14:25 +00:00
manifest_xml: initial support for <contactinfo>
It will be used to let manifest authors self-register contact info. This element can be repeated, and any later entries will clobber earlier ones. This would allow manifest authors who extend manifests to specify their own contact info. It would have 1 required attribute: bugurl. "bugurl" specifies the URL to file a bug against the manifest owner. <contactinfo bugurl="bug-url"/> TODO: This CL only implements the parsing logic and further work will be in followup CLs. Tested the code with the following commands. $ ./run_tests tests/test_manifest_xml.py $ ./run_tests -v Bug: [google internal] b/186220520. Change-Id: I47e765ba2dab5cdf850191129f4d4cd6b803f451 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/305203 Tested-by: Raman Tenneti <rtenneti@google.com> Reviewed-by: Mike Frysinger <vapier@google.com>
This commit is contained in:
parent
05638bf771
commit
1c3f57e8f1
@ -31,6 +31,7 @@ following DTD:
|
|||||||
extend-project*,
|
extend-project*,
|
||||||
repo-hooks?,
|
repo-hooks?,
|
||||||
superproject?,
|
superproject?,
|
||||||
|
contactinfo?,
|
||||||
include*)>
|
include*)>
|
||||||
|
|
||||||
<!ELEMENT notice (#PCDATA)>
|
<!ELEMENT notice (#PCDATA)>
|
||||||
@ -100,10 +101,13 @@ following DTD:
|
|||||||
<!ATTLIST repo-hooks in-project CDATA #REQUIRED>
|
<!ATTLIST repo-hooks in-project CDATA #REQUIRED>
|
||||||
<!ATTLIST repo-hooks enabled-list CDATA #REQUIRED>
|
<!ATTLIST repo-hooks enabled-list CDATA #REQUIRED>
|
||||||
|
|
||||||
<!ELEMENT superproject (EMPTY)>
|
<!ELEMENT superproject EMPTY>
|
||||||
<!ATTLIST superproject name CDATA #REQUIRED>
|
<!ATTLIST superproject name CDATA #REQUIRED>
|
||||||
<!ATTLIST superproject remote IDREF #IMPLIED>
|
<!ATTLIST superproject remote IDREF #IMPLIED>
|
||||||
|
|
||||||
|
<!ELEMENT contactinfo EMPTY>
|
||||||
|
<!ATTLIST contactinfo bugurl CDATA #REQUIRED>
|
||||||
|
|
||||||
<!ELEMENT include EMPTY>
|
<!ELEMENT include EMPTY>
|
||||||
<!ATTLIST include name CDATA #REQUIRED>
|
<!ATTLIST include name CDATA #REQUIRED>
|
||||||
<!ATTLIST include groups CDATA #IMPLIED>
|
<!ATTLIST include groups CDATA #IMPLIED>
|
||||||
@ -405,7 +409,7 @@ Attribute `enabled-list`: List of hooks to use, whitespace or comma separated.
|
|||||||
### Element superproject
|
### Element superproject
|
||||||
|
|
||||||
***
|
***
|
||||||
*Note*: This is currently a WIP.
|
*Note*: This is currently a WIP.
|
||||||
***
|
***
|
||||||
|
|
||||||
NB: See the [git superprojects documentation](
|
NB: See the [git superprojects documentation](
|
||||||
@ -424,6 +428,19 @@ same meaning as project's name attribute. See the
|
|||||||
Attribute `remote`: Name of a previously defined remote element.
|
Attribute `remote`: Name of a previously defined remote element.
|
||||||
If not supplied the remote given by the default element is used.
|
If not supplied the remote given by the default element is used.
|
||||||
|
|
||||||
|
### Element contactinfo
|
||||||
|
|
||||||
|
***
|
||||||
|
*Note*: This is currently a WIP.
|
||||||
|
***
|
||||||
|
|
||||||
|
This element is used to let manifest authors self-register contact info.
|
||||||
|
It has "bugurl" as a required atrribute. This element can be repeated,
|
||||||
|
and any later entries will clobber earlier ones. This would allow manifest
|
||||||
|
authors who extend manifests to specify their own contact info.
|
||||||
|
|
||||||
|
Attribute `bugurl`: The URL to file a bug against the manifest owner.
|
||||||
|
|
||||||
### Element include
|
### Element include
|
||||||
|
|
||||||
This element provides the capability of including another manifest
|
This element provides the capability of including another manifest
|
||||||
|
@ -479,6 +479,12 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
|
|||||||
e.setAttribute('remote', remoteName)
|
e.setAttribute('remote', remoteName)
|
||||||
root.appendChild(e)
|
root.appendChild(e)
|
||||||
|
|
||||||
|
if self._contactinfo:
|
||||||
|
root.appendChild(doc.createTextNode(''))
|
||||||
|
e = doc.createElement('contactinfo')
|
||||||
|
e.setAttribute('bugurl', self._contactinfo['bugurl'])
|
||||||
|
root.appendChild(e)
|
||||||
|
|
||||||
return doc
|
return doc
|
||||||
|
|
||||||
def ToDict(self, **kwargs):
|
def ToDict(self, **kwargs):
|
||||||
@ -490,6 +496,7 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
|
|||||||
'manifest-server',
|
'manifest-server',
|
||||||
'repo-hooks',
|
'repo-hooks',
|
||||||
'superproject',
|
'superproject',
|
||||||
|
'contactinfo',
|
||||||
}
|
}
|
||||||
# Elements that may be repeated.
|
# Elements that may be repeated.
|
||||||
MULTI_ELEMENTS = {
|
MULTI_ELEMENTS = {
|
||||||
@ -565,6 +572,11 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
|
|||||||
self._Load()
|
self._Load()
|
||||||
return self._superproject
|
return self._superproject
|
||||||
|
|
||||||
|
@property
|
||||||
|
def contactinfo(self):
|
||||||
|
self._Load()
|
||||||
|
return self._contactinfo
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def notice(self):
|
def notice(self):
|
||||||
self._Load()
|
self._Load()
|
||||||
@ -634,6 +646,7 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
|
|||||||
self._default = None
|
self._default = None
|
||||||
self._repo_hooks_project = None
|
self._repo_hooks_project = None
|
||||||
self._superproject = {}
|
self._superproject = {}
|
||||||
|
self._contactinfo = {}
|
||||||
self._notice = None
|
self._notice = None
|
||||||
self.branch = None
|
self.branch = None
|
||||||
self._manifest_server = None
|
self._manifest_server = None
|
||||||
@ -876,6 +889,10 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
|
|||||||
raise ManifestParseError("no remote for superproject %s within %s" %
|
raise ManifestParseError("no remote for superproject %s within %s" %
|
||||||
(name, self.manifestFile))
|
(name, self.manifestFile))
|
||||||
self._superproject['remote'] = remote.ToRemoteSpec(name)
|
self._superproject['remote'] = remote.ToRemoteSpec(name)
|
||||||
|
if node.nodeName == 'contactinfo':
|
||||||
|
bugurl = self._reqatt(node, 'bugurl')
|
||||||
|
# This element can be repeated, later entries will clobber earlier ones.
|
||||||
|
self._contactinfo['bugurl'] = bugurl
|
||||||
if node.nodeName == 'remove-project':
|
if node.nodeName == 'remove-project':
|
||||||
name = self._reqatt(node, 'name')
|
name = self._reqatt(node, 'name')
|
||||||
|
|
||||||
|
@ -255,10 +255,10 @@ class XmlManifestTests(ManifestParseTestCase):
|
|||||||
self.assertEqual(manifest.superproject['remote'].name, 'test-remote')
|
self.assertEqual(manifest.superproject['remote'].name, 'test-remote')
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
manifest.ToXml().toxml(),
|
manifest.ToXml().toxml(),
|
||||||
'<?xml version="1.0" ?><manifest>' +
|
'<?xml version="1.0" ?><manifest>'
|
||||||
'<remote name="test-remote" fetch="http://localhost"/>' +
|
'<remote name="test-remote" fetch="http://localhost"/>'
|
||||||
'<default remote="test-remote" revision="refs/heads/main"/>' +
|
'<default remote="test-remote" revision="refs/heads/main"/>'
|
||||||
'<superproject name="superproject"/>' +
|
'<superproject name="superproject"/>'
|
||||||
'</manifest>')
|
'</manifest>')
|
||||||
|
|
||||||
|
|
||||||
@ -409,10 +409,10 @@ class ProjectElementTests(ManifestParseTestCase):
|
|||||||
project.SetRevisionId('ABCDEF')
|
project.SetRevisionId('ABCDEF')
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
manifest.ToXml().toxml(),
|
manifest.ToXml().toxml(),
|
||||||
'<?xml version="1.0" ?><manifest>' +
|
'<?xml version="1.0" ?><manifest>'
|
||||||
'<remote name="default-remote" fetch="http://localhost"/>' +
|
'<remote name="default-remote" fetch="http://localhost"/>'
|
||||||
'<default remote="default-remote" revision="refs/heads/main"/>' +
|
'<default remote="default-remote" revision="refs/heads/main"/>'
|
||||||
'<project name="test-name" revision="ABCDEF"/>' +
|
'<project name="test-name" revision="ABCDEF"/>'
|
||||||
'</manifest>')
|
'</manifest>')
|
||||||
|
|
||||||
def test_trailing_slash(self):
|
def test_trailing_slash(self):
|
||||||
@ -517,10 +517,10 @@ class SuperProjectElementTests(ManifestParseTestCase):
|
|||||||
self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/superproject')
|
self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/superproject')
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
manifest.ToXml().toxml(),
|
manifest.ToXml().toxml(),
|
||||||
'<?xml version="1.0" ?><manifest>' +
|
'<?xml version="1.0" ?><manifest>'
|
||||||
'<remote name="test-remote" fetch="http://localhost"/>' +
|
'<remote name="test-remote" fetch="http://localhost"/>'
|
||||||
'<default remote="test-remote" revision="refs/heads/main"/>' +
|
'<default remote="test-remote" revision="refs/heads/main"/>'
|
||||||
'<superproject name="superproject"/>' +
|
'<superproject name="superproject"/>'
|
||||||
'</manifest>')
|
'</manifest>')
|
||||||
|
|
||||||
def test_remote(self):
|
def test_remote(self):
|
||||||
@ -538,11 +538,11 @@ class SuperProjectElementTests(ManifestParseTestCase):
|
|||||||
self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/platform/superproject')
|
self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/platform/superproject')
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
manifest.ToXml().toxml(),
|
manifest.ToXml().toxml(),
|
||||||
'<?xml version="1.0" ?><manifest>' +
|
'<?xml version="1.0" ?><manifest>'
|
||||||
'<remote name="default-remote" fetch="http://localhost"/>' +
|
'<remote name="default-remote" fetch="http://localhost"/>'
|
||||||
'<remote name="superproject-remote" fetch="http://localhost"/>' +
|
'<remote name="superproject-remote" fetch="http://localhost"/>'
|
||||||
'<default remote="default-remote" revision="refs/heads/main"/>' +
|
'<default remote="default-remote" revision="refs/heads/main"/>'
|
||||||
'<superproject name="platform/superproject" remote="superproject-remote"/>' +
|
'<superproject name="platform/superproject" remote="superproject-remote"/>'
|
||||||
'</manifest>')
|
'</manifest>')
|
||||||
|
|
||||||
def test_defalut_remote(self):
|
def test_defalut_remote(self):
|
||||||
@ -558,8 +558,25 @@ class SuperProjectElementTests(ManifestParseTestCase):
|
|||||||
self.assertEqual(manifest.superproject['remote'].name, 'default-remote')
|
self.assertEqual(manifest.superproject['remote'].name, 'default-remote')
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
manifest.ToXml().toxml(),
|
manifest.ToXml().toxml(),
|
||||||
'<?xml version="1.0" ?><manifest>' +
|
'<?xml version="1.0" ?><manifest>'
|
||||||
'<remote name="default-remote" fetch="http://localhost"/>' +
|
'<remote name="default-remote" fetch="http://localhost"/>'
|
||||||
'<default remote="default-remote" revision="refs/heads/main"/>' +
|
'<default remote="default-remote" revision="refs/heads/main"/>'
|
||||||
'<superproject name="superproject"/>' +
|
'<superproject name="superproject"/>'
|
||||||
'</manifest>')
|
'</manifest>')
|
||||||
|
|
||||||
|
|
||||||
|
class ContactinfoElementTests(ManifestParseTestCase):
|
||||||
|
"""Tests for <contactinfo>."""
|
||||||
|
|
||||||
|
def test_contactinfo(self):
|
||||||
|
"""Check contactinfo settings."""
|
||||||
|
bugurl = 'http://localhost/contactinfo'
|
||||||
|
manifest = self.getXmlManifest(f"""
|
||||||
|
<manifest>
|
||||||
|
<contactinfo bugurl="{bugurl}"/>
|
||||||
|
</manifest>
|
||||||
|
""")
|
||||||
|
self.assertEqual(manifest.contactinfo['bugurl'], bugurl)
|
||||||
|
self.assertEqual(
|
||||||
|
manifest.ToXml().toxml(),
|
||||||
|
f"""<?xml version="1.0" ?><manifest><contactinfo bugurl="{bugurl}"/></manifest>""")
|
||||||
|
Loading…
Reference in New Issue
Block a user