Index: Tools/Scripts/webkitpy/w3c/deps_updater.py |
diff --git a/Tools/Scripts/webkitpy/w3c/deps_updater.py b/Tools/Scripts/webkitpy/w3c/deps_updater.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..874c2d94da5a15a65f5a5f09e03fc7ba28c3fe95 |
--- /dev/null |
+++ b/Tools/Scripts/webkitpy/w3c/deps_updater.py |
@@ -0,0 +1,179 @@ |
+# Copyright 2014 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+"""Pull latest revisions of the W3C test repos and update our DEPS entries.""" |
+ |
+import argparse |
+ |
+ |
+from webkitpy.common.webkit_finder import WebKitFinder |
+ |
+ |
+class DepsUpdater(object): |
+ def __init__(self, host): |
+ self.host = host |
+ self.executive = host.executive |
+ self.fs = host.filesystem |
+ self.finder = WebKitFinder(self.fs) |
+ self.verbose = False |
+ self.allow_local_blink_commits = False |
+ self.keep_w3c_repos_around = False |
+ |
+ def main(self, argv=None): |
+ self.parse_args(argv) |
+ |
+ self.cd('') |
+ if not self.checkout_is_okay(): |
+ return 1 |
+ |
+ self.print_('## noting the current Blink commitish') |
+ blink_commitish = self.run(['git', 'show-ref', 'HEAD'])[1].split()[0] |
+ |
+ wpt_import_text = self.update('web-platform-tests', |
+ 'https://chromium.googlesource.com/external/w3c/web-platform-tests.git') |
+ |
+ css_import_text = self.update('csswg-test', |
+ 'https://chromium.googlesource.com/external/w3c/csswg-test.git') |
+ |
+ self.commit_changes_if_needed(blink_commitish, css_import_text, wpt_import_text) |
+ |
+ return 0 |
+ |
+ def parse_args(self, argv): |
+ parser = argparse.ArgumentParser() |
+ parser.description = __doc__ |
+ parser.add_argument('-v', '--verbose', action='store_true', |
+ help='log what we are doing') |
+ parser.add_argument('--allow-local-blink-commits', action='store_true', |
+ help='allow script to run even if we have local blink commits') |
+ parser.add_argument('--keep-w3c-repos-around', action='store_true', |
+ help='leave the w3c repos around that were imported previously.') |
+ |
+ args = parser.parse_args(argv) |
+ self.allow_local_blink_commits = args.allow_local_blink_commits |
+ self.keep_w3c_repos_around = args.keep_w3c_repos_around |
+ self.verbose = args.verbose |
+ |
+ def checkout_is_okay(self): |
+ if self.run(['git', 'diff', '--quiet', 'HEAD'], exit_on_failure=False)[0]: |
+ self.print_('## blink checkout is dirty, aborting') |
+ return False |
+ |
+ local_blink_commits = self.run(['git', 'log', '--oneline', 'origin/master..HEAD'])[1] |
+ if local_blink_commits and not self.allow_local_blink_commits: |
+ self.print_('## blink checkout has local commits, aborting') |
+ return False |
+ |
+ if self.fs.exists(self.path_from_webkit_base('web-platform-tests')): |
+ self.print_('## web-platform-tests repo exists, aborting') |
+ return False |
+ |
+ if self.fs.exists(self.path_from_webkit_base('csswg-test')): |
+ self.print_('## csswg-test repo exists, aborting') |
+ return False |
+ |
+ return True |
+ |
+ def update(self, repo, url): |
+ self.print_('## cloning %s' % repo) |
+ self.cd('') |
+ self.run(['git', 'clone', url]) |
+ |
+ self.print_('## noting the revision we are importing') |
+ master_commitish = self.run(['git', 'show-ref', 'origin/master'])[1].split()[0] |
+ |
+ self.print_('## cleaning out tests from LayoutTests/imported/%s' % repo) |
+ dest_repo = self.path_from_webkit_base('LayoutTests', 'imported', repo) |
+ files_to_delete = self.fs.files_under(dest_repo, file_filter=self.is_not_baseline) |
+ for subpath in files_to_delete: |
+ self.remove('LayoutTests', 'imported', subpath) |
+ |
+ self.print_('## importing the tests') |
+ src_repo = self.path_from_webkit_base(repo) |
+ import_path = self.path_from_webkit_base('Tools', 'Scripts', 'import-w3c-tests') |
+ self.run([self.host.executable, import_path, '-d', 'imported', src_repo]) |
+ |
+ self.cd('') |
+ self.run(['git', 'add', '--all', 'LayoutTests/imported/%s' % repo]) |
+ |
+ self.print_('## deleting any orphaned baselines') |
+ previous_baselines = self.fs.files_under(dest_repo, file_filter=self.is_baseline) |
+ for subpath in previous_baselines: |
+ full_path = self.fs.join(dest_repo, subpath) |
+ if self.fs.glob(full_path.replace('-expected.txt', '*')) == [full_path]: |
+ self.fs.remove(full_path) |
+ |
+ if not self.keep_w3c_repos_around: |
+ self.print_('## deleting %s repo' % repo) |
+ self.cd('') |
+ self.rmtree(repo) |
+ |
+ return 'imported %s@%s' % (repo, master_commitish) |
+ |
+ def commit_changes_if_needed(self, blink_commitish, css_import_text, wpt_import_text): |
+ if self.run(['git', 'diff', '--quiet', 'HEAD'], exit_on_failure=False)[0]: |
+ self.print_('## commiting changes') |
+ commit_msg = ('update-w3c-deps import using blink %s:\n' |
+ '\n' |
+ '%s\n' |
+ '%s\n' % (blink_commitish, css_import_text, wpt_import_text)) |
+ path_to_commit_msg = self.path_from_webkit_base('commit_msg') |
+ if self.verbose: |
+ self.print_('cat > %s <<EOF' % path_to_commit_msg) |
+ self.print_(commit_msg) |
+ self.print_('EOF') |
+ self.fs.write_text_file(path_to_commit_msg, commit_msg) |
+ self.run(['git', 'commit', '-a', '-F', path_to_commit_msg]) |
+ self.remove(path_to_commit_msg) |
+ self.print_('## Done: changes imported and committed') |
+ else: |
+ self.print_('## Done: no changes to import') |
+ |
+ def is_baseline(self, fs, dirname, basename): |
+ return basename.endswith('-expected.txt') |
+ |
+ def is_not_baseline(self, fs, dirname, basename): |
+ return not self.is_baseline(fs, dirname, basename) |
+ |
+ def run(self, cmd, exit_on_failure=True): |
+ if self.verbose: |
+ self.print_(' '.join(cmd)) |
+ |
+ proc = self.executive.popen(cmd, stdout=self.executive.PIPE, stderr=self.executive.PIPE) |
+ out, err = proc.communicate() |
+ if proc.returncode or self.verbose: |
+ self.print_('# ret> %d' % proc.returncode) |
+ if out: |
+ for line in out.splitlines(): |
+ self.print_('# out> %s' % line) |
+ if err: |
+ for line in err.splitlines(): |
+ self.print_('# err> %s' % line) |
+ if exit_on_failure and proc.returncode: |
+ self.host.exit(proc.returncode) |
+ return proc.returncode, out |
+ |
+ def cd(self, *comps): |
+ dest = self.path_from_webkit_base(*comps) |
+ if self.verbose: |
+ self.print_('cd %s' % dest) |
+ self.fs.chdir(dest) |
+ |
+ def remove(self, *comps): |
+ dest = self.path_from_webkit_base(*comps) |
+ if self.verbose: |
+ self.print_('rm %s' % dest) |
+ self.fs.remove(dest) |
+ |
+ def rmtree(self, *comps): |
+ dest = self.path_from_webkit_base(*comps) |
+ if self.verbose: |
+ self.print_('rm -fr %s' % dest) |
+ self.fs.rmtree(dest) |
+ |
+ def path_from_webkit_base(self, *comps): |
+ return self.finder.path_from_webkit_base(*comps) |
+ |
+ def print_(self, msg): |
+ self.host.print_(msg) |