18ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#!/usr/bin/python
28ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen# Copyright (c) 2009 The Chromium Authors. All rights reserved.
38ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen# Use of this source code is governed by a BSD-style license that can be
48ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen# found in the LICENSE file.
58ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
68ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen"""Docbuilder for extension docs."""
78ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
88ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenimport os
98ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenimport os.path
108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenimport shutil
118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenimport sys
128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenimport time
138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenimport urllib
148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfrom subprocess import Popen, PIPE
168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfrom optparse import OptionParser
178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen_script_path = os.path.realpath(__file__)
198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen_build_dir = os.path.dirname(_script_path)
208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen_base_dir = os.path.normpath(_build_dir + "/..")
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen_webkit_dir = _base_dir + "/../../../../third_party/WebKit"
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen_devtools_dir = _webkit_dir + "/Source/WebCore/inspector/front-end"
238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen_static_dir = _base_dir + "/static"
248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen_js_dir = _base_dir + "/js"
258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen_template_dir = _base_dir + "/template"
268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen_samples_dir = _base_dir + "/examples"
278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen_extension_api_dir = os.path.normpath(_base_dir + "/../api")
288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen_extension_api_json = _extension_api_dir + "/extension_api.json"
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen_devtools_api_json = _devtools_dir + "/ExtensionAPISchema.json"
318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen_api_template_html = _template_dir + "/api_template.html"
328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen_page_shell_html = _template_dir + "/page_shell.html"
338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen_generator_html = _build_dir + "/generator.html"
348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen_samples_json = _base_dir + "/samples.json"
358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen_expected_output_preamble = "#BEGIN"
378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen_expected_output_postamble = "#END"
388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen# HACK! This is required because we can only depend on python 2.4 and
408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen# the calling environment may not be setup to set the PYTHONPATH
418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsensys.path.append(os.path.normpath(_base_dir +
428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                   "/../../../../third_party"))
438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenimport simplejson as json
448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfrom directory import Sample
458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfrom directory import ApiManifest
468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfrom directory import SamplesManifest
478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsendef RenderPages(names, dump_render_tree):
498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  """
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  Calls DumpRenderTree .../generator.html?<names> and writes the
518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  results to .../docs/<name>.html
528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  """
538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  if not names:
548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    raise Exception("RenderPage called with empty names param")
558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  generator_url = "file:" + urllib.pathname2url(_generator_html)
578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  generator_url += "?" + ",".join(names)
588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  # Start with a fresh copy of page shell for each file.
608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  # Save the current contents so that we can look for changes later.
618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  originals = {}
628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  for name in names:
638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    input_file = _base_dir + "/" + name + ".html"
648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    if (os.path.isfile(input_file)):
668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      originals[name] = open(input_file, 'rb').read()
678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      os.remove(input_file)
688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    else:
698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      originals[name] = ""
708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    shutil.copy(_page_shell_html, input_file)
728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  # Run DumpRenderTree and capture result
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  dump_render_tree_timeout = 1000 * 60 * 5  # five minutes
758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  p = Popen(
7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      [dump_render_tree, "--test-shell",
7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen       "%s %s" % (generator_url, dump_render_tree_timeout)],
788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      stdout=PIPE)
798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  # The remaining output will be the content of the generated pages.
818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  output = p.stdout.read()
828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  # Parse out just the JSON part.
848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  begin = output.find(_expected_output_preamble)
858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  end = output.rfind(_expected_output_postamble)
868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  if (begin < 0 or end < 0):
8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    raise Exception("%s returned invalid output:\n\n%s" %
8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        (dump_render_tree, output))
908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  begin += len(_expected_output_preamble)
928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  try:
948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    output_parsed = json.loads(output[begin:end])
958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  except ValueError, msg:
9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   raise Exception("Could not parse DumpRenderTree output as JSON. Error: " +
9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                   msg + "\n\nOutput was:\n" + output)
988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  changed_files = []
1008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  for name in names:
1018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    result = output_parsed[name].encode("utf8") + '\n'
1028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    # Remove CRs that are appearing from captured DumpRenderTree output.
1048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    result = result.replace('\r', '')
1058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    # Remove page_shell
1078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    input_file = _base_dir + "/" + name + ".html"
1088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    os.remove(input_file)
1098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    # Write output
1118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    open(input_file, 'wb').write(result)
1128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    if (originals[name] and result != originals[name]):
1138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      changed_files.append(input_file)
1148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  return changed_files
1168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsendef FindDumpRenderTree():
11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  # This is hacky. It is used to guess the location of the DumpRenderTree
1208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  chrome_dir = os.path.normpath(_base_dir + "/../../../")
1218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  src_dir = os.path.normpath(chrome_dir + "/../")
1228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  search_locations = []
1248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  if (sys.platform in ('cygwin', 'win32')):
1268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    home_dir = os.path.normpath(os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH"))
12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    search_locations.append(chrome_dir + "/Release/DumpRenderTree.exe")
12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    search_locations.append(chrome_dir + "/Debug/DumpRenderTree.exe")
12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    search_locations.append(home_dir + "/bin/DumpRenderTree/"
13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            "DumpRenderTree.exe")
1318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  if (sys.platform in ('linux', 'linux2')):
13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    search_locations.append(src_dir + "/sconsbuild/Release/DumpRenderTree")
13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    search_locations.append(src_dir + "/out/Release/DumpRenderTree")
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    search_locations.append(src_dir + "/sconsbuild/Debug/DumpRenderTree")
13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    search_locations.append(src_dir + "/out/Debug/DumpRenderTree")
13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    search_locations.append(os.getenv("HOME") + "/bin/DumpRenderTree/"
13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            "DumpRenderTree")
1398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  if (sys.platform == 'darwin'):
1418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    search_locations.append(src_dir +
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        "/xcodebuild/Release/DumpRenderTree.app/Contents/MacOS/DumpRenderTree")
1438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    search_locations.append(src_dir +
14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        "/xcodebuild/Debug/DumpRenderTree.app/Contents/MacOS/DumpRenderTree")
14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    search_locations.append(os.getenv("HOME") + "/bin/DumpRenderTree/" +
14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            "DumpRenderTree.app/Contents/MacOS/DumpRenderTree")
1478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  for loc in search_locations:
1498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    if os.path.isfile(loc):
1508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      return loc
1518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  raise Exception("Could not find DumpRenderTree executable\n"
15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                  "**DumpRenderTree may need to be built**\n"
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                  "Searched: \n" + "\n".join(search_locations) + "\n"
15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                  "To specify a path to DumpRenderTree use "
15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                  "--dump-render-tree-path")
1578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsendef GetStaticFileNames():
1598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  static_files = os.listdir(_static_dir)
1608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  return set(os.path.splitext(file_name)[0]
1618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen             for file_name in static_files
1628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen             if file_name.endswith(".html") and not file_name.startswith("."))
1638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsendef main():
1658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  # Prevent windows from using cygwin python.
1668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  if (sys.platform == "cygwin"):
1678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    sys.exit("Building docs not supported for cygwin python. Please run the "
1688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen             "build.sh script instead, which uses depot_tools python.")
1698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  parser = OptionParser()
17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  parser.add_option("--dump-render-tree-path", dest="dump_render_tree_path",
172513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                    metavar="PATH",
17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                    help="path to DumpRenderTree executable")
174513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  parser.add_option("--page-name", dest="page_name", metavar="PAGE",
175513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                    help="only generate docs for PAGE.html")
176513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  parser.add_option("--nozip", dest="zips", action="store_false",
177513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                    help="do not generate zip files for samples",
178513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                    default=True)
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  options, args = parser.parse_args()
1808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (options.dump_render_tree_path and
18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      os.path.isfile(options.dump_render_tree_path)):
18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    dump_render_tree = options.dump_render_tree_path
1848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  else:
18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    dump_render_tree = FindDumpRenderTree()
1868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  # Load the manifest of existing API Methods
1888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  api_manifest = ApiManifest(_extension_api_json)
1898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  # DevTools API is maintained separately, in WebCore land
19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  devtools_api_manifest = ApiManifest(_devtools_api_json)
19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  # Read static file names
1948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  static_names = GetStaticFileNames()
1958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  # Read module names
19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  module_names = (api_manifest.getModuleNames() |
19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      devtools_api_manifest.getModuleNames())
1998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  # All pages to generate
2018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  page_names = static_names | module_names
2028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  # Allow the user to render a single page if they want
2048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  if options.page_name:
2058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    if options.page_name in page_names:
2068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      page_names = [options.page_name]
2078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    else:
2088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      raise Exception("--page-name argument must be one of %s." %
2098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                      ', '.join(sorted(page_names)))
2108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  # Render a manifest file containing metadata about all the extension samples
2128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  samples_manifest = SamplesManifest(_samples_dir, _base_dir, api_manifest)
2138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  samples_manifest.writeToFile(_samples_json)
2148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
215513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  # Write zipped versions of the samples listed in the manifest to the
216513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  # filesystem, unless the user has disabled it
217513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if options.zips:
2184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    modified_zips = samples_manifest.writeZippedSamples()
2194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  else:
2204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    modified_zips = []
221513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  modified_files = RenderPages(page_names, dump_render_tree)
2234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  modified_files.extend(modified_zips)
2248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  if len(modified_files) == 0:
2268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    print "Output files match existing files. No changes made."
2278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  else:
2288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    print ("ATTENTION: EXTENSION DOCS HAVE CHANGED\n" +
2298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen           "The following files have been modified and should be checked\n" +
2308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen           "into source control (ideally in the same changelist as the\n" +
2318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen           "underlying files that resulting in their changing).")
2328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    for f in modified_files:
2334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      print " * %s" % f
2348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  # Hack. Sleep here, otherwise windows doesn't properly close the debug.log
2368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  # and the os.remove will fail with a "Permission denied".
2378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  time.sleep(1)
2388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  debug_log = os.path.normpath(_build_dir + "/" + "debug.log")
2398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  if (os.path.isfile(debug_log)):
2408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    os.remove(debug_log)
2418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  if 'EX_OK' in dir(os):
2438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    return os.EX_OK
2448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  else:
2458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    return 0
2468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenif __name__ == '__main__':
2488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  sys.exit(main())
249