| Index: tools/push-to-trunk/common_includes.py
|
| diff --git a/tools/push-to-trunk/common_includes.py b/tools/push-to-trunk/common_includes.py
|
| index 8d08f30ca4042efedf46273fbe85f6d39940ad62..e4a04002e6625d7a1a143be6c700e644bdf9dea0 100644
|
| --- a/tools/push-to-trunk/common_includes.py
|
| +++ b/tools/push-to-trunk/common_includes.py
|
| @@ -212,6 +212,19 @@ class SideEffectHandler(object):
|
| DEFAULT_SIDE_EFFECT_HANDLER = SideEffectHandler()
|
|
|
|
|
| +class NoRetryException(Exception):
|
| + pass
|
| +
|
| +class CommonOptions(object):
|
| + def __init__(self, options, manual=True):
|
| + self.requires_editor = True
|
| + self.wait_for_lgtm = True
|
| + self.s = options.s
|
| + self.force_readline_defaults = not manual
|
| + self.force_upload = not manual
|
| + self.manual = manual
|
| +
|
| +
|
| class Step(object):
|
| def __init__(self, text, requires, number, config, state, options, handler):
|
| self._text = text
|
| @@ -225,16 +238,11 @@ class Step(object):
|
| assert self._config is not None
|
| assert self._state is not None
|
| assert self._side_effect_handler is not None
|
| + assert isinstance(options, CommonOptions)
|
|
|
| def Config(self, key):
|
| return self._config[key]
|
|
|
| - def IsForced(self):
|
| - return self._options and self._options.f
|
| -
|
| - def IsManual(self):
|
| - return self._options and self._options.m
|
| -
|
| def Run(self):
|
| if self._requires:
|
| self.RestoreIfUnset(self._requires)
|
| @@ -263,6 +271,8 @@ class Step(object):
|
| got_exception = False
|
| try:
|
| result = cb()
|
| + except NoRetryException, e:
|
| + raise e
|
| except Exception:
|
| got_exception = True
|
| if got_exception or retry_on(result):
|
| @@ -277,7 +287,7 @@ class Step(object):
|
|
|
| def ReadLine(self, default=None):
|
| # Don't prompt in forced mode.
|
| - if not self.IsManual() and default is not None:
|
| + if self._options.force_readline_defaults and default is not None:
|
| print "%s (forced)" % default
|
| return default
|
| else:
|
| @@ -288,7 +298,7 @@ class Step(object):
|
| return self.Retry(cmd, retry_on, [5, 30])
|
|
|
| def Editor(self, args):
|
| - if not self.IsForced():
|
| + if self._options.requires_editor:
|
| return self._side_effect_handler.Command(os.environ["EDITOR"], args,
|
| pipe=False)
|
|
|
| @@ -307,7 +317,7 @@ class Step(object):
|
| raise Exception(msg)
|
|
|
| def DieNoManualMode(self, msg=""):
|
| - if not self.IsManual():
|
| + if not self._options.manual:
|
| msg = msg or "Only available in manual mode."
|
| self.Die(msg)
|
|
|
| @@ -348,7 +358,7 @@ class Step(object):
|
| self.Die("This is not a git checkout, this script won't work for you.")
|
|
|
| # Cancel if EDITOR is unset or not executable.
|
| - if (not self.IsForced() and (not os.environ.get("EDITOR") or
|
| + if (self._options.requires_editor and (not os.environ.get("EDITOR") or
|
| Command("which", os.environ["EDITOR"]) is None)):
|
| self.Die("Please set your EDITOR environment variable, you'll need it.")
|
|
|
| @@ -418,7 +428,7 @@ class Step(object):
|
| answer = ""
|
| while answer != "LGTM":
|
| print "> ",
|
| - answer = self.ReadLine("LGTM" if self.IsForced() else None)
|
| + answer = self.ReadLine(None if self._options.wait_for_lgtm else "LGTM")
|
| if answer != "LGTM":
|
| print "That was not 'LGTM'."
|
|
|
| @@ -454,7 +464,7 @@ class UploadStep(Step):
|
| print "Please enter the email address of a V8 reviewer for your patch: ",
|
| self.DieNoManualMode("A reviewer must be specified in forced mode.")
|
| reviewer = self.ReadLine()
|
| - force_flag = " -f" if not self.IsManual() else ""
|
| + force_flag = " -f" if self._options.force_upload else ""
|
| args = "cl upload -r \"%s\" --send-mail%s" % (reviewer, force_flag)
|
| # TODO(machenbach): Check output in forced mode. Verify that all required
|
| # base files were uploaded, if not retry.
|
|
|