func ExpBackoffRetry()

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
}