blob: 92d0352900d8cc43afb2fe930116fc346823f059 [file] [log] [blame]
Jamie Gennis50dfd062012-05-22 16:29:02 -07001#!/usr/bin/python2.6
Jamie Gennisd1270ce2012-05-06 13:27:13 -07002
Jamie Gennis69073772012-09-20 12:14:58 -07003import httplib, json, optparse, os, urllib, shutil, subprocess, sys
Jamie Gennisd1270ce2012-05-06 13:27:13 -07004
Jamie Gennis69073772012-09-20 12:14:58 -07005output_css_file = 'style.css'
6output_js_file = 'script.js'
Jamie Gennisd1270ce2012-05-06 13:27:13 -07007
Jamie Gennis2da489c2012-09-19 18:06:29 -07008upstream_svn = 'http://trace-viewer.googlecode.com/svn/trunk/'
9
10script_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
11trace_viewer_dir = os.path.join(script_dir, 'trace-viewer')
12
Jamie Gennis69073772012-09-20 12:14:58 -070013parser = optparse.OptionParser()
14parser.add_option('--local', dest='local_dir', metavar='DIR',
15 help='use a local trace-viewer')
16parser.add_option('--no-min', dest='no_min', default=False, action='store_true',
17 help='skip minification')
18options, args = parser.parse_args()
Jamie Gennis2da489c2012-09-19 18:06:29 -070019
Jamie Gennis69073772012-09-20 12:14:58 -070020if options.local_dir is None:
21 # Remove the old source
22 shutil.rmtree(trace_viewer_dir, True)
Jamie Gennis2da489c2012-09-19 18:06:29 -070023
Jamie Gennis69073772012-09-20 12:14:58 -070024 # Pull the latest source from the upstream svn
25 svn_co_args = ['svn', 'co', upstream_svn, trace_viewer_dir]
26 p = subprocess.Popen(svn_co_args, stdout=subprocess.PIPE)
27 svn_output = ''
28 while p.poll() is None:
29 svn_output += p.stdout.read()
30 if p.returncode != 0:
31 print 'Failed to checkout source from upstream svn.'
32 sys.exit(1)
33
34 # Update the UPSTREAM_REVISION file
35 rev_str = svn_output.split('\n')[-2]
36 if not rev_str.startswith('Checked out revision '):
37 print 'Unrecognized revision string: %q' % rev_str
38 open('UPSTREAM_REVISION', 'wt').write(rev_str[21:-1] + '\n')
39else:
40 trace_viewer_dir = options.local_dir
Jamie Gennis2da489c2012-09-19 18:06:29 -070041
42# Generate the flattened JS and CSS
43build_dir = os.path.join(trace_viewer_dir, 'build')
44sys.path.append(build_dir)
45gen = __import__('generate_standalone_timeline_view', {}, {})
46js_code = gen.generate_js()
47css_code = gen.generate_css()
Jamie Gennisd1270ce2012-05-06 13:27:13 -070048
Jamie Gennis69073772012-09-20 12:14:58 -070049if options.no_min:
50 open(output_js_file, 'wt').write(js_code)
51 print 'Generated %s' % output_js_file
52 open(output_css_file, 'wt').write(css_code)
53 print 'Generated %s' % output_css_file
54else:
55 # Define the parameters for the POST request and encode them in
56 # a URL-safe format.
57 params = urllib.urlencode([
58 ('js_code', js_code),
59 ('language', 'ECMASCRIPT5'),
60 ('compilation_level', 'SIMPLE_OPTIMIZATIONS'),
61 ('output_format', 'json'),
62 ('output_info', 'errors'),
63 ('output_info', 'compiled_code'),
64 ])
Jamie Gennisd1270ce2012-05-06 13:27:13 -070065
Jamie Gennis69073772012-09-20 12:14:58 -070066 # Always use the following value for the Content-type header.
67 headers = { "Content-type": "application/x-www-form-urlencoded" }
68 conn = httplib.HTTPConnection('closure-compiler.appspot.com')
69 conn.request('POST', '/compile', params, headers)
70 response = conn.getresponse()
71 data = response.read()
72 conn.close
Jamie Gennisd1270ce2012-05-06 13:27:13 -070073
Jamie Gennis69073772012-09-20 12:14:58 -070074 if response.status != 200:
75 print sys.stderr, "error returned from JS compile service: %d" % response.status
76 sys.exit(1)
Jamie Gennisd1270ce2012-05-06 13:27:13 -070077
Jamie Gennis69073772012-09-20 12:14:58 -070078 result = json.loads(data)
79 if 'errors' in result:
80 print 'Encountered error minifying Javascript. Writing intermediate code to flat_script.js'
81 open('flat_script.js', 'wt').write(js_code)
82 for e in result['errors']:
83 filenum = int(e['file'][6:])
84 filename = 'flat_script.js'
85 lineno = e['lineno']
86 charno = e['charno']
87 err = e['error']
88 print '%s:%d:%d: %s' % (filename, lineno, charno, err)
89 print 'Failed to generate %s.' % output_js_file
90 sys.exit(1)
Jamie Gennis50dfd062012-05-22 16:29:02 -070091
Jamie Gennis69073772012-09-20 12:14:58 -070092 open(output_js_file, 'wt').write(result['compiledCode'] + '\n')
93 print 'Generated %s' % output_js_file
Jamie Gennisd1270ce2012-05-06 13:27:13 -070094
Jamie Gennis69073772012-09-20 12:14:58 -070095 yuic_args = ['yui-compressor', '--type', 'css', '-o', output_css_file]
96 p = subprocess.Popen(yuic_args, stdin=subprocess.PIPE)
97 p.communicate(input=css_code)
98 if p.wait() != 0:
99 print 'Failed to generate %s.' % output_css_file
100 sys.exit(1)
Jamie Gennisd1270ce2012-05-06 13:27:13 -0700101
Jamie Gennis69073772012-09-20 12:14:58 -0700102 print 'Generated %s' % output_css_file