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 json 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport os 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport sys 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport urllib 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfrom common_includes import * 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport chromium_roll 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CheckActiveRoll(Step): 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MESSAGE = "Check active roll." 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch @staticmethod 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def ContainsChromiumRoll(changes): 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for change in changes: 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if change["subject"].startswith("Update V8 to"): 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return True 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return False 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def RunStep(self): 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch params = { 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "closed": 3, 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "owner": self._options.author, 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "limit": 30, 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "format": "json", 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch params = urllib.urlencode(params) 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch search_url = "https://codereview.chromium.org/search" 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = self.ReadURL(search_url, params, wait_plan=[5, 20]) 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if self.ContainsChromiumRoll(json.loads(result)["results"]): 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print "Stop due to existing Chromium roll." 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return True 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass DetectLastPush(Step): 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MESSAGE = "Detect commit ID of the last push to trunk." 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def RunStep(self): 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch push_hash = self.FindLastTrunkPush( 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch branch="origin/master", include_patches=True) 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self["last_push"] = self.GetCommitPositionNumber(push_hash) 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass DetectLastRoll(Step): 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MESSAGE = "Detect commit ID of the last Chromium roll." 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def RunStep(self): 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch # Interpret the DEPS file to retrieve the v8 revision. 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch # TODO(machenbach): This should be part or the roll-deps api of 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch # depot_tools. 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Var = lambda var: '%s' 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch exec(FileToText(os.path.join(self._options.chromium, "DEPS"))) 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch last_roll = self.GetCommitPositionNumber(vars['v8_revision']) 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch # FIXME(machenbach): When rolling from bleeding edge and from trunk there 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch # be different commit numbers here. Better use version? 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if int(last_roll) >= int(self["last_push"]): 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print("There is no newer v8 revision than the one in Chromium (%s)." 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch % last_roll) 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return True 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CheckClusterFuzz(Step): 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MESSAGE = "Check ClusterFuzz api for new problems." 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def RunStep(self): 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if not os.path.exists(self.Config("CLUSTERFUZZ_API_KEY_FILE")): 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print "Skipping ClusterFuzz check. No api key file found." 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return False 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch api_key = FileToText(self.Config("CLUSTERFUZZ_API_KEY_FILE")) 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch # Check for open, reproducible issues that have no associated bug. 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = self._side_effect_handler.ReadClusterFuzzAPI( 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch api_key, job_type="linux_asan_d8_dbg", reproducible="True", 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch open="True", bug_information="", 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch revision_greater_or_equal=str(self["last_push"])) 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if result: 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print "Stop due to pending ClusterFuzz issues." 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return True 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass RollChromium(Step): 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MESSAGE = "Roll V8 into Chromium." 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def RunStep(self): 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if self._options.roll: 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch args = [ 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "--author", self._options.author, 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "--reviewer", self._options.reviewer, 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "--chromium", self._options.chromium, 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "--use-commit-queue", 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ] 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if self._options.sheriff: 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch args.extend([ 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "--sheriff", "--googlers-mapping", self._options.googlers_mapping]) 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if self._options.dry_run: 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch args.extend(["--dry-run"]) 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self._side_effect_handler.Call(chromium_roll.ChromiumRoll().Run, args) 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AutoRoll(ScriptsBase): 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def _PrepareOptions(self, parser): 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch parser.add_argument("-c", "--chromium", required=True, 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch help=("The path to your Chromium src/ " 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "directory to automate the V8 roll.")) 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch parser.add_argument("--roll", help="Call Chromium roll script.", 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default=False, action="store_true") 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def _ProcessOptions(self, options): # pragma: no cover 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if not options.reviewer: 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print "A reviewer (-r) is required." 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return False 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if not options.author: 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print "An author (-a) is required." 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return False 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return True 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def _Config(self): 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return { 124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "PERSISTFILE_BASENAME": "/tmp/v8-auto-roll-tempfile", 125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "CLUSTERFUZZ_API_KEY_FILE": ".cf_api_key", 126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def _Steps(self): 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return [ 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckActiveRoll, 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DetectLastPush, 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DetectLastRoll, 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckClusterFuzz, 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RollChromium, 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ] 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochif __name__ == "__main__": # pragma: no cover 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch sys.exit(AutoRoll().Run()) 140