| #!/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() |