summaryrefslogtreecommitdiffstats
path: root/manifest_xml.py
diff options
context:
space:
mode:
authorMike Frysinger <vapier@google.com>2020-09-02 04:31:10 -0400
committerMike Frysinger <vapier@google.com>2020-11-17 01:38:00 +0000
commit23411d3f9c3df36b68080cf457ca093f8f1c1f21 (patch)
tree86a541b8e6d94a9aa16e6e1f3a5883c32af17a23 /manifest_xml.py
parent160748f828f0fdaf09d3be86c73840d9e28eccdb (diff)
downloadgit-repo-23411d3f9c3df36b68080cf457ca093f8f1c1f21.tar.gz
manifest: add a --json output option
Sometimes parsing JSON is easier than parsing XML, especially when the XML format is limited (which ours is). Add a --json option to the manifest command to quickly emit that form. Bug: https://crbug.com/gerrit/11743 Change-Id: Ia2bb254a78ae2b70a851638b4545fcafe8c1a76b Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/280436 Reviewed-by: Michael Mortensen <mmortensen@google.com> Tested-by: Mike Frysinger <vapier@google.com>
Diffstat (limited to 'manifest_xml.py')
-rw-r--r--manifest_xml.py55
1 files changed, 52 insertions, 3 deletions
diff --git a/manifest_xml.py b/manifest_xml.py
index bf730caa..e1ef330f 100644
--- a/manifest_xml.py
+++ b/manifest_xml.py
@@ -283,9 +283,8 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
283 def _ParseGroups(self, groups): 283 def _ParseGroups(self, groups):
284 return [x for x in re.split(r'[,\s]+', groups) if x] 284 return [x for x in re.split(r'[,\s]+', groups) if x]
285 285
286 def Save(self, fd, peg_rev=False, peg_rev_upstream=True, peg_rev_dest_branch=True, groups=None): 286 def ToXml(self, peg_rev=False, peg_rev_upstream=True, peg_rev_dest_branch=True, groups=None):
287 """Write the current manifest out to the given file descriptor. 287 """Return the current manifest XML."""
288 """
289 mp = self.manifestProject 288 mp = self.manifestProject
290 289
291 if groups is None: 290 if groups is None:
@@ -459,6 +458,56 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
459 ' '.join(self._repo_hooks_project.enabled_repo_hooks)) 458 ' '.join(self._repo_hooks_project.enabled_repo_hooks))
460 root.appendChild(e) 459 root.appendChild(e)
461 460
461 return doc
462
463 def ToDict(self, **kwargs):
464 """Return the current manifest as a dictionary."""
465 # Elements that may only appear once.
466 SINGLE_ELEMENTS = {
467 'notice',
468 'default',
469 'manifest-server',
470 'repo-hooks',
471 }
472 # Elements that may be repeated.
473 MULTI_ELEMENTS = {
474 'remote',
475 'remove-project',
476 'project',
477 'extend-project',
478 'include',
479 # These are children of 'project' nodes.
480 'annotation',
481 'project',
482 'copyfile',
483 'linkfile',
484 }
485
486 doc = self.ToXml(**kwargs)
487 ret = {}
488
489 def append_children(ret, node):
490 for child in node.childNodes:
491 if child.nodeType == xml.dom.Node.ELEMENT_NODE:
492 attrs = child.attributes
493 element = dict((attrs.item(i).localName, attrs.item(i).value)
494 for i in range(attrs.length))
495 if child.nodeName in SINGLE_ELEMENTS:
496 ret[child.nodeName] = element
497 elif child.nodeName in MULTI_ELEMENTS:
498 ret.setdefault(child.nodeName, []).append(element)
499 else:
500 raise ManifestParseError('Unhandled element "%s"' % (child.nodeName,))
501
502 append_children(element, child)
503
504 append_children(ret, doc.firstChild)
505
506 return ret
507
508 def Save(self, fd, **kwargs):
509 """Write the current manifest out to the given file descriptor."""
510 doc = self.ToXml(**kwargs)
462 doc.writexml(fd, '', ' ', '\n', 'UTF-8') 511 doc.writexml(fd, '', ' ', '\n', 'UTF-8')
463 512
464 def _output_manifest_project_extras(self, p, e): 513 def _output_manifest_project_extras(self, p, e):