Commit 5aff14ad authored by machenbach's avatar machenbach Committed by Commit bot

[release] Merge auto-roll and wrapped chromium-roll scripts.

This replaces chromium_roll and the wrapper auto_roll with
just auto_roll. The arguments for the revision to roll and
the last rolled revision are optional and will be
auto-detected (this feature is from the wrapper).

Checking the cq box is default now (as in the wrapper).

BUG=chromium:559141
LOG=n
NOTRY=true

Review URL: https://codereview.chromium.org/1468973002

Cr-Commit-Position: refs/heads/master@{#32193}
parent 84010cb2
......@@ -4,36 +4,65 @@
# found in the LICENSE file.
import argparse
import json
import os
import sys
import urllib
from common_includes import *
import chromium_roll
ROLL_SUMMARY = ("Summary of changes available at:\n"
"https://chromium.googlesource.com/v8/v8/+log/%s..%s")
ISSUE_MSG = (
"""Please follow these instructions for assigning/CC'ing issues:
https://code.google.com/p/v8-wiki/wiki/TriagingIssues
Please close rolling in case of a roll revert:
https://v8-roll.appspot.com/
This only works with a Google account.""")
class Preparation(Step):
MESSAGE = "Preparation."
def RunStep(self):
# Update v8 remote tracking branches.
self.GitFetchOrigin()
self.Git("fetch origin +refs/tags/*:refs/tags/*")
class DetectLastRoll(Step):
MESSAGE = "Detect commit ID of the last Chromium roll."
def RunStep(self):
self["last_roll"] = self._options.last_roll
if not self["last_roll"]:
# Interpret the DEPS file to retrieve the v8 revision.
# TODO(machenbach): This should be part or the roll-deps api of
# depot_tools.
Var = lambda var: '%s'
exec(FileToText(os.path.join(self._options.chromium, "DEPS")))
# The revision rolled last.
self["last_roll"] = vars['v8_revision']
self["last_version"] = self.GetVersionTag(self["last_roll"])
assert self["last_version"], "The last rolled v8 revision is not tagged."
class DetectRevisionToRoll(Step):
MESSAGE = "Detect commit ID of the V8 revision to roll."
def RunStep(self):
self["roll"] = self._options.revision
if self["roll"]:
# If the revision was passed on the cmd line, continue script execution
# in the next step.
return False
# The revision that should be rolled. Check for the latest of the most
# recent releases based on commit timestamp.
revisions = self.GetRecentReleases(
max_age=self._options.max_age * DAY_IN_SECONDS)
assert revisions, "Didn't find any recent release."
# Interpret the DEPS file to retrieve the v8 revision.
# TODO(machenbach): This should be part or the roll-deps api of
# depot_tools.
Var = lambda var: '%s'
exec(FileToText(os.path.join(self._options.chromium, "DEPS")))
# The revision rolled last.
self["last_roll"] = vars['v8_revision']
last_version = self.GetVersionTag(self["last_roll"])
assert last_version, "The last rolled v8 revision is not tagged."
# There must be some progress between the last roll and the new candidate
# revision (i.e. we don't go backwards). The revisions are ordered newest
# to oldest. It is possible that the newest timestamp has no progress
......@@ -43,7 +72,7 @@ class DetectLastRoll(Step):
version = self.GetVersionTag(revision)
assert version, "Internal error. All recent releases should have a tag"
if SortingKey(last_version) < SortingKey(version):
if SortingKey(self["last_version"]) < SortingKey(version):
self["roll"] = revision
break
else:
......@@ -52,26 +81,92 @@ class DetectLastRoll(Step):
return True
class RollChromium(Step):
MESSAGE = "Roll V8 into Chromium."
class PrepareRollCandidate(Step):
MESSAGE = "Robustness checks of the roll candidate."
def RunStep(self):
self["roll_title"] = self.GitLog(n=1, format="%s",
git_hash=self["roll"])
# Make sure the last roll and the roll candidate are releases.
version = self.GetVersionTag(self["roll"])
assert version, "The revision to roll is not tagged."
version = self.GetVersionTag(self["last_roll"])
assert version, "The revision used as last roll is not tagged."
class SwitchChromium(Step):
MESSAGE = "Switch to Chromium checkout."
def RunStep(self):
cwd = self._options.chromium
self.InitialEnvironmentChecks(cwd)
# Check for a clean workdir.
if not self.GitIsWorkdirClean(cwd=cwd): # pragma: no cover
self.Die("Workspace is not clean. Please commit or undo your changes.")
# Assert that the DEPS file is there.
if not os.path.exists(os.path.join(cwd, "DEPS")): # pragma: no cover
self.Die("DEPS file not present.")
class UpdateChromiumCheckout(Step):
MESSAGE = "Update the checkout and create a new branch."
def RunStep(self):
if self._options.roll:
args = [
"--author", self._options.author,
"--reviewer", self._options.reviewer,
"--chromium", self._options.chromium,
"--last-roll", self["last_roll"],
"--use-commit-queue",
self["roll"],
]
if self._options.dry_run:
args.append("--dry-run")
if self._options.work_dir:
args.extend(["--work-dir", self._options.work_dir])
if self._options.chromium_roll_json_output:
args.extend(["--json-output", self._options.chromium_roll_json_output])
self._side_effect_handler.Call(chromium_roll.ChromiumRoll().Run, args)
cwd = self._options.chromium
self.GitCheckout("master", cwd=cwd)
self.DeleteBranch("work-branch", cwd=cwd)
self.Command("gclient", "sync --nohooks", cwd=cwd)
self.GitPull(cwd=cwd)
# Update v8 remotes.
self.GitFetchOrigin()
self.GitCreateBranch("work-branch", cwd=cwd)
class UploadCL(Step):
MESSAGE = "Create and upload CL."
def RunStep(self):
cwd = self._options.chromium
# Patch DEPS file.
if self.Command("roll-dep-svn", "v8 %s" %
self["roll"], cwd=cwd) is None:
self.Die("Failed to create deps for %s" % self["roll"])
message = []
message.append("Update V8 to %s." % self["roll_title"].lower())
message.append(
ROLL_SUMMARY % (self["last_roll"][:8], self["roll"][:8]))
message.append(ISSUE_MSG)
message.append("TBR=%s" % self._options.reviewer)
self.GitCommit("\n\n".join(message), author=self._options.author, cwd=cwd)
if not self._options.dry_run:
self.GitUpload(author=self._options.author,
force=True,
cq=self._options.use_commit_queue,
cwd=cwd)
print "CL uploaded."
else:
print "Dry run - don't upload."
self.GitCheckout("master", cwd=cwd)
self.GitDeleteBranch("work-branch", cwd=cwd)
class CleanUp(Step):
MESSAGE = "Done!"
def RunStep(self):
print("Congratulations, you have successfully rolled %s into "
"Chromium."
% self["roll"])
# Clean up all temporary files.
Command("rm", "-f %s*" % self._config["PERSISTFILE_BASENAME"])
class AutoRoll(ScriptsBase):
......@@ -79,31 +174,45 @@ class AutoRoll(ScriptsBase):
parser.add_argument("-c", "--chromium", required=True,
help=("The path to your Chromium src/ "
"directory to automate the V8 roll."))
parser.add_argument("--chromium-roll-json-output",
help="File to write wrapped results summary to.")
parser.add_argument("--last-roll",
help="The git commit ID of the last rolled version. "
"Auto-detected if not specified.")
parser.add_argument("--max-age", default=3, type=int,
help="Maximum age in days of the latest release.")
parser.add_argument("--roll", help="Call Chromium roll script.",
default=False, action="store_true")
parser.add_argument("--revision",
help="Revision to roll. Auto-detected if not "
"specified."),
parser.add_argument("--roll", help="Deprecated.",
default=True, action="store_true")
parser.add_argument("--use-commit-queue",
help="Check the CQ bit on upload.",
default=True, action="store_true")
def _ProcessOptions(self, options): # pragma: no cover
if not options.reviewer:
print "A reviewer (-r) is required."
return False
if not options.author:
print "An author (-a) is required."
if not options.author or not options.reviewer:
print "A reviewer (-r) and an author (-a) are required."
return False
options.requires_editor = False
options.force = True
options.manual = False
return True
def _Config(self):
return {
"PERSISTFILE_BASENAME": "/tmp/v8-auto-roll-tempfile",
"PERSISTFILE_BASENAME": "/tmp/v8-chromium-roll-tempfile",
}
def _Steps(self):
return [
Preparation,
DetectLastRoll,
RollChromium,
DetectRevisionToRoll,
PrepareRollCandidate,
SwitchChromium,
UpdateChromiumCheckout,
UploadCL,
CleanUp,
]
......
#!/usr/bin/env python
# Copyright 2014 the V8 project authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import argparse
import os
import sys
from common_includes import *
ROLL_SUMMARY = ("Summary of changes available at:\n"
"https://chromium.googlesource.com/v8/v8/+log/%s..%s")
ISSUE_MSG = (
"""Please follow these instructions for assigning/CC'ing issues:
https://code.google.com/p/v8-wiki/wiki/TriagingIssues
Please close rolling in case of a roll revert:
https://v8-roll.appspot.com/
This only works with a Google account.""")
class Preparation(Step):
MESSAGE = "Preparation."
def RunStep(self):
# Update v8 remote tracking branches.
self.GitFetchOrigin()
self.Git("fetch origin +refs/tags/*:refs/tags/*")
class PrepareRollCandidate(Step):
MESSAGE = "Robustness checks of the roll candidate."
def RunStep(self):
self["roll_title"] = self.GitLog(n=1, format="%s",
git_hash=self._options.roll)
# Make sure the last roll and the roll candidate are releases.
version = self.GetVersionTag(self._options.roll)
assert version, "The revision to roll is not tagged."
version = self.GetVersionTag(self._options.last_roll)
assert version, "The revision used as last roll is not tagged."
class SwitchChromium(Step):
MESSAGE = "Switch to Chromium checkout."
def RunStep(self):
cwd = self._options.chromium
self.InitialEnvironmentChecks(cwd)
# Check for a clean workdir.
if not self.GitIsWorkdirClean(cwd=cwd): # pragma: no cover
self.Die("Workspace is not clean. Please commit or undo your changes.")
# Assert that the DEPS file is there.
if not os.path.exists(os.path.join(cwd, "DEPS")): # pragma: no cover
self.Die("DEPS file not present.")
class UpdateChromiumCheckout(Step):
MESSAGE = "Update the checkout and create a new branch."
def RunStep(self):
cwd = self._options.chromium
self.GitCheckout("master", cwd=cwd)
self.DeleteBranch("work-branch", cwd=cwd)
self.Command("gclient", "sync --nohooks", cwd=cwd)
self.GitPull(cwd=cwd)
# Update v8 remotes.
self.GitFetchOrigin()
self.GitCreateBranch("work-branch", cwd=cwd)
class UploadCL(Step):
MESSAGE = "Create and upload CL."
def RunStep(self):
cwd = self._options.chromium
# Patch DEPS file.
if self.Command("roll-dep-svn", "v8 %s" %
self._options.roll, cwd=cwd) is None:
self.Die("Failed to create deps for %s" % self._options.roll)
message = []
message.append("Update V8 to %s." % self["roll_title"].lower())
message.append(
ROLL_SUMMARY % (self._options.last_roll[:8], self._options.roll[:8]))
message.append(ISSUE_MSG)
message.append("TBR=%s" % self._options.reviewer)
self.GitCommit("\n\n".join(message), author=self._options.author, cwd=cwd)
if not self._options.dry_run:
self.GitUpload(author=self._options.author,
force=True,
cq=self._options.use_commit_queue,
cwd=cwd)
print "CL uploaded."
else:
print "Dry run - don't upload."
self.GitCheckout("master", cwd=cwd)
self.GitDeleteBranch("work-branch", cwd=cwd)
class CleanUp(Step):
MESSAGE = "Done!"
def RunStep(self):
print("Congratulations, you have successfully rolled %s into "
"Chromium."
% self._options.roll)
# Clean up all temporary files.
Command("rm", "-f %s*" % self._config["PERSISTFILE_BASENAME"])
class ChromiumRoll(ScriptsBase):
def _PrepareOptions(self, parser):
parser.add_argument("-c", "--chromium", required=True,
help=("The path to your Chromium src/ "
"directory to automate the V8 roll."))
parser.add_argument("--last-roll", required=True,
help="The git commit ID of the last rolled version.")
parser.add_argument("roll", nargs=1, help="Revision to roll."),
parser.add_argument("--use-commit-queue",
help="Check the CQ bit on upload.",
default=False, action="store_true")
def _ProcessOptions(self, options): # pragma: no cover
if not options.author or not options.reviewer:
print "A reviewer (-r) and an author (-a) are required."
return False
options.requires_editor = False
options.force = True
options.manual = False
options.roll = options.roll[0]
return True
def _Config(self):
return {
"PERSISTFILE_BASENAME": "/tmp/v8-chromium-roll-tempfile",
}
def _Steps(self):
return [
Preparation,
PrepareRollCandidate,
SwitchChromium,
UpdateChromiumCheckout,
UploadCL,
CleanUp,
]
if __name__ == "__main__": # pragma: no cover
sys.exit(ChromiumRoll().Run())
......@@ -1003,7 +1003,7 @@ git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@123456 123
"""
ROLL_COMMIT_MSG = """Update V8 to version 3.22.4 (based on abc).
ROLL_COMMIT_MSG = """Update V8 to version 3.22.4.
Summary of changes available at:
https://chromium.googlesource.com/v8/v8/+log/last_rol..roll_hsh
......@@ -1017,16 +1017,47 @@ This only works with a Google account.
TBR=reviewer@chromium.org"""
# Snippet from the original DEPS file.
FAKE_DEPS = """
vars = {
"v8_revision": "last_roll_hsh",
}
deps = {
"src/v8":
(Var("googlecode_url") % "v8") + "/" + Var("v8_branch") + "@" +
Var("v8_revision"),
}
"""
def testChromiumRollUpToDate(self):
TEST_CONFIG["CHROMIUM"] = self.MakeEmptyTempDirectory()
TextToFile(self.FAKE_DEPS, os.path.join(TEST_CONFIG["CHROMIUM"], "DEPS"))
self.Expect([
Cmd("git fetch origin", ""),
Cmd("git fetch origin +refs/tags/*:refs/tags/*", ""),
Cmd("git describe --tags last_roll_hsh", "3.22.4"),
Cmd("git fetch origin +refs/tags/*:refs/tags/*", ""),
Cmd("git rev-list --max-age=740800 --tags",
"bad_tag\nroll_hsh\nhash_123"),
Cmd("git describe --tags bad_tag", ""),
Cmd("git describe --tags roll_hsh", "3.22.4"),
Cmd("git describe --tags hash_123", "3.22.3"),
Cmd("git describe --tags roll_hsh", "3.22.4"),
Cmd("git describe --tags hash_123", "3.22.3"),
])
result = auto_roll.AutoRoll(TEST_CONFIG, self).Run(
AUTO_PUSH_ARGS + ["-c", TEST_CONFIG["CHROMIUM"]])
self.assertEquals(0, result)
def testChromiumRoll(self):
# Setup fake directory structures.
TEST_CONFIG["CHROMIUM"] = self.MakeEmptyTempDirectory()
TextToFile(self.FAKE_DEPS, os.path.join(TEST_CONFIG["CHROMIUM"], "DEPS"))
TextToFile("", os.path.join(TEST_CONFIG["CHROMIUM"], ".git"))
chrome_dir = TEST_CONFIG["CHROMIUM"]
os.makedirs(os.path.join(chrome_dir, "v8"))
# Write fake deps file.
TextToFile("Some line\n \"v8_revision\": \"123444\",\n some line",
os.path.join(chrome_dir, "DEPS"))
def WriteDeps():
TextToFile("Some line\n \"v8_revision\": \"22624\",\n some line",
os.path.join(chrome_dir, "DEPS"))
......@@ -1034,8 +1065,15 @@ TBR=reviewer@chromium.org"""
expectations = [
Cmd("git fetch origin", ""),
Cmd("git fetch origin +refs/tags/*:refs/tags/*", ""),
Cmd("git log -1 --format=%s roll_hsh",
"Version 3.22.4 (based on abc)\n"),
Cmd("git describe --tags last_roll_hsh", "3.22.3.1"),
Cmd("git fetch origin +refs/tags/*:refs/tags/*", ""),
Cmd("git rev-list --max-age=740800 --tags",
"bad_tag\nroll_hsh\nhash_123"),
Cmd("git describe --tags bad_tag", ""),
Cmd("git describe --tags roll_hsh", "3.22.4"),
Cmd("git describe --tags hash_123", "3.22.3"),
Cmd("git describe --tags roll_hsh", "3.22.4"),
Cmd("git log -1 --format=%s roll_hsh", "Version 3.22.4\n"),
Cmd("git describe --tags roll_hsh", "3.22.4"),
Cmd("git describe --tags last_roll_hsh", "3.22.2.1"),
Cmd("git status -s -uno", "", cwd=chrome_dir),
......@@ -1050,18 +1088,16 @@ TBR=reviewer@chromium.org"""
"--author \"author@chromium.org <author@chromium.org>\"" %
self.ROLL_COMMIT_MSG),
"", cwd=chrome_dir),
Cmd("git cl upload --send-mail --email \"author@chromium.org\" -f", "",
cwd=chrome_dir),
Cmd("git cl upload --send-mail --email \"author@chromium.org\" -f "
"--use-commit-queue", "", cwd=chrome_dir),
Cmd("git checkout -f master", "", cwd=chrome_dir),
Cmd("git branch -D work-branch", "", cwd=chrome_dir),
]
self.Expect(expectations)
args = ["-a", "author@chromium.org", "-c", chrome_dir,
"-r", "reviewer@chromium.org",
"--last-roll", "last_roll_hsh",
"roll_hsh"]
ChromiumRoll(TEST_CONFIG, self).Run(args)
"-r", "reviewer@chromium.org"]
auto_roll.AutoRoll(TEST_CONFIG, self).Run(args)
deps = FileToText(os.path.join(chrome_dir, "DEPS"))
self.assertTrue(re.search("\"v8_revision\": \"22624\"", deps))
......@@ -1100,56 +1136,6 @@ TBR=reviewer@chromium.org"""
self.assertEquals("abc123", state["candidate"])
# Snippet from the original DEPS file.
FAKE_DEPS = """
vars = {
"v8_revision": "abcd123455",
}
deps = {
"src/v8":
(Var("googlecode_url") % "v8") + "/" + Var("v8_branch") + "@" +
Var("v8_revision"),
}
"""
def testAutoRollUpToDate(self):
TEST_CONFIG["CHROMIUM"] = self.MakeEmptyTempDirectory()
TextToFile(self.FAKE_DEPS, os.path.join(TEST_CONFIG["CHROMIUM"], "DEPS"))
self.Expect([
Cmd("git fetch origin +refs/tags/*:refs/tags/*", ""),
Cmd("git rev-list --max-age=740800 --tags",
"bad_tag\nhash_234\nhash_123"),
Cmd("git describe --tags bad_tag", ""),
Cmd("git describe --tags hash_234", "3.22.4"),
Cmd("git describe --tags hash_123", "3.22.3"),
Cmd("git describe --tags abcd123455", "3.22.4"),
Cmd("git describe --tags hash_234", "3.22.4"),
Cmd("git describe --tags hash_123", "3.22.3"),
])
result = auto_roll.AutoRoll(TEST_CONFIG, self).Run(
AUTO_PUSH_ARGS + ["-c", TEST_CONFIG["CHROMIUM"]])
self.assertEquals(0, result)
def testAutoRoll(self):
TEST_CONFIG["CHROMIUM"] = self.MakeEmptyTempDirectory()
TextToFile(self.FAKE_DEPS, os.path.join(TEST_CONFIG["CHROMIUM"], "DEPS"))
self.Expect([
Cmd("git fetch origin +refs/tags/*:refs/tags/*", ""),
Cmd("git rev-list --max-age=740800 --tags",
"bad_tag\nhash_234\nhash_123"),
Cmd("git describe --tags bad_tag", ""),
Cmd("git describe --tags hash_234", "3.22.4"),
Cmd("git describe --tags hash_123", "3.22.3"),
Cmd("git describe --tags abcd123455", "3.22.3.1"),
Cmd("git describe --tags hash_234", "3.22.4"),
])
result = auto_roll.AutoRoll(TEST_CONFIG, self).Run(
AUTO_PUSH_ARGS + ["-c", TEST_CONFIG["CHROMIUM"], "--roll"])
self.assertEquals(0, result)
def testMergeToBranch(self):
TEST_CONFIG["ALREADY_MERGING_SENTINEL_FILE"] = self.MakeEmptyTempFile()
TextToFile("", os.path.join(TEST_CONFIG["DEFAULT_CWD"], ".git"))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment