#!/usr/bin/python # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file # for details. All rights reserved. Use of this source code is governed by a # BSD-style license that can be found in the LICENSE file. import optparse import os import os.path import re import shutil import subprocess import sys SCRIPT_PATH = os.path.abspath(os.path.dirname(__file__)) DART_PATH = os.path.abspath(os.path.join(SCRIPT_PATH, '..', '..', '..')) # Path to install latest IDL. IDL_PATH = os.path.join(DART_PATH, 'third_party', 'WebCore') # Whitelist of files to keep. WHITELIST = [ r'LICENSE(\S+)', r'(\S+)\.idl'] # README file to generate. README = os.path.join(IDL_PATH, 'README') # SVN URL to latest Dartium version of WebKit. DEPS = 'http://dart.googlecode.com/svn/branches/bleeding_edge/deps/dartium.deps/DEPS' URL_PATTERN = r'"dartium_webkit_trunk": "(\S+)",' REV_PATTERN = r'"dartium_webkit_revision": "(\d+)",' WEBCORE_SUBPATH = 'Source/WebCore' def RunCommand(cmd): """Executes a shell command and return its stdout.""" print ' '.join(cmd) pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) output = pipe.communicate() if pipe.returncode == 0: return output[0] else: print output[1] print 'FAILED. RET_CODE=%d' % pipe.returncode sys.exit(pipe.returncode) def GetWebkitSvnRevision(): """Returns a tuple with the (dartium webkit repo, latest revision).""" deps = RunCommand(['svn', 'cat', DEPS]) url = re.search(URL_PATTERN, deps).group(1) revision = re.search(REV_PATTERN, deps).group(1) return (url, revision) def RefreshIDL(url, revision): """Refreshes the IDL to specific WebKit url / revision.""" cwd = os.getcwd() try: shutil.rmtree(IDL_PATH) os.chdir(os.path.dirname(IDL_PATH)) RunCommand(['svn', 'export', '-r', revision, url + '/' + WEBCORE_SUBPATH]) finally: os.chdir(cwd) def PruneExtraFiles(): """Removes all files that do not match the whitelist.""" pattern = re.compile(reduce(lambda x,y: '%s|%s' % (x,y), map(lambda z: '(%s)' % z, WHITELIST))) for (root, dirs, files) in os.walk(IDL_PATH, topdown=False): for f in files: if not pattern.match(f): os.remove(os.path.join(root, f)) for d in dirs: dirpath = os.path.join(root, d) if not os.listdir(dirpath): shutil.rmtree(dirpath) def ParseOptions(): parser = optparse.OptionParser() parser.add_option('--revision', '-r', dest='revision', help='Revision to install', default=None) args, _ = parser.parse_args() return args.revision def GenerateReadme(url, revision): readme = """This directory contains a copy of WebKit/WebCore IDL files. See the attached LICENSE-* files in this directory. Please do not modify the files here. They are periodically copied using the script: $DART_ROOT/lib/dom/scripts/%(script)s The current version corresponds to: URL: %(url)s Current revision: %(revision)s """ % { 'script': os.path.basename(__file__), 'url': url, 'revision': revision } out = open(README, 'w') out.write(readme) out.close() def main(): revision = ParseOptions() url, latest = GetWebkitSvnRevision() if not revision: revision = latest RefreshIDL(url, revision) PruneExtraFiles() GenerateReadme(url, revision) if __name__ == '__main__': main()