Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(178)

Side by Side Diff: tools/push-to-trunk/common_includes.py

Issue 196883003: Suppress error handling for test coverage in push and merge scripts. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « tools/push-to-trunk/auto_roll.py ('k') | tools/push-to-trunk/git_recipes.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 try: 185 try:
186 if pipe: 186 if pipe:
187 return subprocess.check_output(cmd_line, shell=True) 187 return subprocess.check_output(cmd_line, shell=True)
188 else: 188 else:
189 return subprocess.check_call(cmd_line, shell=True) 189 return subprocess.check_call(cmd_line, shell=True)
190 except subprocess.CalledProcessError: 190 except subprocess.CalledProcessError:
191 return None 191 return None
192 192
193 193
194 # Wrapper for side effects. 194 # Wrapper for side effects.
195 class SideEffectHandler(object): 195 class SideEffectHandler(object): # pragma: no cover
196 def Call(self, fun, *args, **kwargs): 196 def Call(self, fun, *args, **kwargs):
197 return fun(*args, **kwargs) 197 return fun(*args, **kwargs)
198 198
199 def Command(self, cmd, args="", prefix="", pipe=True): 199 def Command(self, cmd, args="", prefix="", pipe=True):
200 return Command(cmd, args, prefix, pipe) 200 return Command(cmd, args, prefix, pipe)
201 201
202 def ReadLine(self): 202 def ReadLine(self):
203 return sys.stdin.readline().strip() 203 return sys.stdin.readline().strip()
204 204
205 def ReadURL(self, url, params=None): 205 def ReadURL(self, url, params=None):
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 # Skip step if requirement is not met. 263 # Skip step if requirement is not met.
264 if self._requires and not self._state.get(self._requires): 264 if self._requires and not self._state.get(self._requires):
265 return 265 return
266 266
267 print ">>> Step %d: %s" % (self._number, self._text) 267 print ">>> Step %d: %s" % (self._number, self._text)
268 self.RunStep() 268 self.RunStep()
269 269
270 # Persist state. 270 # Persist state.
271 TextToFile(json.dumps(self._state), state_file) 271 TextToFile(json.dumps(self._state), state_file)
272 272
273 def RunStep(self): 273 def RunStep(self): # pragma: no cover
274 raise NotImplementedError 274 raise NotImplementedError
275 275
276 def Retry(self, cb, retry_on=None, wait_plan=None): 276 def Retry(self, cb, retry_on=None, wait_plan=None):
277 """ Retry a function. 277 """ Retry a function.
278 Params: 278 Params:
279 cb: The function to retry. 279 cb: The function to retry.
280 retry_on: A callback that takes the result of the function and returns 280 retry_on: A callback that takes the result of the function and returns
281 True if the function should be retried. A function throwing an 281 True if the function should be retried. A function throwing an
282 exception is always retried. 282 exception is always retried.
283 wait_plan: A list of waiting delays between retries in seconds. The 283 wait_plan: A list of waiting delays between retries in seconds. The
284 maximum number of retries is len(wait_plan). 284 maximum number of retries is len(wait_plan).
285 """ 285 """
286 retry_on = retry_on or (lambda x: False) 286 retry_on = retry_on or (lambda x: False)
287 wait_plan = list(wait_plan or []) 287 wait_plan = list(wait_plan or [])
288 wait_plan.reverse() 288 wait_plan.reverse()
289 while True: 289 while True:
290 got_exception = False 290 got_exception = False
291 try: 291 try:
292 result = cb() 292 result = cb()
293 except NoRetryException, e: 293 except NoRetryException, e:
294 raise e 294 raise e
295 except Exception: 295 except Exception:
296 got_exception = True 296 got_exception = True
297 if got_exception or retry_on(result): 297 if got_exception or retry_on(result):
298 if not wait_plan: 298 if not wait_plan: # pragma: no cover
299 raise Exception("Retried too often. Giving up.") 299 raise Exception("Retried too often. Giving up.")
300 wait_time = wait_plan.pop() 300 wait_time = wait_plan.pop()
301 print "Waiting for %f seconds." % wait_time 301 print "Waiting for %f seconds." % wait_time
302 self._side_effect_handler.Sleep(wait_time) 302 self._side_effect_handler.Sleep(wait_time)
303 print "Retrying..." 303 print "Retrying..."
304 else: 304 else:
305 return result 305 return result
306 306
307 def ReadLine(self, default=None): 307 def ReadLine(self, default=None):
308 # Don't prompt in forced mode. 308 # Don't prompt in forced mode.
(...skipping 27 matching lines...) Expand all
336 def GetDate(self): 336 def GetDate(self):
337 return self._side_effect_handler.GetDate() 337 return self._side_effect_handler.GetDate()
338 338
339 def Die(self, msg=""): 339 def Die(self, msg=""):
340 if msg != "": 340 if msg != "":
341 print "Error: %s" % msg 341 print "Error: %s" % msg
342 print "Exiting" 342 print "Exiting"
343 raise Exception(msg) 343 raise Exception(msg)
344 344
345 def DieNoManualMode(self, msg=""): 345 def DieNoManualMode(self, msg=""):
346 if not self._options.manual: 346 if not self._options.manual: # pragma: no cover
347 msg = msg or "Only available in manual mode." 347 msg = msg or "Only available in manual mode."
348 self.Die(msg) 348 self.Die(msg)
349 349
350 def Confirm(self, msg): 350 def Confirm(self, msg):
351 print "%s [Y/n] " % msg, 351 print "%s [Y/n] " % msg,
352 answer = self.ReadLine(default="Y") 352 answer = self.ReadLine(default="Y")
353 return answer == "" or answer == "Y" or answer == "y" 353 return answer == "" or answer == "Y" or answer == "y"
354 354
355 def DeleteBranch(self, name): 355 def DeleteBranch(self, name):
356 for line in self.GitBranch().splitlines(): 356 for line in self.GitBranch().splitlines():
357 if re.match(r".*\s+%s$" % name, line): 357 if re.match(r".*\s+%s$" % name, line):
358 msg = "Branch %s exists, do you want to delete it?" % name 358 msg = "Branch %s exists, do you want to delete it?" % name
359 if self.Confirm(msg): 359 if self.Confirm(msg):
360 self.GitDeleteBranch(name) 360 self.GitDeleteBranch(name)
361 print "Branch %s deleted." % name 361 print "Branch %s deleted." % name
362 else: 362 else:
363 msg = "Can't continue. Please delete branch %s and try again." % name 363 msg = "Can't continue. Please delete branch %s and try again." % name
364 self.Die(msg) 364 self.Die(msg)
365 365
366 def InitialEnvironmentChecks(self): 366 def InitialEnvironmentChecks(self):
367 # Cancel if this is not a git checkout. 367 # Cancel if this is not a git checkout.
368 if not os.path.exists(self._config[DOT_GIT_LOCATION]): 368 if not os.path.exists(self._config[DOT_GIT_LOCATION]): # pragma: no cover
369 self.Die("This is not a git checkout, this script won't work for you.") 369 self.Die("This is not a git checkout, this script won't work for you.")
370 370
371 # Cancel if EDITOR is unset or not executable. 371 # Cancel if EDITOR is unset or not executable.
372 if (self._options.requires_editor and (not os.environ.get("EDITOR") or 372 if (self._options.requires_editor and (not os.environ.get("EDITOR") or
373 Command("which", os.environ["EDITOR"]) is None)): 373 Command("which", os.environ["EDITOR"]) is None)): # pragma: no cover
374 self.Die("Please set your EDITOR environment variable, you'll need it.") 374 self.Die("Please set your EDITOR environment variable, you'll need it.")
375 375
376 def CommonPrepare(self): 376 def CommonPrepare(self):
377 # Check for a clean workdir. 377 # Check for a clean workdir.
378 if not self.GitIsWorkdirClean(): 378 if not self.GitIsWorkdirClean(): # pragma: no cover
379 self.Die("Workspace is not clean. Please commit or undo your changes.") 379 self.Die("Workspace is not clean. Please commit or undo your changes.")
380 380
381 # Persist current branch. 381 # Persist current branch.
382 self["current_branch"] = self.GitCurrentBranch() 382 self["current_branch"] = self.GitCurrentBranch()
383 383
384 # Fetch unfetched revisions. 384 # Fetch unfetched revisions.
385 self.GitSVNFetch() 385 self.GitSVNFetch()
386 386
387 def PrepareBranch(self): 387 def PrepareBranch(self):
388 # Get ahold of a safe temporary branch and check it out. 388 # Get ahold of a safe temporary branch and check it out.
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
500 500
501 def _Description(self): 501 def _Description(self):
502 return None 502 return None
503 503
504 def _PrepareOptions(self, parser): 504 def _PrepareOptions(self, parser):
505 pass 505 pass
506 506
507 def _ProcessOptions(self, options): 507 def _ProcessOptions(self, options):
508 return True 508 return True
509 509
510 def _Steps(self): 510 def _Steps(self): # pragma: no cover
511 raise Exception("Not implemented.") 511 raise Exception("Not implemented.")
512 512
513 def MakeOptions(self, args=None): 513 def MakeOptions(self, args=None):
514 parser = argparse.ArgumentParser(description=self._Description()) 514 parser = argparse.ArgumentParser(description=self._Description())
515 parser.add_argument("-a", "--author", default="", 515 parser.add_argument("-a", "--author", default="",
516 help="The author email used for rietveld.") 516 help="The author email used for rietveld.")
517 parser.add_argument("-r", "--reviewer", default="", 517 parser.add_argument("-r", "--reviewer", default="",
518 help="The account name to be used for reviews.") 518 help="The account name to be used for reviews.")
519 parser.add_argument("-s", "--step", 519 parser.add_argument("-s", "--step",
520 help="Specify the step where to start work. Default: 0.", 520 help="Specify the step where to start work. Default: 0.",
521 default=0, type=int) 521 default=0, type=int)
522 522
523 self._PrepareOptions(parser) 523 self._PrepareOptions(parser)
524 524
525 if args is None: 525 if args is None: # pragma: no cover
526 options = parser.parse_args() 526 options = parser.parse_args()
527 else: 527 else:
528 options = parser.parse_args(args) 528 options = parser.parse_args(args)
529 529
530 # Process common options. 530 # Process common options.
531 if options.step < 0: 531 if options.step < 0: # pragma: no cover
532 print "Bad step number %d" % options.step 532 print "Bad step number %d" % options.step
533 parser.print_help() 533 parser.print_help()
534 return None 534 return None
535 535
536 # Defaults for options, common to all scripts. 536 # Defaults for options, common to all scripts.
537 options.manual = getattr(options, "manual", True) 537 options.manual = getattr(options, "manual", True)
538 options.force = getattr(options, "force", False) 538 options.force = getattr(options, "force", False)
539 539
540 # Derived options. 540 # Derived options.
541 options.requires_editor = not options.force 541 options.requires_editor = not options.force
(...skipping 19 matching lines...) Expand all
561 steps = [] 561 steps = []
562 for (number, step_class) in enumerate(step_classes): 562 for (number, step_class) in enumerate(step_classes):
563 steps.append(MakeStep(step_class, number, self._state, self._config, 563 steps.append(MakeStep(step_class, number, self._state, self._config,
564 options, self._side_effect_handler)) 564 options, self._side_effect_handler))
565 for step in steps[options.step:]: 565 for step in steps[options.step:]:
566 step.Run() 566 step.Run()
567 return 0 567 return 0
568 568
569 def Run(self, args=None): 569 def Run(self, args=None):
570 return self.RunSteps(self._Steps(), args) 570 return self.RunSteps(self._Steps(), args)
OLDNEW
« no previous file with comments | « tools/push-to-trunk/auto_roll.py ('k') | tools/push-to-trunk/git_recipes.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698