14c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org#!/usr/bin/env python
24c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org# Copyright 2014 the V8 project authors. All rights reserved.
34c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org# Use of this source code is governed by a BSD-style license that can be
44c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org# found in the LICENSE file.
54c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
64c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org"""
74c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgScript for auto-increasing the version on bleeding_edge.
84c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
94c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgThe script can be run regularly by a cron job. It will increase the build
104c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orglevel of the version on bleeding_edge if:
114c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org- the lkgr version is smaller than the version of the latest revision,
124c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org- the lkgr version is not a version change itself,
134c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org- the tree is not closed for maintenance.
144c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
154c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgThe new version will be the maximum of the bleeding_edge and trunk versions +1.
164c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgE.g. latest bleeding_edge version: 3.22.11.0 and latest trunk 3.23.0.0 gives
174c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgthe new version 3.23.1.0.
184c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
194c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgThis script requires a depot tools git checkout. I.e. 'fetch v8'.
204c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org"""
214c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
224c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgimport argparse
234c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgimport os
244c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgimport sys
254c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
264c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfrom common_includes import *
274c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
284c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgVERSION_BRANCH = "auto-bump-up-version"
294c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
304c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
314c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgclass Preparation(Step):
324c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  MESSAGE = "Preparation."
334c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
344c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  def RunStep(self):
354c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    # Check for a clean workdir.
364c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    if not self.GitIsWorkdirClean():  # pragma: no cover
374c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      # This is in case a developer runs this script on a dirty tree.
384c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      self.GitStash()
394c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
404c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    # TODO(machenbach): This should be called master after the git switch.
414c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self.GitCheckout("bleeding_edge")
424c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
434c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self.GitPull()
444c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
454c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    # Ensure a clean version branch.
464c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self.DeleteBranch(VERSION_BRANCH)
474c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
484c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
494c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgclass GetCurrentBleedingEdgeVersion(Step):
504c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  MESSAGE = "Get latest bleeding edge version."
514c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
524c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  def RunStep(self):
534c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    # TODO(machenbach): This should be called master after the git switch.
544c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self.GitCheckout("bleeding_edge")
554c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
564c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    # Store latest version and revision.
574c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self.ReadAndPersistVersion()
584c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self["latest_version"] = self.ArrayToVersion("")
594c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self["latest"] = self.GitLog(n=1, format="%H")
604c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    print "Bleeding edge version: %s" % self["latest_version"]
614c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
624c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
634c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org# This step is pure paranoia. It forbids the script to continue if the last
644c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org# commit changed version.cc. Just in case the other bailout has a bug, this
654c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org# prevents the script from continuously commiting version changes.
664c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgclass LastChangeBailout(Step):
674c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  MESSAGE = "Stop script if the last change modified the version."
684c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
694c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  def RunStep(self):
7006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    if VERSION_FILE in self.GitChangedFiles(self["latest"]):
714c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      print "Stop due to recent version change."
724c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      return True
734c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
744c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
754c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org# TODO(machenbach): Implement this for git.
764c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgclass FetchLKGR(Step):
774c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  MESSAGE = "Fetching V8 LKGR."
784c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
794c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  def RunStep(self):
804c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    lkgr_url = "https://v8-status.appspot.com/lkgr"
814c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self["lkgr_svn"] = self.ReadURL(lkgr_url, wait_plan=[5])
824c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
834c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
844c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org# TODO(machenbach): Implement this for git. With a git lkgr we could simply
854c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org# checkout that revision. With svn, we have to search backwards until that
864c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org# revision is found.
874c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgclass GetLKGRVersion(Step):
884c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  MESSAGE = "Get bleeding edge lkgr version."
894c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
904c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  def RunStep(self):
914c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self.GitCheckout("bleeding_edge")
924c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    # If the commit was made from svn, there is a mapping entry in the commit
934c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    # message.
944c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self["lkgr"] = self.GitLog(
954c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        grep="^git-svn-id: [^@]*@%s [A-Za-z0-9-]*$" % self["lkgr_svn"],
964c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        format="%H")
974c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
984c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    # FIXME(machenbach): http://crbug.com/391712 can lead to svn lkgrs on the
994c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    # trunk branch (rarely).
1004c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    if not self["lkgr"]:  # pragma: no cover
1014c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      self.Die("No git hash found for svn lkgr.")
1024c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1034c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self.GitCreateBranch(VERSION_BRANCH, self["lkgr"])
1044c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self.ReadAndPersistVersion("lkgr_")
1054c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self["lkgr_version"] = self.ArrayToVersion("lkgr_")
1064c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    print "LKGR version: %s" % self["lkgr_version"]
1074c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1084c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    # Ensure a clean version branch.
1094c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self.GitCheckout("bleeding_edge")
1104c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self.DeleteBranch(VERSION_BRANCH)
1114c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1124c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1134c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgclass LKGRVersionUpToDateBailout(Step):
1144c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  MESSAGE = "Stop script if the lkgr has a renewed version."
1154c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1164c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  def RunStep(self):
1174c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    # If a version-change commit becomes the lkgr, don't bump up the version
1184c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    # again.
11906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    if VERSION_FILE in self.GitChangedFiles(self["lkgr"]):
1204c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      print "Stop because the lkgr is a version change itself."
1214c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      return True
1224c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1234c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    # Don't bump up the version if it got updated already after the lkgr.
1244c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    if SortingKey(self["lkgr_version"]) < SortingKey(self["latest_version"]):
1254c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      print("Stop because the latest version already changed since the lkgr "
1264c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org            "version.")
1274c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      return True
1284c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1294c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1304c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgclass GetTrunkVersion(Step):
1314c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  MESSAGE = "Get latest trunk version."
1324c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1334c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  def RunStep(self):
1344c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    # TODO(machenbach): This should be called trunk after the git switch.
1354c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self.GitCheckout("master")
1364c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self.GitPull()
1374c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self.ReadAndPersistVersion("trunk_")
1384c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self["trunk_version"] = self.ArrayToVersion("trunk_")
1394c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    print "Trunk version: %s" % self["trunk_version"]
1404c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1414c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1424c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgclass CalculateVersion(Step):
1434c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  MESSAGE = "Calculate the new version."
1444c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1454c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  def RunStep(self):
1464c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    if self["lkgr_build"] == "9999":  # pragma: no cover
1474c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      # If version control on bleeding edge was switched off, just use the last
1484c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      # trunk version.
1494c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      self["lkgr_version"] = self["trunk_version"]
1504c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1514c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    # The new version needs to be greater than the max on bleeding edge and
1524c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    # trunk.
1534c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    max_version = max(self["trunk_version"],
1544c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org                      self["lkgr_version"],
1554c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org                      key=SortingKey)
1564c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1574c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    # Strip off possible leading zeros.
1584c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self["new_major"], self["new_minor"], self["new_build"], _ = (
1594c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        map(str, map(int, max_version.split("."))))
1604c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1614c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self["new_build"] = str(int(self["new_build"]) + 1)
1624c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self["new_patch"] = "0"
1634c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1644c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self["new_version"] = ("%s.%s.%s.0" %
1654c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        (self["new_major"], self["new_minor"], self["new_build"]))
1664c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    print "New version is %s" % self["new_version"]
1674c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1684c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    if self._options.dry_run:  # pragma: no cover
1694c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      print "Dry run, skipping version change."
1704c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      return True
1714c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1724c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1734c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgclass CheckTreeStatus(Step):
1744c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  MESSAGE = "Checking v8 tree status message."
1754c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1764c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  def RunStep(self):
1774c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    status_url = "https://v8-status.appspot.com/current?format=json"
1784c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    status_json = self.ReadURL(status_url, wait_plan=[5, 20, 300, 300])
1794c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    message = json.loads(status_json)["message"]
1804c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    if re.search(r"maintenance|no commits", message, flags=re.I):
1814c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      print "Skip version change by tree status: \"%s\"" % message
1824c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      return True
1834c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1844c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1854c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgclass ChangeVersion(Step):
1864c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  MESSAGE = "Bump up the version."
1874c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1884c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  def RunStep(self):
1894c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    self.GitCreateBranch(VERSION_BRANCH, "bleeding_edge")
1904c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
19106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    self.SetVersion(os.path.join(self.default_cwd, VERSION_FILE), "new_")
1924c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1934c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    try:
19442ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org      msg = "[Auto-roll] Bump up version to %s" % self["new_version"]
19542ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org      self.GitCommit("%s\n\nTBR=%s" % (msg, self._options.author),
19642ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org                     author=self._options.author)
19742ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org      if self._options.svn:
19842ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org        self.SVNCommit("branches/bleeding_edge", msg)
19942ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org      else:
20042ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org        self.GitUpload(author=self._options.author,
20142ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org                       force=self._options.force_upload,
20242ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org                       bypass_hooks=True)
20342ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org        self.GitDCommit()
2044c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      print "Successfully changed the version."
2054c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    finally:
2064c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      # Clean up.
2074c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      self.GitCheckout("bleeding_edge")
2084c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      self.DeleteBranch(VERSION_BRANCH)
2094c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
2104c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
2114c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgclass BumpUpVersion(ScriptsBase):
2124c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  def _PrepareOptions(self, parser):
2134c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    parser.add_argument("--dry_run", help="Don't commit the new version.",
2144c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org                        default=False, action="store_true")
2154c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
2164c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  def _ProcessOptions(self, options):  # pragma: no cover
2174c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    if not options.dry_run and not options.author:
2184c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      print "Specify your chromium.org email with -a"
2194c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      return False
2204c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    options.wait_for_lgtm = False
2214c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    options.force_readline_defaults = True
2224c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    options.force_upload = True
2234c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    return True
2244c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
22506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org  def _Config(self):
22606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    return {
22706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org      "PERSISTFILE_BASENAME": "/tmp/v8-bump-up-version-tempfile",
22806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    }
22906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org
2304c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  def _Steps(self):
2314c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    return [
2324c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      Preparation,
2334c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      GetCurrentBleedingEdgeVersion,
2344c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      LastChangeBailout,
2354c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      FetchLKGR,
2364c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      GetLKGRVersion,
2374c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      LKGRVersionUpToDateBailout,
2384c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      GetTrunkVersion,
2394c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      CalculateVersion,
2404c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      CheckTreeStatus,
2414c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      ChangeVersion,
2424c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    ]
2434c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
2444c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgif __name__ == "__main__":  # pragma: no cover
24506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org  sys.exit(BumpUpVersion().Run())
246