in tools/retry.go [30:86]
func ExpBackoffRetry(args []string) error {
// Define command line flags
flag.Usage = printRetryHelp
var helpFlag bool
var triesFlag int
var maxFlag int
var verboseFlag bool
flag.BoolVar(&helpFlag, "help", false, "Print help message")
flag.BoolVar(&helpFlag, "h", false, "Print help message")
flag.IntVar(&triesFlag, "tries", 10, "Set max retries")
flag.IntVar(&triesFlag, "t", 10, "Set max retries")
flag.IntVar(&maxFlag, "max", 60, "Maximum time to run")
flag.IntVar(&maxFlag, "m", 60, "Maximum time to run")
flag.BoolVar(&verboseFlag, "verbose", false, "Verbose output")
flag.BoolVar(&verboseFlag, "v", false, "Verbose output")
// Parse command line flags
os.Args = args
flag.Parse()
// Print help message if -h flag is provided
if helpFlag {
flag.Usage()
return nil
}
// Remaining command line arguments
rest := flag.Args()
if len(rest) == 0 {
flag.Usage()
return nil
}
if verboseFlag {
fmt.Printf("Retry Parameters: max time=%d seconds, retries=%d times.\nCommand: %v\n", maxFlag, triesFlag, rest)
}
counter := 0
startTime := time.Now()
runCmd := func(args []string) error {
if verboseFlag {
counter += 1
elapsedTime := time.Since(startTime)
fmt.Printf("retry attempt %-3d elapsed %-3d seconds\n", counter, int(elapsedTime.Seconds()))
}
cmd := exec.Command(rest[0], rest[1:]...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}
err := retry(runCmd, rest, maxFlag, triesFlag)
return err
}