summaryrefslogtreecommitdiffstats
path: root/manifest_xml.py
diff options
context:
space:
mode:
authorJack Neus <jackneus@google.com>2021-07-20 20:52:33 +0000
committerJack Neus <jackneus@google.com>2021-07-23 18:03:11 +0000
commit6ea0caea86f4c6b1f934b682a3aa7722e98a46f9 (patch)
treef54707aa6778f60078aef727210669f22f87de4e /manifest_xml.py
parent8e983bbc0f5f48aa38d0e1c5a37766ce121d28eb (diff)
downloadgit-repo-6ea0caea86f4c6b1f934b682a3aa7722e98a46f9.tar.gz
repo: properly handle remote annotations in manifest_xml
BUG=b:192664812 TEST=tests/ Change-Id: I1aa50260f4a00d3cebbd531141e1626825e70127 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/312643 Tested-by: Jack Neus <jackneus@google.com> Reviewed-by: Mike Frysinger <vapier@google.com>
Diffstat (limited to 'manifest_xml.py')
-rw-r--r--manifest_xml.py35
1 files changed, 27 insertions, 8 deletions
diff --git a/manifest_xml.py b/manifest_xml.py
index 22758cfd..55ad6c08 100644
--- a/manifest_xml.py
+++ b/manifest_xml.py
@@ -25,7 +25,7 @@ import gitc_utils
25from git_config import GitConfig, IsId 25from git_config import GitConfig, IsId
26from git_refs import R_HEADS, HEAD 26from git_refs import R_HEADS, HEAD
27import platform_utils 27import platform_utils
28from project import RemoteSpec, Project, MetaProject 28from project import Annotation, RemoteSpec, Project, MetaProject
29from error import (ManifestParseError, ManifestInvalidPathError, 29from error import (ManifestParseError, ManifestInvalidPathError,
30 ManifestInvalidRevisionError) 30 ManifestInvalidRevisionError)
31from wrapper import Wrapper 31from wrapper import Wrapper
@@ -149,16 +149,18 @@ class _XmlRemote(object):
149 self.reviewUrl = review 149 self.reviewUrl = review
150 self.revision = revision 150 self.revision = revision
151 self.resolvedFetchUrl = self._resolveFetchUrl() 151 self.resolvedFetchUrl = self._resolveFetchUrl()
152 self.annotations = []
152 153
153 def __eq__(self, other): 154 def __eq__(self, other):
154 if not isinstance(other, _XmlRemote): 155 if not isinstance(other, _XmlRemote):
155 return False 156 return False
156 return self.__dict__ == other.__dict__ 157 return (sorted(self.annotations) == sorted(other.annotations) and
158 self.name == other.name and self.fetchUrl == other.fetchUrl and
159 self.pushUrl == other.pushUrl and self.remoteAlias == other.remoteAlias
160 and self.reviewUrl == other.reviewUrl and self.revision == other.revision)
157 161
158 def __ne__(self, other): 162 def __ne__(self, other):
159 if not isinstance(other, _XmlRemote): 163 return not self.__eq__(other)
160 return True
161 return self.__dict__ != other.__dict__
162 164
163 def _resolveFetchUrl(self): 165 def _resolveFetchUrl(self):
164 if self.fetchUrl is None: 166 if self.fetchUrl is None:
@@ -191,6 +193,9 @@ class _XmlRemote(object):
191 orig_name=self.name, 193 orig_name=self.name,
192 fetchUrl=self.fetchUrl) 194 fetchUrl=self.fetchUrl)
193 195
196 def AddAnnotation(self, name, value, keep):
197 self.annotations.append(Annotation(name, value, keep))
198
194 199
195class XmlManifest(object): 200class XmlManifest(object):
196 """manages the repo configuration file""" 201 """manages the repo configuration file"""
@@ -300,6 +305,13 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
300 if r.revision is not None: 305 if r.revision is not None:
301 e.setAttribute('revision', r.revision) 306 e.setAttribute('revision', r.revision)
302 307
308 for a in r.annotations:
309 if a.keep == 'true':
310 ae = doc.createElement('annotation')
311 ae.setAttribute('name', a.name)
312 ae.setAttribute('value', a.value)
313 e.appendChild(ae)
314
303 def _ParseList(self, field): 315 def _ParseList(self, field):
304 """Parse fields that contain flattened lists. 316 """Parse fields that contain flattened lists.
305 317
@@ -995,7 +1007,14 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
995 if revision == '': 1007 if revision == '':
996 revision = None 1008 revision = None
997 manifestUrl = self.manifestProject.config.GetString('remote.origin.url') 1009 manifestUrl = self.manifestProject.config.GetString('remote.origin.url')
998 return _XmlRemote(name, alias, fetch, pushUrl, manifestUrl, review, revision) 1010
1011 remote = _XmlRemote(name, alias, fetch, pushUrl, manifestUrl, review, revision)
1012
1013 for n in node.childNodes:
1014 if n.nodeName == 'annotation':
1015 self._ParseAnnotation(remote, n)
1016
1017 return remote
999 1018
1000 def _ParseDefault(self, node): 1019 def _ParseDefault(self, node):
1001 """ 1020 """
@@ -1362,7 +1381,7 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
1362 self._ValidateFilePaths('linkfile', src, dest) 1381 self._ValidateFilePaths('linkfile', src, dest)
1363 project.AddLinkFile(src, dest, self.topdir) 1382 project.AddLinkFile(src, dest, self.topdir)
1364 1383
1365 def _ParseAnnotation(self, project, node): 1384 def _ParseAnnotation(self, element, node):
1366 name = self._reqatt(node, 'name') 1385 name = self._reqatt(node, 'name')
1367 value = self._reqatt(node, 'value') 1386 value = self._reqatt(node, 'value')
1368 try: 1387 try:
@@ -1372,7 +1391,7 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
1372 if keep != "true" and keep != "false": 1391 if keep != "true" and keep != "false":
1373 raise ManifestParseError('optional "keep" attribute must be ' 1392 raise ManifestParseError('optional "keep" attribute must be '
1374 '"true" or "false"') 1393 '"true" or "false"')
1375 project.AddAnnotation(name, value, keep) 1394 element.AddAnnotation(name, value, keep)
1376 1395
1377 def _get_remote(self, node): 1396 def _get_remote(self, node):
1378 name = node.getAttribute('remote') 1397 name = node.getAttribute('remote')