Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 #!/usr/bin/python | |
| 2 | |
| 3 # Copyright (c) 2014 The Chromium Authors. All rights reserved. | |
| 4 # Use of this source code is governed by a BSD-style license that can be | |
| 5 # found in the LICENSE file. | |
| 6 | |
| 7 import json | |
| 8 import optparse | |
| 9 import os | |
| 10 import shutil | |
| 11 import subprocess | |
| 12 import sys | |
| 13 import urllib2 | |
| 14 | |
| 15 | |
| 16 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) | |
| 17 DOC_DIR = os.path.dirname(SCRIPT_DIR) | |
| 18 | |
| 19 | |
| 20 def Trace(msg): | |
| 21 if Trace.verbose: | |
| 22 sys.stderr.write(str(msg) + '\n') | |
| 23 | |
| 24 Trace.verbose = False | |
| 25 | |
| 26 | |
| 27 def GetChannelBranches(): | |
| 28 url = 'http://omahaproxy.appspot.com/json' | |
| 29 u = urllib2.urlopen(url) | |
| 30 try: | |
| 31 data = json.loads(u.read()) | |
| 32 finally: | |
| 33 u.close() | |
| 34 | |
| 35 channel_branch = {} | |
| 36 for os_row in data: | |
| 37 os = os_row['os'] | |
| 38 if os not in ('win', 'mac', 'linux'): | |
| 39 continue | |
| 40 for version_row in os_row['versions']: | |
| 41 channel = version_row['channel'] | |
| 42 # We don't display canary docs. | |
| 43 if channel == 'canary': | |
| 44 continue | |
| 45 | |
| 46 branch = version_row['true_branch'] | |
| 47 if channel in channel_branch: | |
| 48 existing_branch = channel_branch[channel] | |
| 49 if branch != existing_branch: | |
| 50 sys.stderr.write('Warning: found different branch numbers for ' | |
| 51 'channel %s: %s vs %s. Using %s.\n' % ( | |
| 52 channel, branch, existing_branch, existing_branch)) | |
| 53 else: | |
| 54 channel_branch[channel] = branch | |
| 55 | |
| 56 return channel_branch | |
| 57 | |
| 58 | |
| 59 def RemoveFile(filename): | |
| 60 try: | |
| 61 os.remove(filename) | |
| 62 except OSError: | |
| 63 pass | |
|
Sam Clegg
2014/01/15 23:22:59
Why ignore these errors?
binji
2014/01/15 23:56:16
I don't want to error when the file or directory d
binji
2014/01/16 22:27:08
Done.
| |
| 64 | |
| 65 | |
| 66 def RemoveDir(dirname): | |
| 67 try: | |
| 68 shutil.rmtree(dirname) | |
| 69 except OSError: | |
| 70 pass | |
| 71 | |
| 72 | |
| 73 def CheckoutPepperDocs(branch, doc_dirname): | |
| 74 Trace('Removing directory %s' % doc_dirname) | |
| 75 RemoveDir(doc_dirname) | |
| 76 | |
| 77 for subdir in ('c', 'cpp', 'utility'): | |
| 78 url = 'http://src.chromium.org/chrome/branches/%s/src/ppapi/%s' % ( | |
| 79 branch, subdir) | |
| 80 cmd = ['svn', 'co', url, os.path.join(doc_dirname, subdir)] | |
| 81 Trace('Checking out docs into %s:\n %s' % (doc_dirname, ' '.join(cmd))) | |
| 82 subprocess.check_call(cmd) | |
| 83 | |
| 84 | |
| 85 def GenerateDoxyfile(template_filename, out_dirname, doc_dirname, doxyfile): | |
| 86 Trace('Writing Doxyfile "%s" (from template %s)' % ( | |
| 87 doxyfile, template_filename)) | |
| 88 | |
| 89 with open(template_filename) as f: | |
| 90 data = f.read() | |
| 91 | |
| 92 with open(doxyfile, 'w') as f: | |
| 93 f.write(data % {'out_dirname': out_dirname, 'doc_dirname': doc_dirname}) | |
| 94 | |
| 95 | |
| 96 def RunDoxygen(out_dirname, doxyfile): | |
| 97 Trace('Removing old output directory %s' % out_dirname) | |
| 98 RemoveDir(out_dirname) | |
| 99 | |
| 100 Trace('Making new output directory %s' % out_dirname) | |
| 101 os.makedirs(out_dirname) | |
| 102 | |
| 103 cmd = ['doxygen', doxyfile] | |
| 104 Trace('Running Doxygen:\n %s' % ' '.join(cmd)) | |
| 105 subprocess.check_call(cmd) | |
| 106 | |
| 107 | |
| 108 def RunDoxyCleanup(out_dirname): | |
| 109 cmd = [sys.executable, 'doxy_cleanup.py', out_dirname] | |
| 110 if Trace.verbose: | |
| 111 cmd.append('-v') | |
| 112 Trace('Running doxy_cleanup:\n %s' % ' '.join(cmd)) | |
| 113 subprocess.check_call(cmd) | |
| 114 | |
| 115 | |
| 116 def RunRstIndex(kind, channel, out_dirname, out_rst_filename): | |
| 117 assert kind in ('root', 'c', 'cpp') | |
| 118 cmd = [sys.executable, 'rst_index.py', | |
| 119 '--' + kind, | |
| 120 '--channel', channel, | |
| 121 out_dirname, | |
| 122 '-o', out_rst_filename] | |
| 123 Trace('Running rst_index:\n %s' % ' '.join(cmd)) | |
| 124 subprocess.check_call(cmd) | |
| 125 | |
| 126 | |
| 127 def GenerateDocs(channel, branch): | |
| 128 Trace('Generating docs for %s (branch %s)' % (channel, branch)) | |
| 129 pepper_dirname = 'pepper_%s' % channel | |
| 130 # i.e. ../_build/chromesite/pepper_beta | |
| 131 chromesite_dir = os.path.join(DOC_DIR, '_build', 'chromesite', pepper_dirname) | |
| 132 | |
| 133 CheckoutPepperDocs(branch, pepper_dirname) | |
| 134 | |
| 135 doxyfile_c = '' | |
| 136 doxyfile_cpp = '' | |
| 137 | |
| 138 try: | |
| 139 # Generate Root index | |
| 140 rst_index_root = os.path.join(DOC_DIR, pepper_dirname, 'index.rst') | |
| 141 RunRstIndex('root', channel, chromesite_dir, rst_index_root) | |
| 142 | |
| 143 # Generate C docs | |
| 144 out_dirname_c = os.path.join(chromesite_dir, 'c') | |
| 145 doxyfile_c = 'Doxyfile.c.%s' % channel | |
| 146 rst_index_c = os.path.join(DOC_DIR, pepper_dirname, 'c', 'index.rst') | |
| 147 GenerateDoxyfile('Doxyfile.c.template', out_dirname_c, pepper_dirname, | |
| 148 doxyfile_c) | |
| 149 RunDoxygen(out_dirname_c, doxyfile_c) | |
| 150 RunDoxyCleanup(out_dirname_c) | |
| 151 RunRstIndex('c', channel, out_dirname_c, rst_index_c) | |
| 152 | |
| 153 # Generate C++ docs | |
| 154 out_dirname_cpp = os.path.join(chromesite_dir, 'cpp') | |
| 155 doxyfile_cpp = 'Doxyfile.cpp.%s' % channel | |
| 156 rst_index_cpp = os.path.join(DOC_DIR, pepper_dirname, 'cpp', 'index.rst') | |
| 157 GenerateDoxyfile('Doxyfile.cpp.template', out_dirname_cpp, pepper_dirname, | |
| 158 doxyfile_cpp) | |
| 159 RunDoxygen(out_dirname_cpp, doxyfile_cpp) | |
| 160 RunDoxyCleanup(out_dirname_cpp) | |
| 161 RunRstIndex('cpp', channel, out_dirname_cpp, rst_index_cpp) | |
| 162 finally: | |
| 163 # Cleanup | |
| 164 RemoveDir(pepper_dirname) | |
| 165 RemoveFile(doxyfile_c) | |
| 166 RemoveFile(doxyfile_cpp) | |
| 167 | |
| 168 | |
| 169 def main(argv): | |
| 170 parser = optparse.OptionParser(usage='Usage: %prog [options]') | |
| 171 parser.add_option('-v', '--verbose', | |
| 172 help='Verbose output', action='store_true') | |
| 173 options, files = parser.parse_args(argv) | |
| 174 | |
| 175 if options.verbose: | |
| 176 Trace.verbose = True | |
| 177 | |
| 178 channel_branch = GetChannelBranches() | |
| 179 for channel, branch in channel_branch.iteritems(): | |
| 180 GenerateDocs(channel, branch) | |
| 181 | |
| 182 return 0 | |
| 183 | |
| 184 | |
| 185 if __name__ == '__main__': | |
| 186 try: | |
| 187 rtn = main(sys.argv[1:]) | |
| 188 except KeyboardInterrupt: | |
| 189 sys.stderr.write('%s: interrupted\n' % os.path.basename(__file__)) | |
| 190 rtn = 1 | |
| 191 sys.exit(rtn) | |
| OLD | NEW |