1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#!/usr/bin/env python
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# Copyright 2014 the V8 project authors. All rights reserved.
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# Use of this source code is governed by a BSD-style license that can be
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# found in the LICENSE file.
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport argparse
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport os
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport sys
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfrom common_includes import *
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Preparation(Step):
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MESSAGE = "Preparation."
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def RunStep(self):
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # Update v8 remote tracking branches.
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.GitFetchOrigin()
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass DetectLastPush(Step):
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MESSAGE = "Detect commit ID of last push to trunk."
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def RunStep(self):
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self["last_push"] = self._options.last_push or self.FindLastTrunkPush(
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        branch="origin/master", include_patches=True)
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self["trunk_revision"] = self.GetCommitPositionNumber(self["last_push"])
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self["push_title"] = self.GitLog(n=1, format="%s",
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                     git_hash=self["last_push"])
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SwitchChromium(Step):
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MESSAGE = "Switch to Chromium checkout."
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def RunStep(self):
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self["v8_path"] = os.getcwd()
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    cwd = self._options.chromium
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    os.chdir(cwd)
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.InitialEnvironmentChecks(cwd)
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # Check for a clean workdir.
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if not self.GitIsWorkdirClean(cwd=cwd):  # pragma: no cover
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      self.Die("Workspace is not clean. Please commit or undo your changes.")
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # Assert that the DEPS file is there.
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if not os.path.exists(os.path.join(cwd, "DEPS")):  # pragma: no cover
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      self.Die("DEPS file not present.")
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass UpdateChromiumCheckout(Step):
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MESSAGE = "Update the checkout and create a new branch."
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def RunStep(self):
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.GitCheckout("master", cwd=self._options.chromium)
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.Command("gclient", "sync --nohooks", cwd=self._options.chromium)
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.GitPull(cwd=self._options.chromium)
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # Update v8 remotes.
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.GitFetchOrigin()
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.GitCreateBranch("v8-roll-%s" % self["trunk_revision"],
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         cwd=self._options.chromium)
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass UploadCL(Step):
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MESSAGE = "Create and upload CL."
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def RunStep(self):
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # Patch DEPS file.
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if self.Command(
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        "roll-dep", "v8 %s" % self["trunk_revision"],
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        cwd=self._options.chromium) is None:
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      self.Die("Failed to create deps for %s" % self["trunk_revision"])
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    commit_title = "Update V8 to %s." % self["push_title"].lower()
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    sheriff = ""
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if self["sheriff"]:
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      sheriff = ("\n\nPlease reply to the V8 sheriff %s in case of problems."
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 % self["sheriff"])
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.GitCommit("%s%s\n\nTBR=%s" %
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                       (commit_title, sheriff, self._options.reviewer),
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                   author=self._options.author,
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                   cwd=self._options.chromium)
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if not self._options.dry_run:
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      self.GitUpload(author=self._options.author,
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     force=True,
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     cq=self._options.use_commit_queue,
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     cwd=self._options.chromium)
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      print "CL uploaded."
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    else:
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      self.GitCheckout("master", cwd=self._options.chromium)
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      self.GitDeleteBranch("v8-roll-%s" % self["trunk_revision"],
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           cwd=self._options.chromium)
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      print "Dry run - don't upload."
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# TODO(machenbach): Make this obsolete. We are only in the chromium chechout
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# for the initial .git check.
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SwitchV8(Step):
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MESSAGE = "Returning to V8 checkout."
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def RunStep(self):
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    os.chdir(self["v8_path"])
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CleanUp(Step):
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MESSAGE = "Done!"
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def RunStep(self):
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    print("Congratulations, you have successfully rolled the push r%s it into "
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          "Chromium. Please don't forget to update the v8rel spreadsheet."
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          % self["trunk_revision"])
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # Clean up all temporary files.
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Command("rm", "-f %s*" % self._config["PERSISTFILE_BASENAME"])
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ChromiumRoll(ScriptsBase):
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def _PrepareOptions(self, parser):
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    parser.add_argument("-c", "--chromium", required=True,
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        help=("The path to your Chromium src/ "
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              "directory to automate the V8 roll."))
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    parser.add_argument("-l", "--last-push",
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        help="The git commit ID of the last push to trunk.")
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    parser.add_argument("--use-commit-queue",
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        help="Check the CQ bit on upload.",
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        default=False, action="store_true")
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def _ProcessOptions(self, options):  # pragma: no cover
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if not options.author or not options.reviewer:
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      print "A reviewer (-r) and an author (-a) are required."
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return False
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    options.requires_editor = False
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    options.force = True
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    options.manual = False
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return True
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def _Config(self):
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return {
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      "PERSISTFILE_BASENAME": "/tmp/v8-chromium-roll-tempfile",
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def _Steps(self):
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return [
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Preparation,
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DetectLastPush,
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DetermineV8Sheriff,
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SwitchChromium,
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      UpdateChromiumCheckout,
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      UploadCL,
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SwitchV8,
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CleanUp,
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ]
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochif __name__ == "__main__":  # pragma: no cover
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  sys.exit(ChromiumRoll().Run())
157