More product debugging.

Change-Id: I17b5d441e44ea39564263b32f963e2d3ac684232
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)