diff options
author | Mike Frysinger <vapier@google.com> | 2020-09-02 04:31:10 -0400 |
---|---|---|
committer | Mike Frysinger <vapier@google.com> | 2020-11-17 01:38:00 +0000 |
commit | 23411d3f9c3df36b68080cf457ca093f8f1c1f21 (patch) | |
tree | 86a541b8e6d94a9aa16e6e1f3a5883c32af17a23 /manifest_xml.py | |
parent | 160748f828f0fdaf09d3be86c73840d9e28eccdb (diff) | |
download | git-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.py | 55 |
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): |