| Index: tools/push-to-trunk/auto_roll.py | 
| diff --git a/tools/push-to-trunk/auto_roll.py b/tools/push-to-trunk/auto_roll.py | 
| index c7de2a7067554e1473baa2b996a6af67405c59a5..3ba4481534f7903ef848cf36a30b5472a261f9e8 100755 | 
| --- a/tools/push-to-trunk/auto_roll.py | 
| +++ b/tools/push-to-trunk/auto_roll.py | 
| @@ -26,15 +26,20 @@ | 
| # (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 json | 
| import optparse | 
| +import os | 
| import re | 
| import sys | 
|  | 
| from common_includes import * | 
|  | 
| +SETTINGS_LOCATION = "SETTINGS_LOCATION" | 
| + | 
| CONFIG = { | 
| PERSISTFILE_BASENAME: "/tmp/v8-auto-roll-tempfile", | 
| DOT_GIT_LOCATION: ".git", | 
| +  SETTINGS_LOCATION: "~/.auto-roll", | 
| } | 
|  | 
|  | 
| @@ -52,6 +57,29 @@ class Preparation(Step): | 
| self.CommonPrepare() | 
|  | 
|  | 
| +class CheckAutoRollSettings(Step): | 
| +  MESSAGE = "Checking settings file." | 
| + | 
| +  def RunStep(self): | 
| +    settings_file = os.path.realpath(self.Config(SETTINGS_LOCATION)) | 
| +    if os.path.exists(settings_file): | 
| +      settings_dict = json.loads(FileToText(settings_file)) | 
| +      if settings_dict.get("enable_auto_roll") is False: | 
| +        self.Die("Push to trunk disabled by auto-roll settings file: %s" | 
| +                 % settings_file) | 
| + | 
| + | 
| +class CheckTreeStatus(Step): | 
| +  MESSAGE = "Checking v8 tree status message." | 
| + | 
| +  def RunStep(self): | 
| +    status_url = "https://v8-status.appspot.com/current?format=json" | 
| +    status_json = self.ReadURL(status_url, wait_plan=[5, 20, 300, 300]) | 
| +    message = json.loads(status_json)["message"] | 
| +    if re.search(r"nopush|no push", message, flags=re.I): | 
| +      self.Die("Push to trunk disabled by tree state: %s" % message) | 
| + | 
| + | 
| class FetchLatestRevision(Step): | 
| MESSAGE = "Fetching latest V8 revision." | 
|  | 
| @@ -115,6 +143,8 @@ def RunAutoRoll(config, | 
| side_effect_handler=DEFAULT_SIDE_EFFECT_HANDLER): | 
| step_classes = [ | 
| Preparation, | 
| +    CheckAutoRollSettings, | 
| +    CheckTreeStatus, | 
| FetchLatestRevision, | 
| CheckLastPush, | 
| FetchLKGR, | 
|  |