aboutsummaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorPaul Sokolovsky <paul.sokolovsky@linaro.org>2013-08-05 13:25:56 +0300
committerPaul Sokolovsky <paul.sokolovsky@linaro.org>2013-08-05 13:25:56 +0300
commitc914068cecfb346c0e9158f885b7989905e38252 (patch)
tree4b4bf49817ef53eafd0024f11bef705af866bc4f /utils
parentce0f5ac43b20df5d9d0d99709726ca092c819f48 (diff)
Utility to add descriptions for repos/branches used in manifest.
Diffstat (limited to 'utils')
-rwxr-xr-xutils/manifest-descriptions/make.sh15
-rwxr-xr-xutils/manifest-descriptions/manifest-annotate155
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)