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