WebKitTools/Scripts/webkitpy/tool/steps/abstractstep.py
changeset 0 4f2f89ce4247
equal deleted inserted replaced
-1:000000000000 0:4f2f89ce4247
       
     1 # Copyright (C) 2010 Google Inc. All rights reserved.
       
     2 # 
       
     3 # Redistribution and use in source and binary forms, with or without
       
     4 # modification, are permitted provided that the following conditions are
       
     5 # met:
       
     6 # 
       
     7 #     * Redistributions of source code must retain the above copyright
       
     8 # notice, this list of conditions and the following disclaimer.
       
     9 #     * Redistributions in binary form must reproduce the above
       
    10 # copyright notice, this list of conditions and the following disclaimer
       
    11 # in the documentation and/or other materials provided with the
       
    12 # distribution.
       
    13 #     * Neither the name of Google Inc. nor the names of its
       
    14 # contributors may be used to endorse or promote products derived from
       
    15 # this software without specific prior written permission.
       
    16 # 
       
    17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
    18 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
    19 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
    20 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
    21 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
    22 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
    23 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
    24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
    25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
    26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
    27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
    28 
       
    29 from webkitpy.common.system.deprecated_logging import log
       
    30 from webkitpy.common.system.executive import ScriptError
       
    31 from webkitpy.common.config.ports import WebKitPort
       
    32 from webkitpy.tool.steps.options import Options
       
    33 
       
    34 
       
    35 class AbstractStep(object):
       
    36     def __init__(self, tool, options):
       
    37         self._tool = tool
       
    38         if options.no_squash:
       
    39             raise ScriptError('--no-squash has been removed. Use "--git-commit=HEAD.." or "-g HEAD.." to operate on the working copy.')
       
    40         if options.squash:
       
    41             raise ScriptError('--squash has been removed. It is now the default behavior if --git-commit is omitted.')
       
    42         self._options = options
       
    43         self._port = None
       
    44 
       
    45     def _run_script(self, script_name, args=None, quiet=False, port=WebKitPort):
       
    46         log("Running %s" % script_name)
       
    47         command = [port.script_path(script_name)]
       
    48         if args:
       
    49             command.extend(args)
       
    50         # FIXME: This should use self.port()
       
    51         self._tool.executive.run_and_throw_if_fail(command, quiet)
       
    52 
       
    53     # FIXME: The port should live on the tool.
       
    54     def port(self):
       
    55         if self._port:
       
    56             return self._port
       
    57         self._port = WebKitPort.port(self._options.port)
       
    58         return self._port
       
    59 
       
    60     _well_known_keys = {
       
    61         "diff": lambda self, state: self._tool.scm().create_patch(self._options.git_commit),
       
    62         "changelogs": lambda self, state: self._tool.checkout().modified_changelogs(self._options.git_commit),
       
    63         "bug_title": lambda self, state: self._tool.bugs.fetch_bug(state["bug_id"]).title(),
       
    64     }
       
    65 
       
    66     def cached_lookup(self, state, key, promise=None):
       
    67         if state.get(key):
       
    68             return state[key]
       
    69         if not promise:
       
    70             promise = self._well_known_keys.get(key)
       
    71         state[key] = promise(self, state)
       
    72         return state[key]
       
    73 
       
    74     @classmethod
       
    75     def options(cls):
       
    76         return [
       
    77             # We need this option here because cached_lookup uses it.  :(
       
    78             Options.git_commit,
       
    79             # FIXME: Get rid of these.
       
    80             Options.no_squash,
       
    81             Options.squash,
       
    82         ]
       
    83 
       
    84     def run(self, state):
       
    85         raise NotImplementedError, "subclasses must implement"