diff options
| author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-01-06 14:44:00 +0100 |
|---|---|---|
| committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-01-06 14:44:00 +0100 |
| commit | 40736c5763bf61337c8c14e16d8587db021a87d4 (patch) | |
| tree | b17a9c00042ad89cb1308e2484491799aa14e9f8 /Tools/Scripts/webkitpy/common/config/contributionareas.py | |
| download | qtwebkit-40736c5763bf61337c8c14e16d8587db021a87d4.tar.gz | |
Imported WebKit commit 2ea9d364d0f6efa8fa64acf19f451504c59be0e4 (http://svn.webkit.org/repository/webkit/trunk@104285)
Diffstat (limited to 'Tools/Scripts/webkitpy/common/config/contributionareas.py')
| -rw-r--r-- | Tools/Scripts/webkitpy/common/config/contributionareas.py | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/Tools/Scripts/webkitpy/common/config/contributionareas.py b/Tools/Scripts/webkitpy/common/config/contributionareas.py new file mode 100644 index 000000000..61a7488d6 --- /dev/null +++ b/Tools/Scripts/webkitpy/common/config/contributionareas.py @@ -0,0 +1,217 @@ +# Copyright (c) 2011 Google Inc. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import re + + +class _Intersection(object): + def __init__(self, *tokens): + self._tokens = tokens + + def matches(self, tokens): + for token in self._tokens: + if token not in tokens and (token + 's') not in tokens: + return False + return True + + +class _Area(object): + def __init__(self, name, tokens=None): + self._name = name + self._tokens = tokens if tokens else [self._name_to_token(name)] + + def _name_to_token(self, word): + token = word.lower() + return token[:-1] if word[-1] == 's' else token + + def matches(self, tokens): + # FIXME: Support pluraization properly + for token in self._tokens: + if isinstance(token, _Intersection): + if token.matches(tokens): + return True + elif token in tokens or (token + 's') in tokens: + return True + return False + + def name(self): + return self._name + + def tokens(self): + return self._tokens + +contribution_areas = [ + _Area('ARM JIT', ['arm']), +# FIXME: 'Accelerated compositing / GPU acceleration' + _Area('Accessibility'), + _Area('Android port', ['android']), + _Area('Animation', ['animation', 'animator']), + _Area('Apple\'s Windows port', ['win', 'windows']), # FIXME: need to exclude chromium... + _Area('Autotools Build', ['autotools']), + _Area('Basic types and data structures (WTF)', ['wtf']), +# FIXME: 'Bidirectional text' +# FIXME: 'Build/test infrastructure (stuff under Tools/Scripts)' + _Area('CMake Build', ['cmakelist']), + _Area('CSS (Cascading Style Sheets)', ['css']), + _Area('CSS Transforms', [_Intersection('css', 'transforms')]), + _Area('CSS/SVG Filters', [_Intersection('css', 'filters'), _Intersection('svg', 'filters')]), + _Area('CURL HTTP Backend', ['CURL']), + _Area('Resource Cache', [_Intersection('loader', 'cache')]), + _Area('Memory Cache', [_Intersection('graphics', 'cache')]), + _Area('Cairo'), + _Area('Canvas'), + _Area('Chromium Linux', [_Intersection('chromium', 'linux')]), +# FIXME: 'Commit Queue' + _Area('Core DOM', ['dom']), + _Area('Core Graphics', ['cg']), + _Area('Bindings'), + _Area('DOM Storage', ['storage']), + _Area('Drag and Drop', ['drag']), + _Area('DumpRenderTree'), + _Area('EFL', ['efl']), + _Area('Editing / Selection', ['editing']), + _Area('Event Handling', ['event']), + _Area('FastMalloc'), + _Area('File API', ['fileapi']), + _Area('Fonts'), + _Area('Forms'), +# FIXME: 'Frame Flattening' + _Area('Frame Loader'), +# FIXME: 'General' Maybe auto-detect people contributing to all subdirectories? + _Area('Geolocation API', ['geolocation']), + _Area('Graphics', ['graphics']), + _Area('HTML', ['html']), + _Area('HTML Parser', [_Intersection('html', 'parser')]), # FIXME: matches html/track/WebVTTParser.cpp + _Area('HTML5 Media Support', ['media']), + _Area('History', ['history']), +# FIXME: 'Hit testing' + _Area('Image Decoder', ['imagedecoder']), +# FIXME: 'Input methods' + _Area('JSC Bindings', [_Intersection('bindings', 'js')]), + _Area('JavaScriptCore'), + _Area('JavaScriptCore Regular Expressions', [_Intersection('JavaScriptCore', 'regexp')]), +# FIXME: 'Layout tests' but what does it mean to say you're an expert on layout tests? Maybe worked on tools? + _Area('Loader', ['loader']), + _Area('MathML'), + _Area('Memory Use / Leaks', ['leaks']), # Probably need more tokens + _Area('MessagePorts'), + _Area('Network', [_Intersection('platform', 'network')]), + _Area('new-run-webkit-tests', ['layout_tests']), + _Area('OpenVG graphics backend', ['openvg']), +# FIXME: 'Performance' + _Area('Plug-ins', ['plugins']), + _Area('Printing', ['printing', 'print']), + _Area('Rendering'), + _Area('SVG (Scalable Vector Graphics)', ['svg']), + _Area('Scrollbars', ['scroll']), + _Area('Security'), # Probably need more tokens +# FIXME: 'Shadow DOM' + _Area('Skia'), + _Area('Soup Network Backend', ['soup']), +# FIXME: 'Spell Checking' just need tokens + _Area('Tables', ['htmltable', 'rendertable']), +# FIXME: 'Text Encoding' +# FIXME: 'Text Layout' + _Area('The Chromium Port', ['chromium']), + _Area('The EFLWebKit Port', ['efl']), + _Area('The WebKitGTK+ Port', ['gtk']), + _Area('The Haiku Port', ['haiku']), + _Area('The QtWebKit Port', ['qt']), + _Area('The WinCE Port', ['wince']), + _Area('The WinCairo Port', ['cairo']), + _Area('The wxWebKit Port', ['wx']), + _Area('Threading', ['thread']), + _Area('Tools'), + _Area('Touch Support', ['touch']), + _Area('Transforms', ['transforms']), # There's also CSS transforms + _Area('Transitions', ['transitions']), # This only matches transition events at the moment + _Area('URL Parsing', ['KURL']), # Probably need more tokens + _Area('V8', ['v8']), + _Area('V8 Bindings', [_Intersection('bindings', 'v8')]), + _Area('Web Inspector / Developer Tools', ['inspector']), + _Area('Web Timing', ['PerformanceNavigation', 'PerformanceTiming']), # more tokens? + _Area('WebArchive'), + _Area('WebCore Icon Database', ['icon']), + _Area('WebGL', ['webgl']), + _Area('WebKit Websites', ['websites']), + _Area('WebKit2'), + _Area('WebSQL Databases', [_Intersection('storage', 'database')]), + _Area('WebSockets'), + _Area('Workers'), + _Area('XML'), + _Area('XMLHttpRequest'), + _Area('XSLT'), + _Area('XSSAuditor'), + _Area('WebKit API Tests', ['TestWebKitAPI']), + _Area('webkit-patch', [_Intersection('webkitpy', 'commands')]), +] + + +class ContributionAreas(object): + def __init__(self, filesystem, table=contribution_areas): + self._filesystem = filesystem + self._contribution_areas = table + + def names(self): + return [area.name() for area in self._contribution_areas] + + def names(self): + return [area.name() for area in self._contribution_areas] + + def _split_path(self, path): + result = [] + while path and len(path): + next_path, tail = self._filesystem.split(path) + if path == next_path: + break + if tail and len(tail): + result.append(tail) + path = next_path + return result + + def _split_camelcase(self, name, transform=lambda x: x): + result = [] + while name and len(name): + m = re.match('^([A-Z][a-z0-9]+)|([A-Z0-9]+(?=([A-Z][a-z0-9]|\.|$)))', name) + if m: + result.append(transform(m.group(0))) + name = name[m.end():] + else: + return result + return result + + def areas_for_touched_files(self, touched_files): + areas = set() + for file_path in touched_files: + split_file_path = self._split_path(file_path) + tokenized_file_path = None + tokenized_file_path = sum([self._split_camelcase(token, lambda x: x.lower()) for token in split_file_path], []) + for area in self._contribution_areas: + if area.matches(split_file_path) or area.matches(tokenized_file_path): + areas.add(area.name()) + return areas |
