diff --git a/cmd/cmd.go b/cmd/cmd.go index 0e23d2373..64a6eafa1 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -161,20 +161,23 @@ func Run(Retry bool, cmd *cobra.Command, f func() error) { for try := 1; try <= *retries; try++ { err = f() if !Retry || (err == nil && !fs.Stats.Errored()) { + if try > 1 { + fs.ErrorLog(nil, "Attempt %d/%d succeeded", try, *retries) + } break } if fs.IsFatalError(err) { - fs.Log(nil, "Fatal error received - not attempting retries") + fs.ErrorLog(nil, "Fatal error received - not attempting retries") break } if fs.IsNoRetryError(err) { - fs.Log(nil, "Can't retry this error - not attempting retries") + fs.ErrorLog(nil, "Can't retry this error - not attempting retries") break } if err != nil { - fs.Log(nil, "Attempt %d/%d failed with %d errors and: %v", try, *retries, fs.Stats.GetErrors(), err) + fs.ErrorLog(nil, "Attempt %d/%d failed with %d errors and: %v", try, *retries, fs.Stats.GetErrors(), err) } else { - fs.Log(nil, "Attempt %d/%d failed with %d errors", try, *retries, fs.Stats.GetErrors()) + fs.ErrorLog(nil, "Attempt %d/%d failed with %d errors", try, *retries, fs.Stats.GetErrors()) } if try < *retries { fs.Stats.ResetErrors() diff --git a/docs/content/docs.md b/docs/content/docs.md index 04086bd3a..3f5392f81 100644 --- a/docs/content/docs.md +++ b/docs/content/docs.md @@ -629,7 +629,18 @@ If you use the `--log-file=FILE` option, rclone will redirect `Error`, Exit Code --------- -If any errors occurred during the command, rclone will set a non zero -exit code. This allows scripts to detect when rclone operations have -failed. +If any errors occurred during the command, rclone with an exit code of +`1`. This allows scripts to detect when rclone operations have failed. +During the startup phase rclone will exit immediately if an error is +detected in the configuration. There will always be a log message +immediately before exiting. + +When rclone is running it will accumulate errors as it goes along, and +only exit with an non-zero exit code if (after retries) there were no +transfers with errors remaining. For every error counted there will +be a high priority log message (visibile with `-q`) showing the +message and which file caused the problem. A high priority message is +also shown when starting a retry so the user can see that any previous +error messages may not be valid after the retry. If rclone has done a +retry it will log a high priority message if the retry was successful. diff --git a/rclone.go b/rclone.go index c88d94d7b..873b9f96c 100644 --- a/rclone.go +++ b/rclone.go @@ -4,8 +4,7 @@ package main import ( - "fmt" - "os" + "log" "github.com/ncw/rclone/cmd" _ "github.com/ncw/rclone/cmd/all" // import all commands @@ -14,8 +13,6 @@ import ( func main() { if err := cmd.Root.Execute(); err != nil { - fmt.Println(err) - os.Exit(-1) + log.Fatalf("Fatal error: %v", err) } - os.Exit(0) }