From c914068cecfb346c0e9158f885b7989905e38252 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Mon, 5 Aug 2013 13:25:56 +0300 Subject: Utility to add descriptions for repos/branches used in manifest. --- utils/manifest-descriptions/manifest-annotate | 155 ++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100755 utils/manifest-descriptions/manifest-annotate (limited to 'utils/manifest-descriptions/manifest-annotate') diff --git a/utils/manifest-descriptions/manifest-annotate b/utils/manifest-descriptions/manifest-annotate new file mode 100755 index 0000000..0ed2481 --- /dev/null +++ b/utils/manifest-descriptions/manifest-annotate @@ -0,0 +1,155 @@ +#!/usr/bin/env python +import sys +import json +import optparse +from xml.dom import minidom +from pprint import pprint + + +JSON_DATA_PATH = "manifest-descriptions/" + + +class Manifest: + + def __init__(self): + self.remote_list = [] + self.project_list = [] + # (project name, remote) -> revision + self.project_revision_map = {} + self.default_node = None + + @staticmethod + def compare_attr_wise(node1, node2): + if node1.attributes.length != node2.attributes.length: + return False + for i in xrange(node1.attributes.length): + a1 = node1.attributes.item(i) + if a1.value != node2.attributes[a1.name].value: + return False + return True + + def add_default(self, default_node): + if self.default_node: + if not self.compare_attr_wise(default_node, self.default_node): + raise ValueError("default collision: %s vs %s" % (default_node.toxml(), self.default_node.toxml())) + return + self.default_node = default_node + + def add_remote(self, remote_node): + self.remote_list.append(remote_node) + return True + + def add_project(self, project_node): + remote = project_node.getAttribute("remote") + name = project_node.getAttribute("name") + revision = project_node.getAttribute("revision") + path = project_node.getAttribute("path") + self.project_list.append(project_node) + self.project_revision_map[(name, remote)] = revision + return True + + def get_default(self): + return self.default_node + + def get_remotes(self): + return self.remote_list + + def get_projects(self): + return self.project_list + + def get_revision(self, project_name, remote): + return self.project_revision_map[(project_name, remote)] + + +def parse(manifest_file): + manifest = Manifest() + print >>sys.stderr, "Processing: %s" % manifest_file + dom = minidom.parse(manifest_file) + default = dom.getElementsByTagName("default") + assert len(default) == 1 + manifest.add_default(default[0]) + for r in dom.getElementsByTagName("remote"): + manifest.add_remote(r) + for p in dom.getElementsByTagName("project"): + manifest.add_project(p) + + return manifest + + +def dump(manifest, out, revision_ref_manifest=None): + + def sort_by_name(n1, n2): + return cmp(n1.getAttribute("name"), n2.getAttribute("name")) + + out.write("""\ + + + +""") + for r in manifest.get_remotes(): + out.write(r.toxml()) + out.write("\n") + out.write("\n") + + out.write(manifest.get_default().toxml()) + out.write("\n\n") + + for p in manifest.get_projects(): + name = p.getAttribute("name") + remote = p.getAttribute("remote") + if revision_ref_manifest: + # For pinned manifest, we look up branch name for + # this project in source manifest + revision = revision_ref_manifest.get_revision(name, remote) + else: + revision = p.getAttribute("revision") + if not remote: + remote = manifest.get_default().getAttribute("remote") + if (name, remote) in descr_map: + descr = descr_map[(name, remote)] + pd = descr.get("description") + if pd: + out.write("\n" % pd) + bd = descr["branches"].get(revision) + if bd: + out.write("\n" % (revision, bd)) + out.write(p.toxml()) + out.write("\n") + out.write("""\ + + +""") + +optparser = optparse.OptionParser(usage="%prog ") +options, args = optparser.parse_args(sys.argv[1:]) +if len(args) != 2: + optparser.error("Wrong number of arguments") + +FILE_MAP = [ + ("git_description_aglo.json", "aosp"), + ("git_description_glo.json", "linaro-other"), + ("git_description_hglo.json", "linaro-landing-team-hisilicon"), + ("git_description_lpglo.json", "linaro-private"), +] + +descr_map = {} +for fname, remote in FILE_MAP: + descrs_js = json.load(open(JSON_DATA_PATH + fname)) + for p in descrs_js["project"]: + name = p["name"] + description = None + branches_js = p["branch"] + branches = {} + for b in branches_js: + if "name" in b: + branches[b["name"]] = b["description"] + else: + description = b["description"] + descr_map[(name, remote)] = { "description": description, "branches": branches} + +#pprint(descr_map) + +source_manifest = parse(args[0]) +pinned_manifest = parse(args[1]) +dump(source_manifest, open(args[0] + ".ann", "w")) +dump(pinned_manifest, open(args[1] + ".ann", "w"), source_manifest) -- cgit v1.2.3