| OLD | NEW |
| (Empty) |
| 1 # Copyright 2016 The Chromium Authors. All rights reserved. | |
| 2 # Use of this source code is governed by a BSD-style license that can be | |
| 3 # found in the LICENSE file. | |
| 4 | |
| 5 """A utility class for interacting with the Chromium git tree | |
| 6 for use cases relating to the Web Platform Tests. | |
| 7 """ | |
| 8 | |
| 9 CHROMIUM_WPT_DIR = 'third_party/WebKit/LayoutTests/imported/wpt/' | |
| 10 | |
| 11 from webkitpy.common.memoized import memoized | |
| 12 from webkitpy.common.webkit_finder import WebKitFinder | |
| 13 from webkitpy.w3c.deps_updater import DepsUpdater | |
| 14 | |
| 15 | |
| 16 class ChromiumWPT(object): | |
| 17 | |
| 18 def __init__(self, host): | |
| 19 """ | |
| 20 Args: | |
| 21 host: A Host object. | |
| 22 """ | |
| 23 self.host = host | |
| 24 | |
| 25 def exportable_commits_since(self, commit): | |
| 26 """Returns SHAs of exportable commits since `commit` in chronological or
der. | |
| 27 | |
| 28 Args: | |
| 29 commit: The SHA of the Chromium commit from which this method will l
ook. | |
| 30 """ | |
| 31 toplevel = self.host.executive.run_command([ | |
| 32 'git', 'rev-parse', '--show-toplevel' | |
| 33 ]).strip() | |
| 34 | |
| 35 commits = self.host.executive.run_command([ | |
| 36 'git', 'rev-list', '{}..HEAD'.format(commit), '--reverse', | |
| 37 '--', toplevel + '/' + CHROMIUM_WPT_DIR | |
| 38 ]).splitlines() | |
| 39 | |
| 40 # TODO(jeffcarp): allow this logic to be shared | |
| 41 def is_exportable(chromium_commit): | |
| 42 message = self.message(chromium_commit) | |
| 43 return ( | |
| 44 'NOEXPORT=true' not in message | |
| 45 and not message.startswith('Import ') | |
| 46 # TODO(jeffcarp): change this to allow any commit with | |
| 47 # any non-expectation changes to be exportable | |
| 48 and not self._has_expectations(chromium_commit) | |
| 49 ) | |
| 50 | |
| 51 return filter(is_exportable, commits) | |
| 52 | |
| 53 def _has_expectations(self, chromium_commit): | |
| 54 files = self.host.executive.run_command([ | |
| 55 'git', 'diff-tree', '--no-commit-id', | |
| 56 '--name-only', '-r', chromium_commit | |
| 57 ]).splitlines() | |
| 58 | |
| 59 return any(DepsUpdater.is_baseline(f) for f in files) | |
| 60 | |
| 61 def subject(self, chromium_commit): | |
| 62 return self.host.executive.run_command([ | |
| 63 'git', 'show', '--format=%s', '--no-patch', chromium_commit | |
| 64 ]) | |
| 65 | |
| 66 def commit_position(self, chromium_commit): | |
| 67 return self.host.executive.run_command([ | |
| 68 'git', 'footers', '--position', chromium_commit | |
| 69 ]) | |
| 70 | |
| 71 def message(self, chromium_commit): | |
| 72 """Returns a string with a commit's subject and body.""" | |
| 73 return self.host.executive.run_command([ | |
| 74 'git', 'show', '--format=%B', '--no-patch', chromium_commit | |
| 75 ]) | |
| 76 | |
| 77 def format_patch(self, chromium_commit): | |
| 78 """Makes a patch with just changes in files in the WPT for a given commi
t.""" | |
| 79 # TODO(jeffcarp): do not include expectations files | |
| 80 return self.host.executive.run_command([ | |
| 81 'git', 'format-patch', '-1', '--stdout', | |
| 82 chromium_commit, self.absolute_chromium_wpt_dir() | |
| 83 ]) | |
| 84 | |
| 85 @memoized | |
| 86 def absolute_chromium_wpt_dir(self): | |
| 87 finder = WebKitFinder(self.host.filesystem) | |
| 88 return finder.path_from_webkit_base('LayoutTests', 'imported', 'wpt') | |
| OLD | NEW |