OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2013 the V8 project authors. All rights reserved. | 2 # Copyright 2013 the V8 project authors. All rights reserved. |
3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
4 # modification, are permitted provided that the following conditions are | 4 # modification, are permitted provided that the following conditions are |
5 # met: | 5 # met: |
6 # | 6 # |
7 # * Redistributions of source code must retain the above copyright | 7 # * Redistributions of source code must retain the above copyright |
8 # notice, this list of conditions and the following disclaimer. | 8 # notice, this list of conditions and the following disclaimer. |
9 # * Redistributions in binary form must reproduce the above | 9 # * Redistributions in binary form must reproduce the above |
10 # copyright notice, this list of conditions and the following | 10 # copyright notice, this list of conditions and the following |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
75 if re.search(r"nopush|no push", self["tree_message"], flags=re.I): | 75 if re.search(r"nopush|no push", self["tree_message"], flags=re.I): |
76 self.Die("Push to trunk disabled by tree state: %s" | 76 self.Die("Push to trunk disabled by tree state: %s" |
77 % self["tree_message"]) | 77 % self["tree_message"]) |
78 | 78 |
79 | 79 |
80 class FetchLatestRevision(Step): | 80 class FetchLatestRevision(Step): |
81 MESSAGE = "Fetching latest V8 revision." | 81 MESSAGE = "Fetching latest V8 revision." |
82 | 82 |
83 def RunStep(self): | 83 def RunStep(self): |
84 match = re.match(r"^r(\d+) ", self.GitSVNLog()) | 84 match = re.match(r"^r(\d+) ", self.GitSVNLog()) |
85 if not match: | 85 if not match: # pragma: no cover |
86 self.Die("Could not extract current svn revision from log.") | 86 self.Die("Could not extract current svn revision from log.") |
87 self["latest"] = match.group(1) | 87 self["latest"] = match.group(1) |
88 | 88 |
89 | 89 |
90 class CheckLastPush(Step): | 90 class CheckLastPush(Step): |
91 MESSAGE = "Checking last V8 push to trunk." | 91 MESSAGE = "Checking last V8 push to trunk." |
92 | 92 |
93 def RunStep(self): | 93 def RunStep(self): |
94 last_push_hash = self.FindLastTrunkPush() | 94 last_push_hash = self.FindLastTrunkPush() |
95 last_push = int(self.GitSVNFindSVNRev(last_push_hash)) | 95 last_push = int(self.GitSVNFindSVNRev(last_push_hash)) |
96 | 96 |
97 # TODO(machenbach): This metric counts all revisions. It could be | 97 # TODO(machenbach): This metric counts all revisions. It could be |
98 # improved by counting only the revisions on bleeding_edge. | 98 # improved by counting only the revisions on bleeding_edge. |
99 if int(self["latest"]) - last_push < 10: | 99 if int(self["latest"]) - last_push < 10: # pragma: no cover |
100 # This makes sure the script doesn't push twice in a row when the cron | 100 # This makes sure the script doesn't push twice in a row when the cron |
101 # job retries several times. | 101 # job retries several times. |
102 self.Die("Last push too recently: %d" % last_push) | 102 self.Die("Last push too recently: %d" % last_push) |
103 | 103 |
104 | 104 |
105 class FetchLKGR(Step): | 105 class FetchLKGR(Step): |
106 MESSAGE = "Fetching V8 LKGR." | 106 MESSAGE = "Fetching V8 LKGR." |
107 | 107 |
108 def RunStep(self): | 108 def RunStep(self): |
109 lkgr_url = "https://v8-status.appspot.com/lkgr" | 109 lkgr_url = "https://v8-status.appspot.com/lkgr" |
(...skipping 21 matching lines...) Expand all Loading... |
131 def RunStep(self): | 131 def RunStep(self): |
132 latest = int(self["latest"]) | 132 latest = int(self["latest"]) |
133 lkgr = int(self["lkgr"]) | 133 lkgr = int(self["lkgr"]) |
134 if latest == lkgr: | 134 if latest == lkgr: |
135 print "ToT (r%d) is clean. Pushing to trunk." % latest | 135 print "ToT (r%d) is clean. Pushing to trunk." % latest |
136 self.PushTreeStatus("Tree is closed (preparing to push)") | 136 self.PushTreeStatus("Tree is closed (preparing to push)") |
137 | 137 |
138 # TODO(machenbach): Update the script before calling it. | 138 # TODO(machenbach): Update the script before calling it. |
139 try: | 139 try: |
140 if self._options.push: | 140 if self._options.push: |
| 141 P = push_to_trunk.PushToTrunk |
141 self._side_effect_handler.Call( | 142 self._side_effect_handler.Call( |
142 PushToTrunk(push_to_trunk.CONFIG, self._side_effect_handler).Run, | 143 P(push_to_trunk.CONFIG, self._side_effect_handler).Run, |
143 ["-a", self._options.author, | 144 ["-a", self._options.author, |
144 "-c", self._options.chromium, | 145 "-c", self._options.chromium, |
145 "-r", self._options.reviewer, | 146 "-r", self._options.reviewer, |
146 "-f"]) | 147 "-f"]) |
147 finally: | 148 finally: |
148 self.PushTreeStatus(self["tree_message"]) | 149 self.PushTreeStatus(self["tree_message"]) |
149 else: | 150 else: |
150 print("ToT (r%d) is ahead of the LKGR (r%d). Skipping push to trunk." | 151 print("ToT (r%d) is ahead of the LKGR (r%d). Skipping push to trunk." |
151 % (latest, lkgr)) | 152 % (latest, lkgr)) |
152 | 153 |
153 | 154 |
154 class AutoRoll(ScriptsBase): | 155 class AutoRoll(ScriptsBase): |
155 def _PrepareOptions(self, parser): | 156 def _PrepareOptions(self, parser): |
156 parser.add_argument("-c", "--chromium", required=True, | 157 parser.add_argument("-c", "--chromium", required=True, |
157 help=("The path to your Chromium src/ " | 158 help=("The path to your Chromium src/ " |
158 "directory to automate the V8 roll.")) | 159 "directory to automate the V8 roll.")) |
159 parser.add_argument("-p", "--push", | 160 parser.add_argument("-p", "--push", |
160 help="Push to trunk. Dry run if unspecified.", | 161 help="Push to trunk. Dry run if unspecified.", |
161 default=False, action="store_true") | 162 default=False, action="store_true") |
162 parser.add_argument("--status-password", | 163 parser.add_argument("--status-password", |
163 help="A file with the password to the status app.") | 164 help="A file with the password to the status app.") |
164 | 165 |
165 def _ProcessOptions(self, options): | 166 def _ProcessOptions(self, options): |
166 if not options.author or not options.reviewer: | 167 if not options.author or not options.reviewer: # pragma: no cover |
167 print "You need to specify author and reviewer." | 168 print "You need to specify author and reviewer." |
168 return False | 169 return False |
169 options.requires_editor = False | 170 options.requires_editor = False |
170 return True | 171 return True |
171 | 172 |
172 def _Steps(self): | 173 def _Steps(self): |
173 return [ | 174 return [ |
174 Preparation, | 175 Preparation, |
175 CheckAutoRollSettings, | 176 CheckAutoRollSettings, |
176 CheckTreeStatus, | 177 CheckTreeStatus, |
177 FetchLatestRevision, | 178 FetchLatestRevision, |
178 CheckLastPush, | 179 CheckLastPush, |
179 FetchLKGR, | 180 FetchLKGR, |
180 PushToTrunk, | 181 PushToTrunk, |
181 ] | 182 ] |
182 | 183 |
183 | 184 |
184 if __name__ == "__main__": | 185 if __name__ == "__main__": # pragma: no cover |
185 sys.exit(AutoRoll(CONFIG).Run()) | 186 sys.exit(AutoRoll(CONFIG).Run()) |
OLD | NEW |