blob: 49f9529ee5e0e2880668fecaec2ac5ab06fcc833 [file] [log] [blame]
# Copyright (C) 2017 Apple 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:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. 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.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS 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 APPLE INC. OR ITS 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 logging
import re
from webkitpy.common.system.executive import ScriptError
from webkitpy.tool.steps.abstractstep import AbstractStep
from webkitpy.tool.steps.options import Options
_log = logging.getLogger(__name__)
class CheckPatchRelevance(AbstractStep):
@classmethod
def options(cls):
return AbstractStep.options() + [
Options.group,
Options.quiet,
]
bindings_paths = [
"Source/WebCore",
"Tools",
]
jsc_paths = [
"JSTests/",
"Source/JavaScriptCore/",
"Source/WTF/",
"Source/bmalloc/",
"Makefile",
"Makefile.shared",
"Source/Makefile",
"Source/Makefile.shared",
"Tools/Scripts/build-webkit",
"Tools/Scripts/build-jsc",
"Tools/Scripts/jsc-stress-test-helpers/",
"Tools/Scripts/run-jsc",
"Tools/Scripts/run-jsc-benchmarks",
"Tools/Scripts/run-jsc-stress-tests",
"Tools/Scripts/run-javascriptcore-tests",
"Tools/Scripts/run-layout-jsc",
"Tools/Scripts/update-javascriptcore-test-results",
"Tools/Scripts/webkitdirs.pm",
]
webkitpy_paths = [
"Tools/Scripts/webkitpy/",
"Tools/QueueStatusServer/",
]
group_to_paths_mapping = {
'bindings': bindings_paths,
'jsc': jsc_paths,
'webkitpy': webkitpy_paths,
}
def _changes_are_relevant(self, changed_files):
# In the default case, all patches are relevant
if self._options.group not in self.group_to_paths_mapping:
return True
patterns = self.group_to_paths_mapping[self._options.group]
for changed_file in changed_files:
for pattern in patterns:
if re.search(pattern, changed_file, re.IGNORECASE):
return True
return False
def run(self, state):
_log.info("Checking relevance of patch")
change_list = self._tool.scm().changed_files()
if self._changes_are_relevant(change_list):
return True
_log.debug("This patch does not have relevant changes.")
raise ScriptError(message="This patch does not have relevant changes.")