diff options
author | Paul Sokolovsky <paul.sokolovsky@linaro.org> | 2013-08-05 13:25:56 +0300 |
---|---|---|
committer | Paul Sokolovsky <paul.sokolovsky@linaro.org> | 2013-08-05 13:25:56 +0300 |
commit | c914068cecfb346c0e9158f885b7989905e38252 (patch) | |
tree | 4b4bf49817ef53eafd0024f11bef705af866bc4f /utils | |
parent | ce0f5ac43b20df5d9d0d99709726ca092c819f48 (diff) |
Utility to add descriptions for repos/branches used in manifest.
Diffstat (limited to 'utils')
-rwxr-xr-x | utils/manifest-descriptions/make.sh | 15 | ||||
-rwxr-xr-x | utils/manifest-descriptions/manifest-annotate | 155 |
2 files changed, 170 insertions, 0 deletions
diff --git a/utils/manifest-descriptions/make.sh b/utils/manifest-descriptions/make.sh new file mode 100755 index 0000000..4054a85 --- /dev/null +++ b/utils/manifest-descriptions/make.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +dir=manifest-descriptions + +#rm -rf $dir + +if [ -d $dir ]; then + cd $dir + git pull + cd .. +else + git clone http://android.git.linaro.org/git-ro/platform/manifest-descriptions.git +fi + +$(dirname $0)/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("""\ +<?xml version="1.0" encoding="UTF-8"?> +<manifest> + +""") + 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("<!-- Project: %s -->\n" % pd) + bd = descr["branches"].get(revision) + if bd: + out.write("<!-- Branch %s: %s -->\n" % (revision, bd)) + out.write(p.toxml()) + out.write("\n") + out.write("""\ + +</manifest> +""") + +optparser = optparse.OptionParser(usage="%prog <source-manifest.xml> <pinned-manifest.xml>") +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) |