summaryrefslogtreecommitdiffstats
path: root/tools/product_debug.py
diff options
context:
space:
mode:
authorJoe Onorato <joeo@google.com>2012-07-23 13:51:44 -0700
committerJoe Onorato <joeo@google.com>2012-08-16 22:45:56 -0700
commit88155422f2eb81c4d4151f536a6a86e00133adfd (patch)
tree015b5d64b00f6106a545c612e97bdd868c774c0f /tools/product_debug.py
parent8d0847e9246ab7728f9ef6e2e493f0025ac06f5b (diff)
downloadbuild-88155422f2eb81c4d4151f536a6a86e00133adfd.zip
build-88155422f2eb81c4d4151f536a6a86e00133adfd.tar.gz
build-88155422f2eb81c4d4151f536a6a86e00133adfd.tar.bz2
More product debugging.
Change-Id: I17b5d441e44ea39564263b32f963e2d3ac684232
Diffstat (limited to 'tools/product_debug.py')
-rwxr-xr-xtools/product_debug.py160
1 files changed, 160 insertions, 0 deletions
diff --git a/tools/product_debug.py b/tools/product_debug.py
new file mode 100755
index 0000000..661c5b7
--- /dev/null
+++ b/tools/product_debug.py
@@ -0,0 +1,160 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import os
+import re
+import sys
+
+def break_lines(key, val):
+ # these don't get split
+ if key in ("PRODUCT_MODEL"):
+ return (key,val)
+ return (key, "\n".join(val.split()))
+
+def split_line(line):
+ words = line.split("=", 1)
+ if len(words) == 1:
+ return (words[0], "")
+ else:
+ return (words[0], words[1])
+
+def sort_lines(text):
+ lines = text.split()
+ lines.sort()
+ return "\n".join(lines)
+
+def parse_variables(lines):
+ return [split_line(line) for line in lines if line.strip()]
+
+def render_variables(variables):
+ variables = dict(variables)
+ del variables["FILE"]
+ variables = list(variables.iteritems())
+ variables.sort(lambda a, b: cmp(a[0], b[0]))
+ return ("<table id='variables'>"
+ + "\n".join([ "<tr><th>%(key)s</th><td>%(val)s</td></tr>" % { "key": key, "val": val }
+ for key,val in variables])
+ +"</table>")
+
+def linkify_inherit(variables, text, func_name):
+ groups = re.split("(\\$\\(call " + func_name + ",.*\\))", text)
+ result = ""
+ for i in range(0,len(groups)/2):
+ i = i * 2
+ result = result + groups[i]
+ s = groups[i+1]
+ href = s.split(",", 1)[1].strip()[:-1]
+ href = href.replace("$(SRC_TARGET_DIR)", "build/target")
+ href = ("../" * variables["FILE"].count("/")) + href + ".html"
+ result = result + "<a href=\"%s\">%s</a>" % (href,s)
+ result = result + groups[-1]
+ return result
+
+def render_original(variables, text):
+ text = linkify_inherit(variables, text, "inherit-product")
+ text = linkify_inherit(variables, text, "inherit-product-if-exists")
+ return text
+
+def read_file(fn):
+ f = file(fn)
+ text = f.read()
+ f.close()
+ return text
+
+def main(argv):
+ # read the variables
+ lines = sys.stdin.readlines()
+ variables = parse_variables(lines)
+
+ # format the variables
+ variables = [break_lines(key,val) for key,val in variables]
+
+ # now it's a dict
+ variables = dict(variables)
+
+ sorted_vars = (
+ "PRODUCT_COPY_FILES",
+ "PRODUCT_PACKAGES",
+ "PRODUCT_LOCALES",
+ "PRODUCT_FACTORY_RAMDISK_MODULES",
+ "PRODUCT_PROPERTY_OVERRIDES",
+ )
+
+ for key in sorted_vars:
+ variables[key] = sort_lines(variables[key])
+
+ # the original file
+ original = read_file(variables["FILE"])
+
+ # formatting
+ values = dict(variables)
+ values.update({
+ "variables": render_variables(variables),
+ "original": render_original(variables, original),
+ })
+ print """<html>
+
+
+<head>
+ <title>%(FILE)s</title>
+ <style type="text/css">
+ body {
+ font-family: Helvetica, Arial, sans-serif;
+ padding-bottom: 20px;
+ }
+ #variables {
+ border-collapse: collapse;
+ }
+ #variables th, #variables td {
+ vertical-align: top;
+ text-align: left;
+ border-top: 1px solid #c5cdde;
+ border-bottom: 1px solid #c5cdde;
+ padding: 2px 10px 2px 10px;
+ }
+ #variables th {
+ font-size: 10pt;
+ background-color: #e2ecff
+ }
+ #variables td {
+ background-color: #ebf2ff;
+ white-space: pre;
+ font-size: 10pt;
+ }
+ #original {
+ background-color: #ebf2ff;
+ border-top: 1px solid #c5cdde;
+ border-bottom: 1px solid #c5cdde;
+ padding: 2px 10px 2px 10px;
+ white-space: pre;
+ font-size: 10pt;
+ }
+ </style>
+</head>
+<body>
+<h1>%(FILE)s</h1>
+<a href="#Original">Original</a>
+<a href="#Variables">Variables</a>
+<h2><a name="Original"></a>Original</h2>
+<div id="original">%(original)s</div>
+<h2><a name="Variables"></a>Variables</h2>
+%(variables)s
+</body>
+</html>
+""" % values
+
+if __name__ == "__main__":
+ main(sys.argv)