Bug 1918268 - updated libwebrtc patch stack
[gecko.git] / testing / web-platform / tests / tools / docker / retry.py
blob8ecf5874fed877235941086736772a3b39083c6b
1 #!/usr/bin/env python3
2 import argparse
3 import subprocess
4 import time
5 import sys
8 def get_args() -> argparse.ArgumentParser:
9 parser = argparse.ArgumentParser()
10 parser.add_argument("--delay", action="store", type=float, default=3, help="Initial delay before retry, in seconds")
11 parser.add_argument("--count", action="store", type=int, default=5, help="Total number of tries")
12 parser.add_argument("--factor", action="store", type=float, default=2, help="Exponential backoff factor")
13 parser.add_argument("cmd", nargs=argparse.REMAINDER)
14 return parser
17 def log(value: str) -> None:
18 print(value)
19 sys.stdout.flush()
22 def main() -> None:
23 args = get_args().parse_args()
25 if not args.cmd:
26 log("No command supplied")
27 sys.exit(1)
29 retcode = None
31 for n in range(args.count):
32 try:
33 log("Running %s [try %d/%d]" % (" ".join(args.cmd), (n+1), args.count))
34 subprocess.check_call(args.cmd)
35 except subprocess.CalledProcessError as e:
36 retcode = e.returncode
37 else:
38 log("Command succeeded")
39 retcode = 0
40 break
42 if args.factor == 0:
43 wait_time = (n+1) * args.delay
44 else:
45 wait_time = args.factor**n * args.delay
46 if n < args.count - 1:
47 log("Command failed, waiting %s seconds to retry" % wait_time)
48 time.sleep(wait_time)
49 else:
50 log("Command failed, out of retries")
52 sys.exit(retcode)
55 if __name__ == "__main__":
56 main()