diff --git a/cmd/about/about.go b/cmd/about/about.go index 6d3afc91d..611cd5cbc 100644 --- a/cmd/about/about.go +++ b/cmd/about/about.go @@ -22,8 +22,8 @@ var ( func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.BoolVarP(cmdFlags, &jsonOutput, "json", "", false, "Format output as JSON") - flags.BoolVarP(cmdFlags, &fullOutput, "full", "", false, "Full numbers instead of human-readable") + flags.BoolVarP(cmdFlags, &jsonOutput, "json", "", false, "Format output as JSON", "") + flags.BoolVarP(cmdFlags, &fullOutput, "full", "", false, "Full numbers instead of human-readable", "") } // printValue formats uv to be output @@ -95,6 +95,7 @@ see complete list in [documentation](https://rclone.org/overview/#optional-featu `, Annotations: map[string]string{ "versionIntroduced": "v1.41", + // "groups": "", }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(1, 1, command, args) diff --git a/cmd/authorize/authorize.go b/cmd/authorize/authorize.go index 5d946880a..1804485c1 100644 --- a/cmd/authorize/authorize.go +++ b/cmd/authorize/authorize.go @@ -18,8 +18,8 @@ var ( func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.BoolVarP(cmdFlags, &noAutoBrowser, "auth-no-open-browser", "", false, "Do not automatically open auth link in default browser") - flags.StringVarP(cmdFlags, &template, "template", "", "", "The path to a custom Go template for generating HTML responses") + flags.BoolVarP(cmdFlags, &noAutoBrowser, "auth-no-open-browser", "", false, "Do not automatically open auth link in default browser", "") + flags.StringVarP(cmdFlags, &template, "template", "", "", "The path to a custom Go template for generating HTML responses", "") } var commandDefinition = &cobra.Command{ @@ -36,6 +36,7 @@ link in default browser automatically. Use --template to generate HTML output via a custom Go template. If a blank string is provided as an argument to this flag, the default template is used.`, Annotations: map[string]string{ "versionIntroduced": "v1.27", + // "groups": "", }, RunE: func(command *cobra.Command, args []string) error { cmd.CheckArgs(1, 3, command, args) diff --git a/cmd/backend/backend.go b/cmd/backend/backend.go index 9a95a5e89..3de8fa6f0 100644 --- a/cmd/backend/backend.go +++ b/cmd/backend/backend.go @@ -24,8 +24,8 @@ var ( func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.StringArrayVarP(cmdFlags, &options, "option", "o", options, "Option in the form name=value or name") - flags.BoolVarP(cmdFlags, &useJSON, "json", "", useJSON, "Always output in JSON format") + flags.StringArrayVarP(cmdFlags, &options, "option", "o", options, "Option in the form name=value or name", "") + flags.BoolVarP(cmdFlags, &useJSON, "json", "", useJSON, "Always output in JSON format", "") } var commandDefinition = &cobra.Command{ @@ -60,6 +60,7 @@ Note to run these commands on a running backend then see `, Annotations: map[string]string{ "versionIntroduced": "v1.52", + "groups": "Important", }, RunE: func(command *cobra.Command, args []string) error { cmd.CheckArgs(2, 1e6, command, args) diff --git a/cmd/bisync/cmd.go b/cmd/bisync/cmd.go index e1acc1118..17c87f1cc 100644 --- a/cmd/bisync/cmd.go +++ b/cmd/bisync/cmd.go @@ -98,16 +98,16 @@ var Opt Options func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.BoolVarP(cmdFlags, &Opt.Resync, "resync", "1", Opt.Resync, "Performs the resync run. Path1 files may overwrite Path2 versions. Consider using --verbose or --dry-run first.") - flags.BoolVarP(cmdFlags, &Opt.CheckAccess, "check-access", "", Opt.CheckAccess, makeHelp("Ensure expected {CHECKFILE} files are found on both Path1 and Path2 filesystems, else abort.")) - flags.StringVarP(cmdFlags, &Opt.CheckFilename, "check-filename", "", Opt.CheckFilename, makeHelp("Filename for --check-access (default: {CHECKFILE})")) - flags.BoolVarP(cmdFlags, &Opt.Force, "force", "", Opt.Force, "Bypass --max-delete safety check and run the sync. Consider using with --verbose") - flags.FVarP(cmdFlags, &Opt.CheckSync, "check-sync", "", "Controls comparison of final listings: true|false|only (default: true)") - flags.BoolVarP(cmdFlags, &Opt.RemoveEmptyDirs, "remove-empty-dirs", "", Opt.RemoveEmptyDirs, "Remove empty directories at the final cleanup step.") - flags.StringVarP(cmdFlags, &Opt.FiltersFile, "filters-file", "", Opt.FiltersFile, "Read filtering patterns from a file") - flags.StringVarP(cmdFlags, &Opt.Workdir, "workdir", "", Opt.Workdir, makeHelp("Use custom working dir - useful for testing. (default: {WORKDIR})")) - flags.BoolVarP(cmdFlags, &tzLocal, "localtime", "", tzLocal, "Use local time in listings (default: UTC)") - flags.BoolVarP(cmdFlags, &Opt.NoCleanup, "no-cleanup", "", Opt.NoCleanup, "Retain working files (useful for troubleshooting and testing).") + flags.BoolVarP(cmdFlags, &Opt.Resync, "resync", "1", Opt.Resync, "Performs the resync run. Path1 files may overwrite Path2 versions. Consider using --verbose or --dry-run first.", "") + flags.BoolVarP(cmdFlags, &Opt.CheckAccess, "check-access", "", Opt.CheckAccess, makeHelp("Ensure expected {CHECKFILE} files are found on both Path1 and Path2 filesystems, else abort."), "") + flags.StringVarP(cmdFlags, &Opt.CheckFilename, "check-filename", "", Opt.CheckFilename, makeHelp("Filename for --check-access (default: {CHECKFILE})"), "") + flags.BoolVarP(cmdFlags, &Opt.Force, "force", "", Opt.Force, "Bypass --max-delete safety check and run the sync. Consider using with --verbose", "") + flags.FVarP(cmdFlags, &Opt.CheckSync, "check-sync", "", "Controls comparison of final listings: true|false|only (default: true)", "") + flags.BoolVarP(cmdFlags, &Opt.RemoveEmptyDirs, "remove-empty-dirs", "", Opt.RemoveEmptyDirs, "Remove empty directories at the final cleanup step.", "") + flags.StringVarP(cmdFlags, &Opt.FiltersFile, "filters-file", "", Opt.FiltersFile, "Read filtering patterns from a file", "") + flags.StringVarP(cmdFlags, &Opt.Workdir, "workdir", "", Opt.Workdir, makeHelp("Use custom working dir - useful for testing. (default: {WORKDIR})"), "") + flags.BoolVarP(cmdFlags, &tzLocal, "localtime", "", tzLocal, "Use local time in listings (default: UTC)", "") + flags.BoolVarP(cmdFlags, &Opt.NoCleanup, "no-cleanup", "", Opt.NoCleanup, "Retain working files (useful for troubleshooting and testing).", "") } // bisync command definition @@ -117,6 +117,7 @@ var commandDefinition = &cobra.Command{ Long: longHelp, Annotations: map[string]string{ "versionIntroduced": "v1.58", + "groups": "Filter,Copy,Important", }, RunE: func(command *cobra.Command, args []string) error { cmd.CheckArgs(2, 2, command, args) diff --git a/cmd/cat/cat.go b/cmd/cat/cat.go index b92f3efbb..dc8d789be 100644 --- a/cmd/cat/cat.go +++ b/cmd/cat/cat.go @@ -27,12 +27,12 @@ var ( func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.Int64VarP(cmdFlags, &head, "head", "", head, "Only print the first N characters") - flags.Int64VarP(cmdFlags, &tail, "tail", "", tail, "Only print the last N characters") - flags.Int64VarP(cmdFlags, &offset, "offset", "", offset, "Start printing at offset N (or from end if -ve)") - flags.Int64VarP(cmdFlags, &count, "count", "", count, "Only print N characters") - flags.BoolVarP(cmdFlags, &discard, "discard", "", discard, "Discard the output instead of printing") - flags.StringVarP(cmdFlags, &separator, "separator", "", separator, "Separator to use between objects when printing multiple files") + flags.Int64VarP(cmdFlags, &head, "head", "", head, "Only print the first N characters", "") + flags.Int64VarP(cmdFlags, &tail, "tail", "", tail, "Only print the last N characters", "") + flags.Int64VarP(cmdFlags, &offset, "offset", "", offset, "Start printing at offset N (or from end if -ve)", "") + flags.Int64VarP(cmdFlags, &count, "count", "", count, "Only print N characters", "") + flags.BoolVarP(cmdFlags, &discard, "discard", "", discard, "Discard the output instead of printing", "") + flags.StringVarP(cmdFlags, &separator, "separator", "", separator, "Separator to use between objects when printing multiple files", "") } var commandDefinition = &cobra.Command{ @@ -73,6 +73,7 @@ files, use: `, "|", "`"), Annotations: map[string]string{ "versionIntroduced": "v1.33", + "groups": "Filter,Listing", }, Run: func(command *cobra.Command, args []string) { usedOffset := offset != 0 || count >= 0 diff --git a/cmd/check/check.go b/cmd/check/check.go index 8251d8e47..9217eee7d 100644 --- a/cmd/check/check.go +++ b/cmd/check/check.go @@ -33,20 +33,20 @@ var ( func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.BoolVarP(cmdFlags, &download, "download", "", download, "Check by downloading rather than with hash") - flags.StringVarP(cmdFlags, &checkFileHashType, "checkfile", "C", checkFileHashType, "Treat source:path as a SUM file with hashes of given type") + flags.BoolVarP(cmdFlags, &download, "download", "", download, "Check by downloading rather than with hash", "") + flags.StringVarP(cmdFlags, &checkFileHashType, "checkfile", "C", checkFileHashType, "Treat source:path as a SUM file with hashes of given type", "") AddFlags(cmdFlags) } // AddFlags adds the check flags to the cmdFlags command func AddFlags(cmdFlags *pflag.FlagSet) { - flags.BoolVarP(cmdFlags, &oneway, "one-way", "", oneway, "Check one way only, source files must exist on remote") - flags.StringVarP(cmdFlags, &combined, "combined", "", combined, "Make a combined report of changes to this file") - flags.StringVarP(cmdFlags, &missingOnSrc, "missing-on-src", "", missingOnSrc, "Report all files missing from the source to this file") - flags.StringVarP(cmdFlags, &missingOnDst, "missing-on-dst", "", missingOnDst, "Report all files missing from the destination to this file") - flags.StringVarP(cmdFlags, &match, "match", "", match, "Report all matching files to this file") - flags.StringVarP(cmdFlags, &differ, "differ", "", differ, "Report all non-matching files to this file") - flags.StringVarP(cmdFlags, &errFile, "error", "", errFile, "Report all files with errors (hashing or reading) to this file") + flags.BoolVarP(cmdFlags, &oneway, "one-way", "", oneway, "Check one way only, source files must exist on remote", "") + flags.StringVarP(cmdFlags, &combined, "combined", "", combined, "Make a combined report of changes to this file", "") + flags.StringVarP(cmdFlags, &missingOnSrc, "missing-on-src", "", missingOnSrc, "Report all files missing from the source to this file", "") + flags.StringVarP(cmdFlags, &missingOnDst, "missing-on-dst", "", missingOnDst, "Report all files missing from the destination to this file", "") + flags.StringVarP(cmdFlags, &match, "match", "", match, "Report all matching files to this file", "") + flags.StringVarP(cmdFlags, &differ, "differ", "", differ, "Report all non-matching files to this file", "") + flags.StringVarP(cmdFlags, &errFile, "error", "", errFile, "Report all files with errors (hashing or reading) to this file", "") } // FlagsHelp describes the flags for the help @@ -158,6 +158,9 @@ to check all the data. If you supply the |--checkfile HASH| flag with a valid hash name, the |source:path| must point to a text file in the SUM format. `, "|", "`") + FlagsHelp, + Annotations: map[string]string{ + "groups": "Filter,Listing,Check", + }, RunE: func(command *cobra.Command, args []string) error { cmd.CheckArgs(2, 2, command, args) var ( diff --git a/cmd/checksum/checksum.go b/cmd/checksum/checksum.go index 4dee6611c..2e2c7cc1d 100644 --- a/cmd/checksum/checksum.go +++ b/cmd/checksum/checksum.go @@ -19,7 +19,7 @@ var download = false func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.BoolVarP(cmdFlags, &download, "download", "", download, "Check by hashing the contents") + flags.BoolVarP(cmdFlags, &download, "download", "", download, "Check by hashing the contents", "") check.AddFlags(cmdFlags) } @@ -39,6 +39,7 @@ Note that hash values in the SUM file are treated as case insensitive. `, "|", "`") + check.FlagsHelp, Annotations: map[string]string{ "versionIntroduced": "v1.56", + "groups": "Filter,Listing", }, RunE: func(command *cobra.Command, args []string) error { cmd.CheckArgs(3, 3, command, args) diff --git a/cmd/cleanup/cleanup.go b/cmd/cleanup/cleanup.go index d23f0cb91..0b6687e3b 100644 --- a/cmd/cleanup/cleanup.go +++ b/cmd/cleanup/cleanup.go @@ -22,6 +22,7 @@ versions. Not supported by all remotes. `, Annotations: map[string]string{ "versionIntroduced": "v1.31", + "groups": "Important", }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(1, 1, command, args) diff --git a/cmd/cmd.go b/cmd/cmd.go index 01102473e..e80e75c51 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -48,13 +48,13 @@ import ( // Globals var ( // Flags - cpuProfile = flags.StringP("cpuprofile", "", "", "Write cpu profile to file") - memProfile = flags.StringP("memprofile", "", "", "Write memory profile to file") - statsInterval = flags.DurationP("stats", "", time.Minute*1, "Interval between printing stats, e.g. 500ms, 60s, 5m (0 to disable)") - dataRateUnit = flags.StringP("stats-unit", "", "bytes", "Show data rate in stats as either 'bits' or 'bytes' per second") + cpuProfile = flags.StringP("cpuprofile", "", "", "Write cpu profile to file", "Debugging") + memProfile = flags.StringP("memprofile", "", "", "Write memory profile to file", "Debugging") + statsInterval = flags.DurationP("stats", "", time.Minute*1, "Interval between printing stats, e.g. 500ms, 60s, 5m (0 to disable)", "Logging") + dataRateUnit = flags.StringP("stats-unit", "", "bytes", "Show data rate in stats as either 'bits' or 'bytes' per second", "Logging") version bool - retries = flags.IntP("retries", "", 3, "Retry operations this many times if they fail") - retriesInterval = flags.DurationP("retries-sleep", "", 0, "Interval between retrying operations if they fail, e.g. 500ms, 60s, 5m (0 to disable)") + retries = flags.IntP("retries", "", 3, "Retry operations this many times if they fail", "Config") + retriesInterval = flags.DurationP("retries-sleep", "", 0, "Interval between retrying operations if they fail, e.g. 500ms, 60s, 5m (0 to disable)", "Config") // Errors errorCommandNotFound = errors.New("command not found") errorUncategorized = errors.New("uncategorized error") diff --git a/cmd/config/config.go b/cmd/config/config.go index fdceb382a..9fca8a758 100644 --- a/cmd/config/config.go +++ b/cmd/config/config.go @@ -321,13 +321,13 @@ func doConfig(name string, in rc.Params, do func(config.UpdateRemoteOpt) (*fs.Co func init() { for _, cmdFlags := range []*pflag.FlagSet{configCreateCommand.Flags(), configUpdateCommand.Flags()} { - flags.BoolVarP(cmdFlags, &updateRemoteOpt.Obscure, "obscure", "", false, "Force any passwords to be obscured") - flags.BoolVarP(cmdFlags, &updateRemoteOpt.NoObscure, "no-obscure", "", false, "Force any passwords not to be obscured") - flags.BoolVarP(cmdFlags, &updateRemoteOpt.NonInteractive, "non-interactive", "", false, "Don't interact with user and return questions") - flags.BoolVarP(cmdFlags, &updateRemoteOpt.Continue, "continue", "", false, "Continue the configuration process with an answer") - flags.BoolVarP(cmdFlags, &updateRemoteOpt.All, "all", "", false, "Ask the full set of config questions") - flags.StringVarP(cmdFlags, &updateRemoteOpt.State, "state", "", "", "State - use with --continue") - flags.StringVarP(cmdFlags, &updateRemoteOpt.Result, "result", "", "", "Result - use with --continue") + flags.BoolVarP(cmdFlags, &updateRemoteOpt.Obscure, "obscure", "", false, "Force any passwords to be obscured", "Config") + flags.BoolVarP(cmdFlags, &updateRemoteOpt.NoObscure, "no-obscure", "", false, "Force any passwords not to be obscured", "Config") + flags.BoolVarP(cmdFlags, &updateRemoteOpt.NonInteractive, "non-interactive", "", false, "Don't interact with user and return questions", "Config") + flags.BoolVarP(cmdFlags, &updateRemoteOpt.Continue, "continue", "", false, "Continue the configuration process with an answer", "Config") + flags.BoolVarP(cmdFlags, &updateRemoteOpt.All, "all", "", false, "Ask the full set of config questions", "Config") + flags.StringVarP(cmdFlags, &updateRemoteOpt.State, "state", "", "", "State - use with --continue", "Config") + flags.StringVarP(cmdFlags, &updateRemoteOpt.Result, "result", "", "", "Result - use with --continue", "Config") } } @@ -483,7 +483,7 @@ var ( ) func init() { - flags.BoolVarP(configUserInfoCommand.Flags(), &jsonOutput, "json", "", false, "Format output as JSON") + flags.BoolVarP(configUserInfoCommand.Flags(), &jsonOutput, "json", "", false, "Format output as JSON", "") } var configUserInfoCommand = &cobra.Command{ diff --git a/cmd/copy/copy.go b/cmd/copy/copy.go index c6e42a70e..745811de4 100644 --- a/cmd/copy/copy.go +++ b/cmd/copy/copy.go @@ -19,7 +19,7 @@ var ( func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.BoolVarP(cmdFlags, &createEmptySrcDirs, "create-empty-src-dirs", "", createEmptySrcDirs, "Create empty source dirs on destination after copy") + flags.BoolVarP(cmdFlags, &createEmptySrcDirs, "create-empty-src-dirs", "", createEmptySrcDirs, "Create empty source dirs on destination after copy", "") } var commandDefinition = &cobra.Command{ @@ -83,6 +83,9 @@ recently very efficiently like this: **Note**: Use the |--dry-run| or the |--interactive|/|-i| flag to test without copying anything. `, "|", "`"), + Annotations: map[string]string{ + "groups": "Copy,Filter,Listing,Important", + }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(2, 2, command, args) diff --git a/cmd/copyto/copyto.go b/cmd/copyto/copyto.go index 337a80b3a..27efcc0be 100644 --- a/cmd/copyto/copyto.go +++ b/cmd/copyto/copyto.go @@ -48,6 +48,7 @@ the destination. `, Annotations: map[string]string{ "versionIntroduced": "v1.35", + "groups": "Copy,Filter,Listing,Important", }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(2, 2, command, args) diff --git a/cmd/copyurl/copyurl.go b/cmd/copyurl/copyurl.go index 9b9063861..b5df8c88f 100644 --- a/cmd/copyurl/copyurl.go +++ b/cmd/copyurl/copyurl.go @@ -25,11 +25,11 @@ var ( func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.BoolVarP(cmdFlags, &autoFilename, "auto-filename", "a", autoFilename, "Get the file name from the URL and use it for destination file path") - flags.BoolVarP(cmdFlags, &headerFilename, "header-filename", "", headerFilename, "Get the file name from the Content-Disposition header") - flags.BoolVarP(cmdFlags, &printFilename, "print-filename", "p", printFilename, "Print the resulting name from --auto-filename") - flags.BoolVarP(cmdFlags, &noClobber, "no-clobber", "", noClobber, "Prevent overwriting file with same name") - flags.BoolVarP(cmdFlags, &stdout, "stdout", "", stdout, "Write the output to stdout rather than a file") + flags.BoolVarP(cmdFlags, &autoFilename, "auto-filename", "a", autoFilename, "Get the file name from the URL and use it for destination file path", "") + flags.BoolVarP(cmdFlags, &headerFilename, "header-filename", "", headerFilename, "Get the file name from the Content-Disposition header", "") + flags.BoolVarP(cmdFlags, &printFilename, "print-filename", "p", printFilename, "Print the resulting name from --auto-filename", "") + flags.BoolVarP(cmdFlags, &noClobber, "no-clobber", "", noClobber, "Prevent overwriting file with same name", "") + flags.BoolVarP(cmdFlags, &stdout, "stdout", "", stdout, "Write the output to stdout rather than a file", "") } var commandDefinition = &cobra.Command{ @@ -53,6 +53,7 @@ will cause the output to be written to standard output. `, Annotations: map[string]string{ "versionIntroduced": "v1.43", + "groups": "Important", }, RunE: func(command *cobra.Command, args []string) (err error) { cmd.CheckArgs(1, 2, command, args) diff --git a/cmd/cryptcheck/cryptcheck.go b/cmd/cryptcheck/cryptcheck.go index 7c01d9d59..e26e1b89e 100644 --- a/cmd/cryptcheck/cryptcheck.go +++ b/cmd/cryptcheck/cryptcheck.go @@ -49,6 +49,7 @@ After it has run it will log the status of the encryptedremote:. ` + check.FlagsHelp, Annotations: map[string]string{ "versionIntroduced": "v1.36", + "groups": "Filter,Listing,Check", }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(2, 2, command, args) diff --git a/cmd/cryptdecode/cryptdecode.go b/cmd/cryptdecode/cryptdecode.go index a657bb0c5..745e71002 100644 --- a/cmd/cryptdecode/cryptdecode.go +++ b/cmd/cryptdecode/cryptdecode.go @@ -20,7 +20,7 @@ var ( func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.BoolVarP(cmdFlags, &Reverse, "reverse", "", Reverse, "Reverse cryptdecode, encrypts filenames") + flags.BoolVarP(cmdFlags, &Reverse, "reverse", "", Reverse, "Reverse cryptdecode, encrypts filenames", "") } var commandDefinition = &cobra.Command{ diff --git a/cmd/dedupe/dedupe.go b/cmd/dedupe/dedupe.go index b56d62d9f..a62a07ab6 100644 --- a/cmd/dedupe/dedupe.go +++ b/cmd/dedupe/dedupe.go @@ -20,8 +20,8 @@ var ( func init() { cmd.Root.AddCommand(commandDefinition) cmdFlag := commandDefinition.Flags() - flags.FVarP(cmdFlag, &dedupeMode, "dedupe-mode", "", "Dedupe mode interactive|skip|first|newest|oldest|largest|smallest|rename") - flags.BoolVarP(cmdFlag, &byHash, "by-hash", "", false, "Find identical hashes rather than names") + flags.FVarP(cmdFlag, &dedupeMode, "dedupe-mode", "", "Dedupe mode interactive|skip|first|newest|oldest|largest|smallest|rename", "") + flags.BoolVarP(cmdFlag, &byHash, "by-hash", "", false, "Find identical hashes rather than names", "") } var commandDefinition = &cobra.Command{ @@ -137,6 +137,7 @@ Or `, Annotations: map[string]string{ "versionIntroduced": "v1.27", + "groups": "Important", }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(1, 2, command, args) diff --git a/cmd/delete/delete.go b/cmd/delete/delete.go index 4dcc69ddd..32c93a875 100644 --- a/cmd/delete/delete.go +++ b/cmd/delete/delete.go @@ -18,7 +18,7 @@ var ( func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.BoolVarP(cmdFlags, &rmdirs, "rmdirs", "", rmdirs, "rmdirs removes empty directories but leaves root intact") + flags.BoolVarP(cmdFlags, &rmdirs, "rmdirs", "", rmdirs, "rmdirs removes empty directories but leaves root intact", "") } var commandDefinition = &cobra.Command{ @@ -55,6 +55,7 @@ delete all files bigger than 100 MiB. `, "|", "`"), Annotations: map[string]string{ "versionIntroduced": "v1.27", + "groups": "Important,Filter,Listing", }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(1, 1, command, args) diff --git a/cmd/deletefile/deletefile.go b/cmd/deletefile/deletefile.go index 6311b3ddf..1d6d26c2f 100644 --- a/cmd/deletefile/deletefile.go +++ b/cmd/deletefile/deletefile.go @@ -25,6 +25,7 @@ it will always be removed. `, Annotations: map[string]string{ "versionIntroduced": "v1.42", + "groups": "Important", }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(1, 1, command, args) diff --git a/cmd/gendocs/gendocs.go b/cmd/gendocs/gendocs.go index 83c54846d..c80b75374 100644 --- a/cmd/gendocs/gendocs.go +++ b/cmd/gendocs/gendocs.go @@ -3,6 +3,7 @@ package gendocs import ( "bytes" + "fmt" "log" "os" "path" @@ -13,10 +14,10 @@ import ( "time" "github.com/rclone/rclone/cmd" + "github.com/rclone/rclone/fs/config/flags" "github.com/rclone/rclone/lib/file" "github.com/spf13/cobra" "github.com/spf13/cobra/doc" - "github.com/spf13/pflag" ) func init() { @@ -88,6 +89,7 @@ rclone.org website.`, Annotations map[string]string } var commands = map[string]commandDetails{} + var aliases []string var addCommandDetails func(root *cobra.Command) addCommandDetails = func(root *cobra.Command) { name := strings.ReplaceAll(root.CommandPath(), " ", "_") + ".md" @@ -95,6 +97,7 @@ rclone.org website.`, Short: root.Short, Annotations: root.Annotations, } + aliases = append(aliases, root.Aliases...) for _, c := range root.Commands() { addCommandDetails(c) } @@ -126,10 +129,6 @@ rclone.org website.`, return "/commands/" + strings.ToLower(base) + "/" } - // Hide all of the root entries flags - cmd.Root.Flags().VisitAll(func(flag *pflag.Flag) { - flag.Hidden = true - }) err = doc.GenMarkdownTreeCustom(cmd.Root, out, prepender, linkHandler) if err != nil { return err @@ -143,15 +142,50 @@ rclone.org website.`, return err } if !info.IsDir() { + name := filepath.Base(path) + cmd, ok := commands[name] + if !ok { + // Avoid man pages which are for aliases. This is a bit messy! + for _, alias := range aliases { + if strings.Contains(name, alias) { + return nil + } + } + return fmt.Errorf("didn't find command for %q", name) + } b, err := os.ReadFile(path) if err != nil { return err } doc := string(b) - doc = strings.Replace(doc, "\n### SEE ALSO", ` + + var out strings.Builder + if groupsString := cmd.Annotations["groups"]; groupsString != "" { + groups := flags.All.Include(groupsString) + for _, group := range groups.Groups { + if group.Flags.HasFlags() { + _, _ = fmt.Fprintf(&out, "\n### %s Options\n\n", group.Name) + _, _ = fmt.Fprintf(&out, "%s\n\n", group.Help) + _, _ = fmt.Fprintln(&out, "```") + _, _ = out.WriteString(group.Flags.FlagUsages()) + _, _ = fmt.Fprintln(&out, "```") + } + } + } + _, _ = out.WriteString(` See the [global flags page](/flags/) for global options not listed here. -### SEE ALSO`, 1) +`) + + startCut := strings.Index(doc, `### Options inherited from parent commands`) + endCut := strings.Index(doc, `## SEE ALSO`) + if startCut < 0 || endCut < 0 { + if name == "rclone.md" { + return nil + } + return fmt.Errorf("internal error: failed to find cut points: startCut = %d, endCut = %d", startCut, endCut) + } + doc = doc[:startCut] + out.String() + doc[endCut:] // outdent all the titles by one doc = outdentTitle.ReplaceAllString(doc, `$1`) err = os.WriteFile(path, []byte(doc), 0777) diff --git a/cmd/hashsum/hashsum.go b/cmd/hashsum/hashsum.go index 6e39cf7ce..f0df57815 100644 --- a/cmd/hashsum/hashsum.go +++ b/cmd/hashsum/hashsum.go @@ -31,10 +31,10 @@ func init() { // AddHashsumFlags is a convenience function to add the command flags OutputBase64 and DownloadFlag to hashsum, md5sum, sha1sum func AddHashsumFlags(cmdFlags *pflag.FlagSet) { - flags.BoolVarP(cmdFlags, &OutputBase64, "base64", "", OutputBase64, "Output base64 encoded hashsum") - flags.StringVarP(cmdFlags, &HashsumOutfile, "output-file", "", HashsumOutfile, "Output hashsums to a file rather than the terminal") - flags.StringVarP(cmdFlags, &ChecksumFile, "checkfile", "C", ChecksumFile, "Validate hashes against a given SUM file instead of printing them") - flags.BoolVarP(cmdFlags, &DownloadFlag, "download", "", DownloadFlag, "Download the file and hash it locally; if this flag is not specified, the hash is requested from the remote") + flags.BoolVarP(cmdFlags, &OutputBase64, "base64", "", OutputBase64, "Output base64 encoded hashsum", "") + flags.StringVarP(cmdFlags, &HashsumOutfile, "output-file", "", HashsumOutfile, "Output hashsums to a file rather than the terminal", "") + flags.StringVarP(cmdFlags, &ChecksumFile, "checkfile", "C", ChecksumFile, "Validate hashes against a given SUM file instead of printing them", "") + flags.BoolVarP(cmdFlags, &DownloadFlag, "download", "", DownloadFlag, "Download the file and hash it locally; if this flag is not specified, the hash is requested from the remote", "") } // GetHashsumOutput opens and closes the output file when using the output-file flag @@ -114,6 +114,7 @@ Note that hash names are case insensitive and values are output in lower case. `, Annotations: map[string]string{ "versionIntroduced": "v1.41", + "groups": "Filter,Listing", }, RunE: func(command *cobra.Command, args []string) error { cmd.CheckArgs(0, 2, command, args) diff --git a/cmd/help.go b/cmd/help.go index ecc34b63e..f44153e6d 100644 --- a/cmd/help.go +++ b/cmd/help.go @@ -11,6 +11,7 @@ import ( "github.com/rclone/rclone/fs" "github.com/rclone/rclone/fs/config/configflags" + "github.com/rclone/rclone/fs/config/flags" "github.com/rclone/rclone/fs/filter/filterflags" "github.com/rclone/rclone/fs/log/logflags" "github.com/rclone/rclone/fs/rc/rcflags" @@ -113,7 +114,7 @@ var helpFlags = &cobra.Command{ Short: "Show the global flags for rclone", Run: func(command *cobra.Command, args []string) { if len(args) > 0 { - re, err := regexp.Compile(args[0]) + re, err := regexp.Compile(`(?i)` + args[0]) if err != nil { log.Fatalf("Failed to compile flags regexp: %v", err) } @@ -181,7 +182,7 @@ func setupRootCommand(rootCmd *cobra.Command) { Root.Flags().BoolVarP(&version, "version", "V", false, "Print the version number") cobra.AddTemplateFunc("showGlobalFlags", func(cmd *cobra.Command) bool { - return cmd.CalledAs() == "flags" + return cmd.CalledAs() == "flags" || cmd.Annotations["groups"] != "" }) cobra.AddTemplateFunc("showCommands", func(cmd *cobra.Command) bool { return cmd.CalledAs() != "flags" @@ -191,15 +192,21 @@ func setupRootCommand(rootCmd *cobra.Command) { // "rclone help" (which shows the global help) return cmd.CalledAs() != "rclone" && cmd.CalledAs() != "" }) - cobra.AddTemplateFunc("backendFlags", func(cmd *cobra.Command, include bool) *pflag.FlagSet { - backendFlagSet := pflag.NewFlagSet("Backend Flags", pflag.ExitOnError) + cobra.AddTemplateFunc("flagGroups", func(cmd *cobra.Command) []*flags.Group { + // Add the backend flags and check all flags + backendGroup := flags.All.NewGroup("Backend", "Backend only flags. These can be set in the config file also.") + allRegistered := flags.All.AllRegistered() cmd.InheritedFlags().VisitAll(func(flag *pflag.Flag) { - matched := flagsRe == nil || flagsRe.MatchString(flag.Name) - if _, ok := backendFlags[flag.Name]; matched && ok == include { - backendFlagSet.AddFlag(flag) + if _, ok := backendFlags[flag.Name]; ok { + backendGroup.Add(flag) + } else if _, ok := allRegistered[flag]; ok { + // flag is in a group already + } else { + fs.Errorf(nil, "Flag --%s is unknown", flag.Name) } }) - return backendFlagSet + groups := flags.All.Filter(flagsRe).Include(cmd.Annotations["groups"]) + return groups.Groups }) rootCmd.SetUsageTemplate(usageTemplate) // rootCmd.SetHelpTemplate(helpTemplate) @@ -233,11 +240,13 @@ Available Commands:{{range .Commands}}{{if (or .IsAvailableCommand (eq .Name "he Flags: {{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if and (showGlobalFlags .) .HasAvailableInheritedFlags}} -Global Flags: -{{(backendFlags . false).FlagUsages | trimTrailingWhitespaces}} +{{ range flagGroups . }}{{ if .Flags.HasFlags }} +# {{ .Name }} Flags -Backend Flags: -{{(backendFlags . true).FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasHelpSubCommands}} +{{ .Help }} + +{{ .Flags.FlagUsages | trimTrailingWhitespaces}} +{{ end }}{{ end }} Additional help topics:{{range .Commands}}{{if .IsAdditionalHelpTopicCommand}} {{rpad .CommandPath .CommandPathPadding}} {{.Short}}{{end}}{{end}}{{end}} @@ -255,24 +264,18 @@ description: "Rclone Global Flags" # Global Flags This describes the global flags available to every rclone command -split into two groups, non backend and backend flags. +split into groups. -## Non Backend Flags +{{ range flagGroups . }}{{ if .Flags.HasFlags }} +## {{ .Name }} -These flags are available for every command. +{{ .Help }} ` + "```" + ` -{{(backendFlags . false).FlagUsages | trimTrailingWhitespaces}} +{{ .Flags.FlagUsages | trimTrailingWhitespaces}} ` + "```" + ` -## Backend Flags - -These flags are available for every command. They control the backends -and may be set in the config file. - -` + "```" + ` -{{(backendFlags . true).FlagUsages | trimTrailingWhitespaces}} -` + "```" + ` +{{ end }}{{ end }} ` // show all the backends diff --git a/cmd/link/link.go b/cmd/link/link.go index 380e5a46b..8b591373f 100644 --- a/cmd/link/link.go +++ b/cmd/link/link.go @@ -20,8 +20,8 @@ var ( func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.FVarP(cmdFlags, &expire, "expire", "", "The amount of time that the link will be valid") - flags.BoolVarP(cmdFlags, &unlink, "unlink", "", unlink, "Remove existing public link to file/folder") + flags.FVarP(cmdFlags, &expire, "expire", "", "The amount of time that the link will be valid", "") + flags.BoolVarP(cmdFlags, &unlink, "unlink", "", unlink, "Remove existing public link to file/folder", "") } var commandDefinition = &cobra.Command{ diff --git a/cmd/listremotes/listremotes.go b/cmd/listremotes/listremotes.go index 46d540440..6f63ba26b 100644 --- a/cmd/listremotes/listremotes.go +++ b/cmd/listremotes/listremotes.go @@ -19,7 +19,7 @@ var ( func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.BoolVarP(cmdFlags, &listLong, "long", "", listLong, "Show the type as well as names") + flags.BoolVarP(cmdFlags, &listLong, "long", "", listLong, "Show the type as well as names", "") } var commandDefinition = &cobra.Command{ diff --git a/cmd/ls/ls.go b/cmd/ls/ls.go index 334b12f8e..313744005 100644 --- a/cmd/ls/ls.go +++ b/cmd/ls/ls.go @@ -31,6 +31,9 @@ Eg 37600 fubuwic ` + lshelp.Help, + Annotations: map[string]string{ + "groups": "Filter,Listing", + }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(1, 1, command, args) fsrc := cmd.NewFsSrc(args) diff --git a/cmd/lsd/lsd.go b/cmd/lsd/lsd.go index 8d79266fb..621807610 100644 --- a/cmd/lsd/lsd.go +++ b/cmd/lsd/lsd.go @@ -20,7 +20,7 @@ var ( func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.BoolVarP(cmdFlags, &recurse, "recursive", "R", false, "Recurse into the listing") + flags.BoolVarP(cmdFlags, &recurse, "recursive", "R", false, "Recurse into the listing", "") } var commandDefinition = &cobra.Command{ @@ -49,6 +49,9 @@ Or If you just want the directory names use ` + "`rclone lsf --dirs-only`" + `. ` + lshelp.Help, + Annotations: map[string]string{ + "groups": "Filter,Listing", + }, Run: func(command *cobra.Command, args []string) { ci := fs.GetConfig(context.Background()) cmd.CheckArgs(1, 1, command, args) diff --git a/cmd/lsf/lsf.go b/cmd/lsf/lsf.go index 8322e7c25..22e4de754 100644 --- a/cmd/lsf/lsf.go +++ b/cmd/lsf/lsf.go @@ -31,15 +31,15 @@ var ( func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.StringVarP(cmdFlags, &format, "format", "F", "p", "Output format - see help for details") - flags.StringVarP(cmdFlags, &separator, "separator", "s", ";", "Separator for the items in the format") - flags.BoolVarP(cmdFlags, &dirSlash, "dir-slash", "d", true, "Append a slash to directory names") - flags.FVarP(cmdFlags, &hashType, "hash", "", "Use this hash when `h` is used in the format MD5|SHA-1|DropboxHash") - flags.BoolVarP(cmdFlags, &filesOnly, "files-only", "", false, "Only list files") - flags.BoolVarP(cmdFlags, &dirsOnly, "dirs-only", "", false, "Only list directories") - flags.BoolVarP(cmdFlags, &csv, "csv", "", false, "Output in CSV format") - flags.BoolVarP(cmdFlags, &absolute, "absolute", "", false, "Put a leading / in front of path names") - flags.BoolVarP(cmdFlags, &recurse, "recursive", "R", false, "Recurse into the listing") + flags.StringVarP(cmdFlags, &format, "format", "F", "p", "Output format - see help for details", "") + flags.StringVarP(cmdFlags, &separator, "separator", "s", ";", "Separator for the items in the format", "") + flags.BoolVarP(cmdFlags, &dirSlash, "dir-slash", "d", true, "Append a slash to directory names", "") + flags.FVarP(cmdFlags, &hashType, "hash", "", "Use this hash when `h` is used in the format MD5|SHA-1|DropboxHash", "") + flags.BoolVarP(cmdFlags, &filesOnly, "files-only", "", false, "Only list files", "") + flags.BoolVarP(cmdFlags, &dirsOnly, "dirs-only", "", false, "Only list directories", "") + flags.BoolVarP(cmdFlags, &csv, "csv", "", false, "Output in CSV format", "") + flags.BoolVarP(cmdFlags, &absolute, "absolute", "", false, "Put a leading / in front of path names", "") + flags.BoolVarP(cmdFlags, &recurse, "recursive", "R", false, "Recurse into the listing", "") } var commandDefinition = &cobra.Command{ @@ -144,6 +144,7 @@ those only (without traversing the whole directory structure): ` + lshelp.Help, Annotations: map[string]string{ "versionIntroduced": "v1.40", + "groups": "Filter,Listing", }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(1, 1, command, args) diff --git a/cmd/lsjson/lsjson.go b/cmd/lsjson/lsjson.go index c7da1c863..764ff2b94 100644 --- a/cmd/lsjson/lsjson.go +++ b/cmd/lsjson/lsjson.go @@ -23,17 +23,17 @@ var ( func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.BoolVarP(cmdFlags, &opt.Recurse, "recursive", "R", false, "Recurse into the listing") - flags.BoolVarP(cmdFlags, &opt.ShowHash, "hash", "", false, "Include hashes in the output (may take longer)") - flags.BoolVarP(cmdFlags, &opt.NoModTime, "no-modtime", "", false, "Don't read the modification time (can speed things up)") - flags.BoolVarP(cmdFlags, &opt.NoMimeType, "no-mimetype", "", false, "Don't read the mime type (can speed things up)") - flags.BoolVarP(cmdFlags, &opt.ShowEncrypted, "encrypted", "", false, "Show the encrypted names") - flags.BoolVarP(cmdFlags, &opt.ShowOrigIDs, "original", "", false, "Show the ID of the underlying Object") - flags.BoolVarP(cmdFlags, &opt.FilesOnly, "files-only", "", false, "Show only files in the listing") - flags.BoolVarP(cmdFlags, &opt.DirsOnly, "dirs-only", "", false, "Show only directories in the listing") - flags.BoolVarP(cmdFlags, &opt.Metadata, "metadata", "M", false, "Add metadata to the listing") - flags.StringArrayVarP(cmdFlags, &opt.HashTypes, "hash-type", "", nil, "Show only this hash type (may be repeated)") - flags.BoolVarP(cmdFlags, &statOnly, "stat", "", false, "Just return the info for the pointed to file") + flags.BoolVarP(cmdFlags, &opt.Recurse, "recursive", "R", false, "Recurse into the listing", "") + flags.BoolVarP(cmdFlags, &opt.ShowHash, "hash", "", false, "Include hashes in the output (may take longer)", "") + flags.BoolVarP(cmdFlags, &opt.NoModTime, "no-modtime", "", false, "Don't read the modification time (can speed things up)", "") + flags.BoolVarP(cmdFlags, &opt.NoMimeType, "no-mimetype", "", false, "Don't read the mime type (can speed things up)", "") + flags.BoolVarP(cmdFlags, &opt.ShowEncrypted, "encrypted", "", false, "Show the encrypted names", "") + flags.BoolVarP(cmdFlags, &opt.ShowOrigIDs, "original", "", false, "Show the ID of the underlying Object", "") + flags.BoolVarP(cmdFlags, &opt.FilesOnly, "files-only", "", false, "Show only files in the listing", "") + flags.BoolVarP(cmdFlags, &opt.DirsOnly, "dirs-only", "", false, "Show only directories in the listing", "") + flags.BoolVarP(cmdFlags, &opt.Metadata, "metadata", "M", false, "Add metadata to the listing", "") + flags.StringArrayVarP(cmdFlags, &opt.HashTypes, "hash-type", "", nil, "Show only this hash type (may be repeated)", "") + flags.BoolVarP(cmdFlags, &statOnly, "stat", "", false, "Just return the info for the pointed to file", "") } var commandDefinition = &cobra.Command{ @@ -114,6 +114,7 @@ can be processed line by line as each item is written one to a line. ` + lshelp.Help, Annotations: map[string]string{ "versionIntroduced": "v1.37", + "groups": "Filter,Listing", }, RunE: func(command *cobra.Command, args []string) error { cmd.CheckArgs(1, 1, command, args) diff --git a/cmd/lsl/lsl.go b/cmd/lsl/lsl.go index e7a7366f1..738f66a2a 100644 --- a/cmd/lsl/lsl.go +++ b/cmd/lsl/lsl.go @@ -33,6 +33,7 @@ Eg ` + lshelp.Help, Annotations: map[string]string{ "versionIntroduced": "v1.02", + "groups": "Filter,Listing", }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(1, 1, command, args) diff --git a/cmd/md5sum/md5sum.go b/cmd/md5sum/md5sum.go index 94c0ed3ef..dd27a1f77 100644 --- a/cmd/md5sum/md5sum.go +++ b/cmd/md5sum/md5sum.go @@ -40,6 +40,7 @@ as a relative path). `, Annotations: map[string]string{ "versionIntroduced": "v1.02", + "groups": "Filter,Listing", }, RunE: func(command *cobra.Command, args []string) error { cmd.CheckArgs(0, 1, command, args) diff --git a/cmd/mkdir/mkdir.go b/cmd/mkdir/mkdir.go index 3c99180fe..37dfc18f8 100644 --- a/cmd/mkdir/mkdir.go +++ b/cmd/mkdir/mkdir.go @@ -18,6 +18,9 @@ func init() { var commandDefinition = &cobra.Command{ Use: "mkdir remote:path", Short: `Make the path if it doesn't already exist.`, + Annotations: map[string]string{ + "groups": "Important", + }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(1, 1, command, args) fdst := cmd.NewFsDir(args) diff --git a/cmd/mountlib/mount.go b/cmd/mountlib/mount.go index a783b2b47..82700b92e 100644 --- a/cmd/mountlib/mount.go +++ b/cmd/mountlib/mount.go @@ -125,31 +125,31 @@ var Opt Options // AddFlags adds the non filing system specific flags to the command func AddFlags(flagSet *pflag.FlagSet) { rc.AddOption("mount", &Opt) - flags.BoolVarP(flagSet, &Opt.DebugFUSE, "debug-fuse", "", Opt.DebugFUSE, "Debug the FUSE internals - needs -v") - flags.DurationVarP(flagSet, &Opt.AttrTimeout, "attr-timeout", "", Opt.AttrTimeout, "Time for which file/directory attributes are cached") - flags.StringArrayVarP(flagSet, &Opt.ExtraOptions, "option", "o", []string{}, "Option for libfuse/WinFsp (repeat if required)") - flags.StringArrayVarP(flagSet, &Opt.ExtraFlags, "fuse-flag", "", []string{}, "Flags or arguments to be passed direct to libfuse/WinFsp (repeat if required)") + flags.BoolVarP(flagSet, &Opt.DebugFUSE, "debug-fuse", "", Opt.DebugFUSE, "Debug the FUSE internals - needs -v", "Mount") + flags.DurationVarP(flagSet, &Opt.AttrTimeout, "attr-timeout", "", Opt.AttrTimeout, "Time for which file/directory attributes are cached", "Mount") + flags.StringArrayVarP(flagSet, &Opt.ExtraOptions, "option", "o", []string{}, "Option for libfuse/WinFsp (repeat if required)", "Mount") + flags.StringArrayVarP(flagSet, &Opt.ExtraFlags, "fuse-flag", "", []string{}, "Flags or arguments to be passed direct to libfuse/WinFsp (repeat if required)", "Mount") // Non-Windows only - flags.BoolVarP(flagSet, &Opt.Daemon, "daemon", "", Opt.Daemon, "Run mount in background and exit parent process (as background output is suppressed, use --log-file with --log-format=pid,... to monitor) (not supported on Windows)") - flags.DurationVarP(flagSet, &Opt.DaemonTimeout, "daemon-timeout", "", Opt.DaemonTimeout, "Time limit for rclone to respond to kernel (not supported on Windows)") - flags.BoolVarP(flagSet, &Opt.DefaultPermissions, "default-permissions", "", Opt.DefaultPermissions, "Makes kernel enforce access control based on the file mode (not supported on Windows)") - flags.BoolVarP(flagSet, &Opt.AllowNonEmpty, "allow-non-empty", "", Opt.AllowNonEmpty, "Allow mounting over a non-empty directory (not supported on Windows)") - flags.BoolVarP(flagSet, &Opt.AllowRoot, "allow-root", "", Opt.AllowRoot, "Allow access to root user (not supported on Windows)") - flags.BoolVarP(flagSet, &Opt.AllowOther, "allow-other", "", Opt.AllowOther, "Allow access to other users (not supported on Windows)") - flags.BoolVarP(flagSet, &Opt.AsyncRead, "async-read", "", Opt.AsyncRead, "Use asynchronous reads (not supported on Windows)") - flags.FVarP(flagSet, &Opt.MaxReadAhead, "max-read-ahead", "", "The number of bytes that can be prefetched for sequential reads (not supported on Windows)") - flags.BoolVarP(flagSet, &Opt.WritebackCache, "write-back-cache", "", Opt.WritebackCache, "Makes kernel buffer writes before sending them to rclone (without this, writethrough caching is used) (not supported on Windows)") - flags.StringVarP(flagSet, &Opt.DeviceName, "devname", "", Opt.DeviceName, "Set the device name - default is remote:path") - flags.FVarP(flagSet, &Opt.CaseInsensitive, "mount-case-insensitive", "", "Tell the OS the mount is case insensitive (true) or sensitive (false) regardless of the backend (auto)") + flags.BoolVarP(flagSet, &Opt.Daemon, "daemon", "", Opt.Daemon, "Run mount in background and exit parent process (as background output is suppressed, use --log-file with --log-format=pid,... to monitor) (not supported on Windows)", "Mount") + flags.DurationVarP(flagSet, &Opt.DaemonTimeout, "daemon-timeout", "", Opt.DaemonTimeout, "Time limit for rclone to respond to kernel (not supported on Windows)", "Mount") + flags.BoolVarP(flagSet, &Opt.DefaultPermissions, "default-permissions", "", Opt.DefaultPermissions, "Makes kernel enforce access control based on the file mode (not supported on Windows)", "Mount") + flags.BoolVarP(flagSet, &Opt.AllowNonEmpty, "allow-non-empty", "", Opt.AllowNonEmpty, "Allow mounting over a non-empty directory (not supported on Windows)", "Mount") + flags.BoolVarP(flagSet, &Opt.AllowRoot, "allow-root", "", Opt.AllowRoot, "Allow access to root user (not supported on Windows)", "Mount") + flags.BoolVarP(flagSet, &Opt.AllowOther, "allow-other", "", Opt.AllowOther, "Allow access to other users (not supported on Windows)", "Mount") + flags.BoolVarP(flagSet, &Opt.AsyncRead, "async-read", "", Opt.AsyncRead, "Use asynchronous reads (not supported on Windows)", "Mount") + flags.FVarP(flagSet, &Opt.MaxReadAhead, "max-read-ahead", "", "The number of bytes that can be prefetched for sequential reads (not supported on Windows)", "Mount") + flags.BoolVarP(flagSet, &Opt.WritebackCache, "write-back-cache", "", Opt.WritebackCache, "Makes kernel buffer writes before sending them to rclone (without this, writethrough caching is used) (not supported on Windows)", "Mount") + flags.StringVarP(flagSet, &Opt.DeviceName, "devname", "", Opt.DeviceName, "Set the device name - default is remote:path", "Mount") + flags.FVarP(flagSet, &Opt.CaseInsensitive, "mount-case-insensitive", "", "Tell the OS the mount is case insensitive (true) or sensitive (false) regardless of the backend (auto)", "Mount") // Windows and OSX - flags.StringVarP(flagSet, &Opt.VolumeName, "volname", "", Opt.VolumeName, "Set the volume name (supported on Windows and OSX only)") + flags.StringVarP(flagSet, &Opt.VolumeName, "volname", "", Opt.VolumeName, "Set the volume name (supported on Windows and OSX only)", "Mount") // OSX only - flags.BoolVarP(flagSet, &Opt.NoAppleDouble, "noappledouble", "", Opt.NoAppleDouble, "Ignore Apple Double (._) and .DS_Store files (supported on OSX only)") - flags.BoolVarP(flagSet, &Opt.NoAppleXattr, "noapplexattr", "", Opt.NoAppleXattr, "Ignore all \"com.apple.*\" extended attributes (supported on OSX only)") + flags.BoolVarP(flagSet, &Opt.NoAppleDouble, "noappledouble", "", Opt.NoAppleDouble, "Ignore Apple Double (._) and .DS_Store files (supported on OSX only)", "Mount") + flags.BoolVarP(flagSet, &Opt.NoAppleXattr, "noapplexattr", "", Opt.NoAppleXattr, "Ignore all \"com.apple.*\" extended attributes (supported on OSX only)", "Mount") // Windows only - flags.BoolVarP(flagSet, &Opt.NetworkMode, "network-mode", "", Opt.NetworkMode, "Mount as remote network drive, instead of fixed disk drive (supported on Windows only)") + flags.BoolVarP(flagSet, &Opt.NetworkMode, "network-mode", "", Opt.NetworkMode, "Mount as remote network drive, instead of fixed disk drive (supported on Windows only)", "Mount") // Unix only - flags.DurationVarP(flagSet, &Opt.DaemonWait, "daemon-wait", "", Opt.DaemonWait, "Time to wait for ready mount from daemon (maximum time on Linux, constant sleep time on OSX/BSD) (not supported on Windows)") + flags.DurationVarP(flagSet, &Opt.DaemonWait, "daemon-wait", "", Opt.DaemonWait, "Time to wait for ready mount from daemon (maximum time on Linux, constant sleep time on OSX/BSD) (not supported on Windows)", "Mount") } // NewMountCommand makes a mount command with the given name and Mount function @@ -161,6 +161,7 @@ func NewMountCommand(commandName string, hidden bool, mount MountFn) *cobra.Comm Long: strings.ReplaceAll(strings.ReplaceAll(mountHelp, "|", "`"), "@", commandName) + vfs.Help, Annotations: map[string]string{ "versionIntroduced": "v1.33", + "groups": "Filter", }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(2, 2, command, args) diff --git a/cmd/move/move.go b/cmd/move/move.go index fd1004db1..ae7260430 100644 --- a/cmd/move/move.go +++ b/cmd/move/move.go @@ -21,8 +21,8 @@ var ( func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.BoolVarP(cmdFlags, &deleteEmptySrcDirs, "delete-empty-src-dirs", "", deleteEmptySrcDirs, "Delete empty source dirs after move") - flags.BoolVarP(cmdFlags, &createEmptySrcDirs, "create-empty-src-dirs", "", createEmptySrcDirs, "Create empty source dirs on destination after move") + flags.BoolVarP(cmdFlags, &deleteEmptySrcDirs, "delete-empty-src-dirs", "", deleteEmptySrcDirs, "Delete empty source dirs after move", "") + flags.BoolVarP(cmdFlags, &createEmptySrcDirs, "create-empty-src-dirs", "", createEmptySrcDirs, "Create empty source dirs on destination after move", "") } var commandDefinition = &cobra.Command{ @@ -62,6 +62,7 @@ can speed transfers up greatly. `, "|", "`"), Annotations: map[string]string{ "versionIntroduced": "v1.19", + "groups": "Filter,Listing,Important,Copy", }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(2, 2, command, args) diff --git a/cmd/moveto/moveto.go b/cmd/moveto/moveto.go index f007fb182..68b354d55 100644 --- a/cmd/moveto/moveto.go +++ b/cmd/moveto/moveto.go @@ -51,6 +51,7 @@ successful transfer. `, Annotations: map[string]string{ "versionIntroduced": "v1.35", + "groups": "Filter,Listing,Important,Copy", }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(2, 2, command, args) diff --git a/cmd/ncdu/ncdu.go b/cmd/ncdu/ncdu.go index d76b5f47f..9cbc388a7 100644 --- a/cmd/ncdu/ncdu.go +++ b/cmd/ncdu/ncdu.go @@ -77,6 +77,7 @@ the remote you can also use the [size](/commands/rclone_size/) command. `, Annotations: map[string]string{ "versionIntroduced": "v1.37", + "groups": "Filter,Listing", }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(1, 1, command, args) diff --git a/cmd/purge/purge.go b/cmd/purge/purge.go index d41e22cf6..a8ddb3a6c 100644 --- a/cmd/purge/purge.go +++ b/cmd/purge/purge.go @@ -26,6 +26,9 @@ delete files. To delete empty directories only, use command **Important**: Since this can cause data loss, test first with the ` + "`--dry-run` or the `--interactive`/`-i`" + ` flag. `, + Annotations: map[string]string{ + "groups": "Important", + }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(1, 1, command, args) fdst := cmd.NewFsDir(args) diff --git a/cmd/rc/rc.go b/cmd/rc/rc.go index 1276fc024..49c314474 100644 --- a/cmd/rc/rc.go +++ b/cmd/rc/rc.go @@ -36,14 +36,14 @@ var ( func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.BoolVarP(cmdFlags, &noOutput, "no-output", "", noOutput, "If set, don't output the JSON result") - flags.StringVarP(cmdFlags, &url, "url", "", url, "URL to connect to rclone remote control") - flags.StringVarP(cmdFlags, &jsonInput, "json", "", jsonInput, "Input JSON - use instead of key=value args") - flags.StringVarP(cmdFlags, &authUser, "user", "", "", "Username to use to rclone remote control") - flags.StringVarP(cmdFlags, &authPass, "pass", "", "", "Password to use to connect to rclone remote control") - flags.BoolVarP(cmdFlags, &loopback, "loopback", "", false, "If set connect to this rclone instance not via HTTP") - flags.StringArrayVarP(cmdFlags, &options, "opt", "o", options, "Option in the form name=value or name placed in the \"opt\" array") - flags.StringArrayVarP(cmdFlags, &arguments, "arg", "a", arguments, "Argument placed in the \"arg\" array") + flags.BoolVarP(cmdFlags, &noOutput, "no-output", "", noOutput, "If set, don't output the JSON result", "") + flags.StringVarP(cmdFlags, &url, "url", "", url, "URL to connect to rclone remote control", "") + flags.StringVarP(cmdFlags, &jsonInput, "json", "", jsonInput, "Input JSON - use instead of key=value args", "") + flags.StringVarP(cmdFlags, &authUser, "user", "", "", "Username to use to rclone remote control", "") + flags.StringVarP(cmdFlags, &authPass, "pass", "", "", "Password to use to connect to rclone remote control", "") + flags.BoolVarP(cmdFlags, &loopback, "loopback", "", false, "If set connect to this rclone instance not via HTTP", "") + flags.StringArrayVarP(cmdFlags, &options, "opt", "o", options, "Option in the form name=value or name placed in the \"opt\" array", "") + flags.StringArrayVarP(cmdFlags, &arguments, "arg", "a", arguments, "Argument placed in the \"arg\" array", "") } var commandDefinition = &cobra.Command{ diff --git a/cmd/rcat/rcat.go b/cmd/rcat/rcat.go index 035fed206..e352c6a1c 100644 --- a/cmd/rcat/rcat.go +++ b/cmd/rcat/rcat.go @@ -20,7 +20,7 @@ var ( func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.Int64VarP(cmdFlags, &size, "size", "", size, "File size hint to preallocate") + flags.Int64VarP(cmdFlags, &size, "size", "", size, "File size hint to preallocate", "") } var commandDefinition = &cobra.Command{ @@ -59,6 +59,7 @@ off caching it locally and then ` + "`rclone move`" + ` it to the destination which can use retries.`, Annotations: map[string]string{ "versionIntroduced": "v1.38", + "groups": "Important", }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(1, 1, command, args) diff --git a/cmd/rcd/rcd.go b/cmd/rcd/rcd.go index 8e90240d1..7565bbe11 100644 --- a/cmd/rcd/rcd.go +++ b/cmd/rcd/rcd.go @@ -35,6 +35,7 @@ See the [rc documentation](/rc/) for more info on the rc flags. ` + libhttp.Help(rcflags.FlagPrefix) + libhttp.TemplateHelp(rcflags.FlagPrefix) + libhttp.AuthHelp(rcflags.FlagPrefix), Annotations: map[string]string{ "versionIntroduced": "v1.45", + "groups": "RC", }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(0, 1, command, args) diff --git a/cmd/rmdir/rmdir.go b/cmd/rmdir/rmdir.go index 778315be8..00f770366 100644 --- a/cmd/rmdir/rmdir.go +++ b/cmd/rmdir/rmdir.go @@ -24,6 +24,9 @@ with option ` + "`--rmdirs`" + `) to do that. To delete a path and any objects in it, use [purge](/commands/rclone_purge/) command. `, + Annotations: map[string]string{ + "groups": "Important", + }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(1, 1, command, args) fdst := cmd.NewFsDir(args) diff --git a/cmd/rmdirs/rmdirs.go b/cmd/rmdirs/rmdirs.go index 62711dea4..b87e0f091 100644 --- a/cmd/rmdirs/rmdirs.go +++ b/cmd/rmdirs/rmdirs.go @@ -40,6 +40,7 @@ command. `, Annotations: map[string]string{ "versionIntroduced": "v1.35", + "groups": "Important", }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(1, 1, command, args) diff --git a/cmd/selfupdate/selfupdate.go b/cmd/selfupdate/selfupdate.go index 6da348050..307de1553 100644 --- a/cmd/selfupdate/selfupdate.go +++ b/cmd/selfupdate/selfupdate.go @@ -51,12 +51,12 @@ var Opt = Options{} func init() { cmd.Root.AddCommand(cmdSelfUpdate) cmdFlags := cmdSelfUpdate.Flags() - flags.BoolVarP(cmdFlags, &Opt.Check, "check", "", Opt.Check, "Check for latest release, do not download") - flags.StringVarP(cmdFlags, &Opt.Output, "output", "", Opt.Output, "Save the downloaded binary at a given path (default: replace running binary)") - flags.BoolVarP(cmdFlags, &Opt.Stable, "stable", "", Opt.Stable, "Install stable release (this is the default)") - flags.BoolVarP(cmdFlags, &Opt.Beta, "beta", "", Opt.Beta, "Install beta release") - flags.StringVarP(cmdFlags, &Opt.Version, "version", "", Opt.Version, "Install the given rclone version (default: latest)") - flags.StringVarP(cmdFlags, &Opt.Package, "package", "", Opt.Package, "Package format: zip|deb|rpm (default: zip)") + flags.BoolVarP(cmdFlags, &Opt.Check, "check", "", Opt.Check, "Check for latest release, do not download", "") + flags.StringVarP(cmdFlags, &Opt.Output, "output", "", Opt.Output, "Save the downloaded binary at a given path (default: replace running binary)", "") + flags.BoolVarP(cmdFlags, &Opt.Stable, "stable", "", Opt.Stable, "Install stable release (this is the default)", "") + flags.BoolVarP(cmdFlags, &Opt.Beta, "beta", "", Opt.Beta, "Install beta release", "") + flags.StringVarP(cmdFlags, &Opt.Version, "version", "", Opt.Version, "Install the given rclone version (default: latest)", "") + flags.StringVarP(cmdFlags, &Opt.Package, "package", "", Opt.Package, "Package format: zip|deb|rpm (default: zip)", "") } var cmdSelfUpdate = &cobra.Command{ diff --git a/cmd/serve/dlna/dlna.go b/cmd/serve/dlna/dlna.go index 934316635..7ee70c819 100644 --- a/cmd/serve/dlna/dlna.go +++ b/cmd/serve/dlna/dlna.go @@ -50,6 +50,7 @@ files that they are not able to play back correctly. ` + dlnaflags.Help + vfs.Help, Annotations: map[string]string{ "versionIntroduced": "v1.46", + "groups": "Filter", }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(1, 1, command, args) diff --git a/cmd/serve/dlna/dlnaflags/dlnaflags.go b/cmd/serve/dlna/dlnaflags/dlnaflags.go index 10745474c..8b2f39304 100644 --- a/cmd/serve/dlna/dlnaflags/dlnaflags.go +++ b/cmd/serve/dlna/dlnaflags/dlnaflags.go @@ -49,11 +49,11 @@ var ( func addFlagsPrefix(flagSet *pflag.FlagSet, prefix string, Opt *Options) { rc.AddOption("dlna", &Opt) - flags.StringVarP(flagSet, &Opt.ListenAddr, prefix+"addr", "", Opt.ListenAddr, "The ip:port or :port to bind the DLNA http server to") - flags.StringVarP(flagSet, &Opt.FriendlyName, prefix+"name", "", Opt.FriendlyName, "Name of DLNA server") - flags.BoolVarP(flagSet, &Opt.LogTrace, prefix+"log-trace", "", Opt.LogTrace, "Enable trace logging of SOAP traffic") - flags.StringArrayVarP(flagSet, &Opt.InterfaceNames, prefix+"interface", "", Opt.InterfaceNames, "The interface to use for SSDP (repeat as necessary)") - flags.DurationVarP(flagSet, &Opt.AnnounceInterval, prefix+"announce-interval", "", Opt.AnnounceInterval, "The interval between SSDP announcements") + flags.StringVarP(flagSet, &Opt.ListenAddr, prefix+"addr", "", Opt.ListenAddr, "The ip:port or :port to bind the DLNA http server to", prefix) + flags.StringVarP(flagSet, &Opt.FriendlyName, prefix+"name", "", Opt.FriendlyName, "Name of DLNA server", prefix) + flags.BoolVarP(flagSet, &Opt.LogTrace, prefix+"log-trace", "", Opt.LogTrace, "Enable trace logging of SOAP traffic", prefix) + flags.StringArrayVarP(flagSet, &Opt.InterfaceNames, prefix+"interface", "", Opt.InterfaceNames, "The interface to use for SSDP (repeat as necessary)", prefix) + flags.DurationVarP(flagSet, &Opt.AnnounceInterval, prefix+"announce-interval", "", Opt.AnnounceInterval, "The interval between SSDP announcements", prefix) } // AddFlags add the command line flags for DLNA serving. diff --git a/cmd/serve/docker/docker.go b/cmd/serve/docker/docker.go index d16055865..85241c97b 100644 --- a/cmd/serve/docker/docker.go +++ b/cmd/serve/docker/docker.go @@ -33,11 +33,11 @@ var ( func init() { cmdFlags := Command.Flags() // Add command specific flags - flags.StringVarP(cmdFlags, &baseDir, "base-dir", "", baseDir, "Base directory for volumes") - flags.StringVarP(cmdFlags, &socketAddr, "socket-addr", "", socketAddr, "Address or absolute path (default: /run/docker/plugins/rclone.sock)") - flags.IntVarP(cmdFlags, &socketGid, "socket-gid", "", socketGid, "GID for unix socket (default: current process GID)") - flags.BoolVarP(cmdFlags, &forgetState, "forget-state", "", forgetState, "Skip restoring previous state") - flags.BoolVarP(cmdFlags, &noSpec, "no-spec", "", noSpec, "Do not write spec file") + flags.StringVarP(cmdFlags, &baseDir, "base-dir", "", baseDir, "Base directory for volumes", "") + flags.StringVarP(cmdFlags, &socketAddr, "socket-addr", "", socketAddr, "Address or absolute path (default: /run/docker/plugins/rclone.sock)", "") + flags.IntVarP(cmdFlags, &socketGid, "socket-gid", "", socketGid, "GID for unix socket (default: current process GID)", "") + flags.BoolVarP(cmdFlags, &forgetState, "forget-state", "", forgetState, "Skip restoring previous state", "") + flags.BoolVarP(cmdFlags, &noSpec, "no-spec", "", noSpec, "Do not write spec file", "") // Add common mount/vfs flags mountlib.AddFlags(cmdFlags) vfsflags.AddFlags(cmdFlags) @@ -50,6 +50,7 @@ var Command = &cobra.Command{ Long: strings.ReplaceAll(longHelp, "|", "`") + vfs.Help, Annotations: map[string]string{ "versionIntroduced": "v1.56", + "groups": "Filter", }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(0, 0, command, args) diff --git a/cmd/serve/ftp/ftp.go b/cmd/serve/ftp/ftp.go index 7e5423132..0406206ae 100644 --- a/cmd/serve/ftp/ftp.go +++ b/cmd/serve/ftp/ftp.go @@ -59,13 +59,13 @@ var Opt = DefaultOpt // AddFlags adds flags for ftp func AddFlags(flagSet *pflag.FlagSet) { rc.AddOption("ftp", &Opt) - flags.StringVarP(flagSet, &Opt.ListenAddr, "addr", "", Opt.ListenAddr, "IPaddress:Port or :Port to bind server to") - flags.StringVarP(flagSet, &Opt.PublicIP, "public-ip", "", Opt.PublicIP, "Public IP address to advertise for passive connections") - flags.StringVarP(flagSet, &Opt.PassivePorts, "passive-port", "", Opt.PassivePorts, "Passive port range to use") - flags.StringVarP(flagSet, &Opt.BasicUser, "user", "", Opt.BasicUser, "User name for authentication") - flags.StringVarP(flagSet, &Opt.BasicPass, "pass", "", Opt.BasicPass, "Password for authentication (empty value allow every password)") - flags.StringVarP(flagSet, &Opt.TLSCert, "cert", "", Opt.TLSCert, "TLS PEM key (concatenation of certificate and CA certificate)") - flags.StringVarP(flagSet, &Opt.TLSKey, "key", "", Opt.TLSKey, "TLS PEM Private key") + flags.StringVarP(flagSet, &Opt.ListenAddr, "addr", "", Opt.ListenAddr, "IPaddress:Port or :Port to bind server to", "") + flags.StringVarP(flagSet, &Opt.PublicIP, "public-ip", "", Opt.PublicIP, "Public IP address to advertise for passive connections", "") + flags.StringVarP(flagSet, &Opt.PassivePorts, "passive-port", "", Opt.PassivePorts, "Passive port range to use", "") + flags.StringVarP(flagSet, &Opt.BasicUser, "user", "", Opt.BasicUser, "User name for authentication", "") + flags.StringVarP(flagSet, &Opt.BasicPass, "pass", "", Opt.BasicPass, "Password for authentication (empty value allow every password)", "") + flags.StringVarP(flagSet, &Opt.TLSCert, "cert", "", Opt.TLSCert, "TLS PEM key (concatenation of certificate and CA certificate)", "") + flags.StringVarP(flagSet, &Opt.TLSKey, "key", "", Opt.TLSKey, "TLS PEM Private key", "") } func init() { @@ -101,6 +101,7 @@ You can set a single username and password with the --user and --pass flags. ` + vfs.Help + proxy.Help, Annotations: map[string]string{ "versionIntroduced": "v1.44", + "groups": "Filter", }, Run: func(command *cobra.Command, args []string) { var f fs.Fs diff --git a/cmd/serve/http/http.go b/cmd/serve/http/http.go index 6dc728fd5..bbcf6f448 100644 --- a/cmd/serve/http/http.go +++ b/cmd/serve/http/http.go @@ -75,6 +75,7 @@ control the stats printing. ` + libhttp.Help(flagPrefix) + libhttp.TemplateHelp(flagPrefix) + libhttp.AuthHelp(flagPrefix) + vfs.Help + proxy.Help, Annotations: map[string]string{ "versionIntroduced": "v1.39", + "groups": "Filter", }, Run: func(command *cobra.Command, args []string) { var f fs.Fs diff --git a/cmd/serve/proxy/proxyflags/proxyflags.go b/cmd/serve/proxy/proxyflags/proxyflags.go index 043cc6e44..33fa5512d 100644 --- a/cmd/serve/proxy/proxyflags/proxyflags.go +++ b/cmd/serve/proxy/proxyflags/proxyflags.go @@ -14,5 +14,5 @@ var ( // AddFlags adds the non filing system specific flags to the command func AddFlags(flagSet *pflag.FlagSet) { - flags.StringVarP(flagSet, &Opt.AuthProxy, "auth-proxy", "", Opt.AuthProxy, "A program to use to create the backend from the auth") + flags.StringVarP(flagSet, &Opt.AuthProxy, "auth-proxy", "", Opt.AuthProxy, "A program to use to create the backend from the auth", "") } diff --git a/cmd/serve/restic/restic.go b/cmd/serve/restic/restic.go index 5ad1b1675..de06de0ac 100644 --- a/cmd/serve/restic/restic.go +++ b/cmd/serve/restic/restic.go @@ -57,10 +57,10 @@ func init() { flagSet := Command.Flags() libhttp.AddAuthFlagsPrefix(flagSet, flagPrefix, &Opt.Auth) libhttp.AddHTTPFlagsPrefix(flagSet, flagPrefix, &Opt.HTTP) - flags.BoolVarP(flagSet, &Opt.Stdio, "stdio", "", false, "Run an HTTP2 server on stdin/stdout") - flags.BoolVarP(flagSet, &Opt.AppendOnly, "append-only", "", false, "Disallow deletion of repository data") - flags.BoolVarP(flagSet, &Opt.PrivateRepos, "private-repos", "", false, "Users can only access their private repo") - flags.BoolVarP(flagSet, &Opt.CacheObjects, "cache-objects", "", true, "Cache listed objects") + flags.BoolVarP(flagSet, &Opt.Stdio, "stdio", "", false, "Run an HTTP2 server on stdin/stdout", "") + flags.BoolVarP(flagSet, &Opt.AppendOnly, "append-only", "", false, "Disallow deletion of repository data", "") + flags.BoolVarP(flagSet, &Opt.PrivateRepos, "private-repos", "", false, "Users can only access their private repo", "") + flags.BoolVarP(flagSet, &Opt.CacheObjects, "cache-objects", "", true, "Cache listed objects", "") } // Command definition for cobra diff --git a/cmd/serve/sftp/sftp.go b/cmd/serve/sftp/sftp.go index ce0c235c7..10986b5ae 100644 --- a/cmd/serve/sftp/sftp.go +++ b/cmd/serve/sftp/sftp.go @@ -42,13 +42,13 @@ var Opt = DefaultOpt // AddFlags adds flags for the sftp func AddFlags(flagSet *pflag.FlagSet, Opt *Options) { rc.AddOption("sftp", &Opt) - flags.StringVarP(flagSet, &Opt.ListenAddr, "addr", "", Opt.ListenAddr, "IPaddress:Port or :Port to bind server to") - flags.StringArrayVarP(flagSet, &Opt.HostKeys, "key", "", Opt.HostKeys, "SSH private host key file (Can be multi-valued, leave blank to auto generate)") - flags.StringVarP(flagSet, &Opt.AuthorizedKeys, "authorized-keys", "", Opt.AuthorizedKeys, "Authorized keys file") - flags.StringVarP(flagSet, &Opt.User, "user", "", Opt.User, "User name for authentication") - flags.StringVarP(flagSet, &Opt.Pass, "pass", "", Opt.Pass, "Password for authentication") - flags.BoolVarP(flagSet, &Opt.NoAuth, "no-auth", "", Opt.NoAuth, "Allow connections with no authentication if set") - flags.BoolVarP(flagSet, &Opt.Stdio, "stdio", "", Opt.Stdio, "Run an sftp server on stdin/stdout") + flags.StringVarP(flagSet, &Opt.ListenAddr, "addr", "", Opt.ListenAddr, "IPaddress:Port or :Port to bind server to", "") + flags.StringArrayVarP(flagSet, &Opt.HostKeys, "key", "", Opt.HostKeys, "SSH private host key file (Can be multi-valued, leave blank to auto generate)", "") + flags.StringVarP(flagSet, &Opt.AuthorizedKeys, "authorized-keys", "", Opt.AuthorizedKeys, "Authorized keys file", "") + flags.StringVarP(flagSet, &Opt.User, "user", "", Opt.User, "User name for authentication", "") + flags.StringVarP(flagSet, &Opt.Pass, "pass", "", Opt.Pass, "Password for authentication", "") + flags.BoolVarP(flagSet, &Opt.NoAuth, "no-auth", "", Opt.NoAuth, "Allow connections with no authentication if set", "") + flags.BoolVarP(flagSet, &Opt.Stdio, "stdio", "", Opt.Stdio, "Run an sftp server on stdin/stdout", "") } func init() { @@ -116,6 +116,7 @@ provided by OpenSSH in this case. ` + vfs.Help + proxy.Help, Annotations: map[string]string{ "versionIntroduced": "v1.48", + "groups": "Filter", }, Run: func(command *cobra.Command, args []string) { var f fs.Fs diff --git a/cmd/serve/webdav/webdav.go b/cmd/serve/webdav/webdav.go index ae8c4f2d1..9340bb3d4 100644 --- a/cmd/serve/webdav/webdav.go +++ b/cmd/serve/webdav/webdav.go @@ -63,8 +63,8 @@ func init() { libhttp.AddTemplateFlagsPrefix(flagSet, "", &Opt.Template) vfsflags.AddFlags(flagSet) proxyflags.AddFlags(flagSet) - flags.StringVarP(flagSet, &Opt.HashName, "etag-hash", "", "", "Which hash to use for the ETag, or auto or blank for off") - flags.BoolVarP(flagSet, &Opt.DisableGETDir, "disable-dir-list", "", false, "Disable HTML directory list on GET request for a directory") + flags.StringVarP(flagSet, &Opt.HashName, "etag-hash", "", "", "Which hash to use for the ETag, or auto or blank for off", "") + flags.BoolVarP(flagSet, &Opt.DisableGETDir, "disable-dir-list", "", false, "Disable HTML directory list on GET request for a directory", "") } // Command definition for cobra @@ -114,6 +114,7 @@ https://learn.microsoft.com/en-us/office/troubleshoot/powerpoint/office-opens-bl ` + libhttp.Help(flagPrefix) + libhttp.TemplateHelp(flagPrefix) + libhttp.AuthHelp(flagPrefix) + vfs.Help + proxy.Help, Annotations: map[string]string{ "versionIntroduced": "v1.39", + "groups": "Filter", }, RunE: func(command *cobra.Command, args []string) error { var f fs.Fs diff --git a/cmd/sha1sum/sha1sum.go b/cmd/sha1sum/sha1sum.go index 483832ec2..6c70367a3 100644 --- a/cmd/sha1sum/sha1sum.go +++ b/cmd/sha1sum/sha1sum.go @@ -43,6 +43,7 @@ a remote:path. `, Annotations: map[string]string{ "versionIntroduced": "v1.27", + "groups": "Filter,Listing", }, RunE: func(command *cobra.Command, args []string) error { cmd.CheckArgs(0, 1, command, args) diff --git a/cmd/size/size.go b/cmd/size/size.go index 924d5d91e..3be067e69 100644 --- a/cmd/size/size.go +++ b/cmd/size/size.go @@ -19,7 +19,7 @@ var jsonOutput bool func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.BoolVarP(cmdFlags, &jsonOutput, "json", "", false, "Format output as JSON") + flags.BoolVarP(cmdFlags, &jsonOutput, "json", "", false, "Format output as JSON", "") } var commandDefinition = &cobra.Command{ @@ -46,6 +46,7 @@ of the size command. `, Annotations: map[string]string{ "versionIntroduced": "v1.23", + "groups": "Filter,Listing", }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(1, 1, command, args) diff --git a/cmd/sync/sync.go b/cmd/sync/sync.go index 25c3746be..da9184f30 100644 --- a/cmd/sync/sync.go +++ b/cmd/sync/sync.go @@ -18,7 +18,7 @@ var ( func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.BoolVarP(cmdFlags, &createEmptySrcDirs, "create-empty-src-dirs", "", createEmptySrcDirs, "Create empty source dirs on destination after sync") + flags.BoolVarP(cmdFlags, &createEmptySrcDirs, "create-empty-src-dirs", "", createEmptySrcDirs, "Create empty source dirs on destination after sync", "") } var commandDefinition = &cobra.Command{ @@ -60,6 +60,9 @@ destination that is inside the source directory. **Note**: Use the ` + "`rclone dedupe`" + ` command to deal with "Duplicate object/directory found in source/destination - ignoring" errors. See [this forum post](https://forum.rclone.org/t/sync-not-clearing-duplicates/14372) for more info. `, + Annotations: map[string]string{ + "groups": "Sync,Copy,Filter,Listing,Important", + }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(2, 2, command, args) fsrc, srcFileName, fdst := cmd.NewFsSrcFileDst(args) diff --git a/cmd/test/changenotify/changenotify.go b/cmd/test/changenotify/changenotify.go index 6b88e5f11..27d17ba30 100644 --- a/cmd/test/changenotify/changenotify.go +++ b/cmd/test/changenotify/changenotify.go @@ -20,7 +20,7 @@ var ( func init() { test.Command.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.DurationVarP(cmdFlags, &pollInterval, "poll-interval", "", pollInterval, "Time to wait between polling for changes") + flags.DurationVarP(cmdFlags, &pollInterval, "poll-interval", "", pollInterval, "Time to wait between polling for changes", "") } var commandDefinition = &cobra.Command{ diff --git a/cmd/test/info/info.go b/cmd/test/info/info.go index 899bb24c4..8c9da0990 100644 --- a/cmd/test/info/info.go +++ b/cmd/test/info/info.go @@ -47,13 +47,13 @@ var ( func init() { test.Command.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.StringVarP(cmdFlags, &writeJSON, "write-json", "", "", "Write results to file") - flags.BoolVarP(cmdFlags, &checkNormalization, "check-normalization", "", false, "Check UTF-8 Normalization") - flags.BoolVarP(cmdFlags, &checkControl, "check-control", "", false, "Check control characters") - flags.DurationVarP(cmdFlags, &uploadWait, "upload-wait", "", 0, "Wait after writing a file") - flags.BoolVarP(cmdFlags, &checkLength, "check-length", "", false, "Check max filename length") - flags.BoolVarP(cmdFlags, &checkStreaming, "check-streaming", "", false, "Check uploads with indeterminate file size") - flags.BoolVarP(cmdFlags, &all, "all", "", false, "Run all tests") + flags.StringVarP(cmdFlags, &writeJSON, "write-json", "", "", "Write results to file", "") + flags.BoolVarP(cmdFlags, &checkNormalization, "check-normalization", "", false, "Check UTF-8 Normalization", "") + flags.BoolVarP(cmdFlags, &checkControl, "check-control", "", false, "Check control characters", "") + flags.DurationVarP(cmdFlags, &uploadWait, "upload-wait", "", 0, "Wait after writing a file", "") + flags.BoolVarP(cmdFlags, &checkLength, "check-length", "", false, "Check max filename length", "") + flags.BoolVarP(cmdFlags, &checkStreaming, "check-streaming", "", false, "Check uploads with indeterminate file size", "") + flags.BoolVarP(cmdFlags, &all, "all", "", false, "Run all tests", "") } var commandDefinition = &cobra.Command{ diff --git a/cmd/test/makefiles/makefiles.go b/cmd/test/makefiles/makefiles.go index 7b0ac57a8..4b9f8227c 100644 --- a/cmd/test/makefiles/makefiles.go +++ b/cmd/test/makefiles/makefiles.go @@ -49,25 +49,25 @@ var ( func init() { test.Command.AddCommand(makefilesCmd) makefilesFlags := makefilesCmd.Flags() - flags.IntVarP(makefilesFlags, &numberOfFiles, "files", "", numberOfFiles, "Number of files to create") - flags.IntVarP(makefilesFlags, &averageFilesPerDirectory, "files-per-directory", "", averageFilesPerDirectory, "Average number of files per directory") - flags.IntVarP(makefilesFlags, &maxDepth, "max-depth", "", maxDepth, "Maximum depth of directory hierarchy") - flags.FVarP(makefilesFlags, &minFileSize, "min-file-size", "", "Minimum size of file to create") - flags.FVarP(makefilesFlags, &maxFileSize, "max-file-size", "", "Maximum size of files to create") - flags.IntVarP(makefilesFlags, &minFileNameLength, "min-name-length", "", minFileNameLength, "Minimum size of file names") - flags.IntVarP(makefilesFlags, &maxFileNameLength, "max-name-length", "", maxFileNameLength, "Maximum size of file names") + flags.IntVarP(makefilesFlags, &numberOfFiles, "files", "", numberOfFiles, "Number of files to create", "") + flags.IntVarP(makefilesFlags, &averageFilesPerDirectory, "files-per-directory", "", averageFilesPerDirectory, "Average number of files per directory", "") + flags.IntVarP(makefilesFlags, &maxDepth, "max-depth", "", maxDepth, "Maximum depth of directory hierarchy", "") + flags.FVarP(makefilesFlags, &minFileSize, "min-file-size", "", "Minimum size of file to create", "") + flags.FVarP(makefilesFlags, &maxFileSize, "max-file-size", "", "Maximum size of files to create", "") + flags.IntVarP(makefilesFlags, &minFileNameLength, "min-name-length", "", minFileNameLength, "Minimum size of file names", "") + flags.IntVarP(makefilesFlags, &maxFileNameLength, "max-name-length", "", maxFileNameLength, "Maximum size of file names", "") test.Command.AddCommand(makefileCmd) makefileFlags := makefileCmd.Flags() // Common flags to makefiles and makefile for _, f := range []*pflag.FlagSet{makefilesFlags, makefileFlags} { - flags.Int64VarP(f, &seed, "seed", "", seed, "Seed for the random number generator (0 for random)") - flags.BoolVarP(f, &zero, "zero", "", zero, "Fill files with ASCII 0x00") - flags.BoolVarP(f, &sparse, "sparse", "", sparse, "Make the files sparse (appear to be filled with ASCII 0x00)") - flags.BoolVarP(f, &ascii, "ascii", "", ascii, "Fill files with random ASCII printable bytes only") - flags.BoolVarP(f, &pattern, "pattern", "", pattern, "Fill files with a periodic pattern") - flags.BoolVarP(f, &chargen, "chargen", "", chargen, "Fill files with a ASCII chargen pattern") + flags.Int64VarP(f, &seed, "seed", "", seed, "Seed for the random number generator (0 for random)", "") + flags.BoolVarP(f, &zero, "zero", "", zero, "Fill files with ASCII 0x00", "") + flags.BoolVarP(f, &sparse, "sparse", "", sparse, "Make the files sparse (appear to be filled with ASCII 0x00)", "") + flags.BoolVarP(f, &ascii, "ascii", "", ascii, "Fill files with random ASCII printable bytes only", "") + flags.BoolVarP(f, &pattern, "pattern", "", pattern, "Fill files with a periodic pattern", "") + flags.BoolVarP(f, &chargen, "chargen", "", chargen, "Fill files with a ASCII chargen pattern", "") } } diff --git a/cmd/touch/touch.go b/cmd/touch/touch.go index 6b6cdcea9..e86aba555 100644 --- a/cmd/touch/touch.go +++ b/cmd/touch/touch.go @@ -34,10 +34,10 @@ const ( func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.BoolVarP(cmdFlags, ¬CreateNewFile, "no-create", "C", false, "Do not create the file if it does not exist (implied with --recursive)") - flags.StringVarP(cmdFlags, &timeAsArgument, "timestamp", "t", "", "Use specified time instead of the current time of day") - flags.BoolVarP(cmdFlags, &localTime, "localtime", "", false, "Use localtime for timestamp, not UTC") - flags.BoolVarP(cmdFlags, &recursive, "recursive", "R", false, "Recursively touch all files") + flags.BoolVarP(cmdFlags, ¬CreateNewFile, "no-create", "C", false, "Do not create the file if it does not exist (implied with --recursive)", "") + flags.StringVarP(cmdFlags, &timeAsArgument, "timestamp", "t", "", "Use specified time instead of the current time of day", "") + flags.BoolVarP(cmdFlags, &localTime, "localtime", "", false, "Use localtime for timestamp, not UTC", "") + flags.BoolVarP(cmdFlags, &recursive, "recursive", "R", false, "Recursively touch all files", "") } var commandDefinition = &cobra.Command{ @@ -66,6 +66,7 @@ then add the ` + "`--localtime`" + ` flag. `, Annotations: map[string]string{ "versionIntroduced": "v1.39", + "groups": "Filter,Listing,Important", }, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(1, 1, command, args) diff --git a/cmd/tree/tree.go b/cmd/tree/tree.go index 16fb1da37..a0b1dd44d 100644 --- a/cmd/tree/tree.go +++ b/cmd/tree/tree.go @@ -35,35 +35,35 @@ func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() // List - flags.BoolVarP(cmdFlags, &opts.All, "all", "a", false, "All files are listed (list . files too)") - flags.BoolVarP(cmdFlags, &opts.DirsOnly, "dirs-only", "d", false, "List directories only") - flags.BoolVarP(cmdFlags, &opts.FullPath, "full-path", "", false, "Print the full path prefix for each file") - //flags.BoolVarP(cmdFlags, &opts.IgnoreCase, "ignore-case", "", false, "Ignore case when pattern matching") - flags.BoolVarP(cmdFlags, &noReport, "noreport", "", false, "Turn off file/directory count at end of tree listing") - // flags.BoolVarP(cmdFlags, &opts.FollowLink, "follow", "l", false, "Follow symbolic links like directories") - flags.IntVarP(cmdFlags, &opts.DeepLevel, "level", "", 0, "Descend only level directories deep") + flags.BoolVarP(cmdFlags, &opts.All, "all", "a", false, "All files are listed (list . files too)", "") + flags.BoolVarP(cmdFlags, &opts.DirsOnly, "dirs-only", "d", false, "List directories only", "") + flags.BoolVarP(cmdFlags, &opts.FullPath, "full-path", "", false, "Print the full path prefix for each file", "") + //flags.BoolVarP(cmdFlags, &opts.IgnoreCase, "ignore-case", "", false, "Ignore case when pattern matching", "") + flags.BoolVarP(cmdFlags, &noReport, "noreport", "", false, "Turn off file/directory count at end of tree listing", "") + // flags.BoolVarP(cmdFlags, &opts.FollowLink, "follow", "l", false, "Follow symbolic links like directories","") + flags.IntVarP(cmdFlags, &opts.DeepLevel, "level", "", 0, "Descend only level directories deep", "") // flags.StringVarP(cmdFlags, &opts.Pattern, "pattern", "P", "", "List only those files that match the pattern given") // flags.StringVarP(cmdFlags, &opts.IPattern, "exclude", "", "", "Do not list files that match the given pattern") - flags.StringVarP(cmdFlags, &outFileName, "output", "o", "", "Output to file instead of stdout") + flags.StringVarP(cmdFlags, &outFileName, "output", "o", "", "Output to file instead of stdout", "") // Files - flags.BoolVarP(cmdFlags, &opts.ByteSize, "size", "s", false, "Print the size in bytes of each file.") - flags.BoolVarP(cmdFlags, &opts.FileMode, "protections", "p", false, "Print the protections for each file.") + flags.BoolVarP(cmdFlags, &opts.ByteSize, "size", "s", false, "Print the size in bytes of each file.", "") + flags.BoolVarP(cmdFlags, &opts.FileMode, "protections", "p", false, "Print the protections for each file.", "") // flags.BoolVarP(cmdFlags, &opts.ShowUid, "uid", "", false, "Displays file owner or UID number.") // flags.BoolVarP(cmdFlags, &opts.ShowGid, "gid", "", false, "Displays file group owner or GID number.") - flags.BoolVarP(cmdFlags, &opts.Quotes, "quote", "Q", false, "Quote filenames with double quotes.") - flags.BoolVarP(cmdFlags, &opts.LastMod, "modtime", "D", false, "Print the date of last modification.") + flags.BoolVarP(cmdFlags, &opts.Quotes, "quote", "Q", false, "Quote filenames with double quotes.", "") + flags.BoolVarP(cmdFlags, &opts.LastMod, "modtime", "D", false, "Print the date of last modification.", "") // flags.BoolVarP(cmdFlags, &opts.Inodes, "inodes", "", false, "Print inode number of each file.") // flags.BoolVarP(cmdFlags, &opts.Device, "device", "", false, "Print device ID number to which each file belongs.") // Sort - flags.BoolVarP(cmdFlags, &opts.NoSort, "unsorted", "U", false, "Leave files unsorted") - flags.BoolVarP(cmdFlags, &opts.VerSort, "version", "", false, "Sort files alphanumerically by version") - flags.BoolVarP(cmdFlags, &opts.ModSort, "sort-modtime", "t", false, "Sort files by last modification time") - flags.BoolVarP(cmdFlags, &opts.CTimeSort, "sort-ctime", "", false, "Sort files by last status change time") - flags.BoolVarP(cmdFlags, &opts.ReverSort, "sort-reverse", "r", false, "Reverse the order of the sort") - flags.BoolVarP(cmdFlags, &opts.DirSort, "dirsfirst", "", false, "List directories before files (-U disables)") - flags.StringVarP(cmdFlags, &sort, "sort", "", "", "Select sort: name,version,size,mtime,ctime") + flags.BoolVarP(cmdFlags, &opts.NoSort, "unsorted", "U", false, "Leave files unsorted", "") + flags.BoolVarP(cmdFlags, &opts.VerSort, "version", "", false, "Sort files alphanumerically by version", "") + flags.BoolVarP(cmdFlags, &opts.ModSort, "sort-modtime", "t", false, "Sort files by last modification time", "") + flags.BoolVarP(cmdFlags, &opts.CTimeSort, "sort-ctime", "", false, "Sort files by last status change time", "") + flags.BoolVarP(cmdFlags, &opts.ReverSort, "sort-reverse", "r", false, "Reverse the order of the sort", "") + flags.BoolVarP(cmdFlags, &opts.DirSort, "dirsfirst", "", false, "List directories before files (-U disables)", "") + flags.StringVarP(cmdFlags, &sort, "sort", "", "", "Select sort: name,version,size,mtime,ctime", "") // Graphics - flags.BoolVarP(cmdFlags, &opts.NoIndent, "noindent", "", false, "Don't print indentation lines") + flags.BoolVarP(cmdFlags, &opts.NoIndent, "noindent", "", false, "Don't print indentation lines", "") } var commandDefinition = &cobra.Command{ @@ -99,6 +99,7 @@ For a more interactive navigation of the remote see the `, Annotations: map[string]string{ "versionIntroduced": "v1.38", + "groups": "Filter,Listing", }, RunE: func(command *cobra.Command, args []string) error { cmd.CheckArgs(1, 1, command, args) diff --git a/cmd/version/version.go b/cmd/version/version.go index df8ac271e..4b61e8d92 100644 --- a/cmd/version/version.go +++ b/cmd/version/version.go @@ -25,7 +25,7 @@ var ( func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() - flags.BoolVarP(cmdFlags, &check, "check", "", false, "Check for new version") + flags.BoolVarP(cmdFlags, &check, "check", "", false, "Check for new version", "") } var commandDefinition = &cobra.Command{ diff --git a/fs/config/configflags/configflags.go b/fs/config/configflags/configflags.go index a3eeedf70..b8bb6250d 100644 --- a/fs/config/configflags/configflags.go +++ b/fs/config/configflags/configflags.go @@ -44,109 +44,109 @@ var ( func AddFlags(ci *fs.ConfigInfo, flagSet *pflag.FlagSet) { rc.AddOption("main", ci) // NB defaults which aren't the zero for the type should be set in fs/config.go NewConfig - flags.CountVarP(flagSet, &verbose, "verbose", "v", "Print lots more stuff (repeat for more)") - flags.BoolVarP(flagSet, &quiet, "quiet", "q", false, "Print as little stuff as possible") - flags.DurationVarP(flagSet, &ci.ModifyWindow, "modify-window", "", ci.ModifyWindow, "Max time diff to be considered the same") - flags.IntVarP(flagSet, &ci.Checkers, "checkers", "", ci.Checkers, "Number of checkers to run in parallel") - flags.IntVarP(flagSet, &ci.Transfers, "transfers", "", ci.Transfers, "Number of file transfers to run in parallel") - flags.StringVarP(flagSet, &configPath, "config", "", config.GetConfigPath(), "Config file") - flags.StringVarP(flagSet, &cacheDir, "cache-dir", "", config.GetCacheDir(), "Directory rclone will use for caching") - flags.StringVarP(flagSet, &tempDir, "temp-dir", "", os.TempDir(), "Directory rclone will use for temporary files") - flags.BoolVarP(flagSet, &ci.CheckSum, "checksum", "c", ci.CheckSum, "Skip based on checksum (if available) & size, not mod-time & size") - flags.BoolVarP(flagSet, &ci.SizeOnly, "size-only", "", ci.SizeOnly, "Skip based on size only, not mod-time or checksum") - flags.BoolVarP(flagSet, &ci.IgnoreTimes, "ignore-times", "I", ci.IgnoreTimes, "Don't skip files that match size and time - transfer all files") - flags.BoolVarP(flagSet, &ci.IgnoreExisting, "ignore-existing", "", ci.IgnoreExisting, "Skip all files that exist on destination") - flags.BoolVarP(flagSet, &ci.IgnoreErrors, "ignore-errors", "", ci.IgnoreErrors, "Delete even if there are I/O errors") - flags.BoolVarP(flagSet, &ci.DryRun, "dry-run", "n", ci.DryRun, "Do a trial run with no permanent changes") - flags.BoolVarP(flagSet, &ci.Interactive, "interactive", "i", ci.Interactive, "Enable interactive mode") - flags.DurationVarP(flagSet, &ci.ConnectTimeout, "contimeout", "", ci.ConnectTimeout, "Connect timeout") - flags.DurationVarP(flagSet, &ci.Timeout, "timeout", "", ci.Timeout, "IO idle timeout") - flags.DurationVarP(flagSet, &ci.ExpectContinueTimeout, "expect-continue-timeout", "", ci.ExpectContinueTimeout, "Timeout when using expect / 100-continue in HTTP") - flags.BoolVarP(flagSet, &dumpHeaders, "dump-headers", "", false, "Dump HTTP headers - may contain sensitive info") - flags.BoolVarP(flagSet, &dumpBodies, "dump-bodies", "", false, "Dump HTTP headers and bodies - may contain sensitive info") - flags.BoolVarP(flagSet, &ci.InsecureSkipVerify, "no-check-certificate", "", ci.InsecureSkipVerify, "Do not verify the server SSL certificate (insecure)") - flags.BoolVarP(flagSet, &ci.AskPassword, "ask-password", "", ci.AskPassword, "Allow prompt for password for encrypted configuration") - flags.FVarP(flagSet, &ci.PasswordCommand, "password-command", "", "Command for supplying password for encrypted configuration") - flags.BoolVarP(flagSet, &deleteBefore, "delete-before", "", false, "When synchronizing, delete files on destination before transferring") - flags.BoolVarP(flagSet, &deleteDuring, "delete-during", "", false, "When synchronizing, delete files during transfer") - flags.BoolVarP(flagSet, &deleteAfter, "delete-after", "", false, "When synchronizing, delete files on destination after transferring (default)") - flags.Int64VarP(flagSet, &ci.MaxDelete, "max-delete", "", -1, "When synchronizing, limit the number of deletes") - flags.FVarP(flagSet, &ci.MaxDeleteSize, "max-delete-size", "", "When synchronizing, limit the total size of deletes") - flags.BoolVarP(flagSet, &ci.TrackRenames, "track-renames", "", ci.TrackRenames, "When synchronizing, track file renames and do a server-side move if possible") - flags.StringVarP(flagSet, &ci.TrackRenamesStrategy, "track-renames-strategy", "", ci.TrackRenamesStrategy, "Strategies to use when synchronizing using track-renames hash|modtime|leaf") - flags.IntVarP(flagSet, &ci.LowLevelRetries, "low-level-retries", "", ci.LowLevelRetries, "Number of low level retries to do") - flags.BoolVarP(flagSet, &ci.UpdateOlder, "update", "u", ci.UpdateOlder, "Skip files that are newer on the destination") - flags.BoolVarP(flagSet, &ci.UseServerModTime, "use-server-modtime", "", ci.UseServerModTime, "Use server modified time instead of object metadata") - flags.BoolVarP(flagSet, &ci.NoGzip, "no-gzip-encoding", "", ci.NoGzip, "Don't set Accept-Encoding: gzip") - flags.IntVarP(flagSet, &ci.MaxDepth, "max-depth", "", ci.MaxDepth, "If set limits the recursion depth to this") - flags.BoolVarP(flagSet, &ci.IgnoreSize, "ignore-size", "", false, "Ignore size when skipping use mod-time or checksum") - flags.BoolVarP(flagSet, &ci.IgnoreChecksum, "ignore-checksum", "", ci.IgnoreChecksum, "Skip post copy check of checksums") - flags.BoolVarP(flagSet, &ci.IgnoreCaseSync, "ignore-case-sync", "", ci.IgnoreCaseSync, "Ignore case when synchronizing") - flags.BoolVarP(flagSet, &ci.NoTraverse, "no-traverse", "", ci.NoTraverse, "Don't traverse destination file system on copy") - flags.BoolVarP(flagSet, &ci.CheckFirst, "check-first", "", ci.CheckFirst, "Do all the checks before starting transfers") - flags.BoolVarP(flagSet, &ci.NoCheckDest, "no-check-dest", "", ci.NoCheckDest, "Don't check the destination, copy regardless") - flags.BoolVarP(flagSet, &ci.NoUnicodeNormalization, "no-unicode-normalization", "", ci.NoUnicodeNormalization, "Don't normalize unicode characters in filenames") - flags.BoolVarP(flagSet, &ci.NoUpdateModTime, "no-update-modtime", "", ci.NoUpdateModTime, "Don't update destination mod-time if files identical") - flags.StringArrayVarP(flagSet, &ci.CompareDest, "compare-dest", "", nil, "Include additional comma separated server-side paths during comparison") - flags.StringArrayVarP(flagSet, &ci.CopyDest, "copy-dest", "", nil, "Implies --compare-dest but also copies files from paths into destination") - flags.StringVarP(flagSet, &ci.BackupDir, "backup-dir", "", ci.BackupDir, "Make backups into hierarchy based in DIR") - flags.StringVarP(flagSet, &ci.Suffix, "suffix", "", ci.Suffix, "Suffix to add to changed files") - flags.BoolVarP(flagSet, &ci.SuffixKeepExtension, "suffix-keep-extension", "", ci.SuffixKeepExtension, "Preserve the extension when using --suffix") - flags.BoolVarP(flagSet, &ci.UseListR, "fast-list", "", ci.UseListR, "Use recursive list if available; uses more memory but fewer transactions") - flags.Float64VarP(flagSet, &ci.TPSLimit, "tpslimit", "", ci.TPSLimit, "Limit HTTP transactions per second to this") - flags.IntVarP(flagSet, &ci.TPSLimitBurst, "tpslimit-burst", "", ci.TPSLimitBurst, "Max burst of transactions for --tpslimit") - flags.StringVarP(flagSet, &bindAddr, "bind", "", "", "Local address to bind to for outgoing connections, IPv4, IPv6 or name") - flags.StringVarP(flagSet, &disableFeatures, "disable", "", "", "Disable a comma separated list of features (use --disable help to see a list)") - flags.StringVarP(flagSet, &ci.UserAgent, "user-agent", "", ci.UserAgent, "Set the user-agent to a specified string") - flags.BoolVarP(flagSet, &ci.Immutable, "immutable", "", ci.Immutable, "Do not modify files, fail if existing files have been modified") - flags.BoolVarP(flagSet, &ci.AutoConfirm, "auto-confirm", "", ci.AutoConfirm, "If enabled, do not request console confirmation") - flags.IntVarP(flagSet, &ci.StatsFileNameLength, "stats-file-name-length", "", ci.StatsFileNameLength, "Max file name length in stats (0 for no limit)") - flags.FVarP(flagSet, &ci.LogLevel, "log-level", "", "Log level DEBUG|INFO|NOTICE|ERROR") - flags.FVarP(flagSet, &ci.StatsLogLevel, "stats-log-level", "", "Log level to show --stats output DEBUG|INFO|NOTICE|ERROR") - flags.FVarP(flagSet, &ci.BwLimit, "bwlimit", "", "Bandwidth limit in KiB/s, or use suffix B|K|M|G|T|P or a full timetable") - flags.FVarP(flagSet, &ci.BwLimitFile, "bwlimit-file", "", "Bandwidth limit per file in KiB/s, or use suffix B|K|M|G|T|P or a full timetable") - flags.FVarP(flagSet, &ci.BufferSize, "buffer-size", "", "In memory buffer size when reading files for each --transfer") - flags.FVarP(flagSet, &ci.StreamingUploadCutoff, "streaming-upload-cutoff", "", "Cutoff for switching to chunked upload if file size is unknown, upload starts after reaching cutoff or when file ends") - flags.FVarP(flagSet, &ci.Dump, "dump", "", "List of items to dump from: "+fs.DumpFlagsList) - flags.FVarP(flagSet, &ci.MaxTransfer, "max-transfer", "", "Maximum size of data to transfer") - flags.DurationVarP(flagSet, &ci.MaxDuration, "max-duration", "", 0, "Maximum duration rclone will transfer data for") - flags.FVarP(flagSet, &ci.CutoffMode, "cutoff-mode", "", "Mode to stop transfers when reaching the max transfer limit HARD|SOFT|CAUTIOUS") - flags.IntVarP(flagSet, &ci.MaxBacklog, "max-backlog", "", ci.MaxBacklog, "Maximum number of objects in sync or check backlog") - flags.IntVarP(flagSet, &ci.MaxStatsGroups, "max-stats-groups", "", ci.MaxStatsGroups, "Maximum number of stats groups to keep in memory, on max oldest is discarded") - flags.BoolVarP(flagSet, &ci.StatsOneLine, "stats-one-line", "", ci.StatsOneLine, "Make the stats fit on one line") - flags.BoolVarP(flagSet, &ci.StatsOneLineDate, "stats-one-line-date", "", ci.StatsOneLineDate, "Enable --stats-one-line and add current date/time prefix") - flags.StringVarP(flagSet, &ci.StatsOneLineDateFormat, "stats-one-line-date-format", "", ci.StatsOneLineDateFormat, "Enable --stats-one-line-date and use custom formatted date: Enclose date string in double quotes (\"), see https://golang.org/pkg/time/#Time.Format") - flags.BoolVarP(flagSet, &ci.ErrorOnNoTransfer, "error-on-no-transfer", "", ci.ErrorOnNoTransfer, "Sets exit code 9 if no files are transferred, useful in scripts") - flags.BoolVarP(flagSet, &ci.Progress, "progress", "P", ci.Progress, "Show progress during transfer") - flags.BoolVarP(flagSet, &ci.ProgressTerminalTitle, "progress-terminal-title", "", ci.ProgressTerminalTitle, "Show progress on the terminal title (requires -P/--progress)") - flags.BoolVarP(flagSet, &ci.Cookie, "use-cookies", "", ci.Cookie, "Enable session cookiejar") - flags.BoolVarP(flagSet, &ci.UseMmap, "use-mmap", "", ci.UseMmap, "Use mmap allocator (see docs)") - flags.StringArrayVarP(flagSet, &ci.CaCert, "ca-cert", "", ci.CaCert, "CA certificate used to verify servers") - flags.StringVarP(flagSet, &ci.ClientCert, "client-cert", "", ci.ClientCert, "Client SSL certificate (PEM) for mutual TLS auth") - flags.StringVarP(flagSet, &ci.ClientKey, "client-key", "", ci.ClientKey, "Client SSL private key (PEM) for mutual TLS auth") - flags.FVarP(flagSet, &ci.MultiThreadCutoff, "multi-thread-cutoff", "", "Use multi-thread downloads for files above this size") - flags.IntVarP(flagSet, &ci.MultiThreadStreams, "multi-thread-streams", "", ci.MultiThreadStreams, "Max number of streams to use for multi-thread downloads") - flags.FVarP(flagSet, &ci.MultiThreadWriteBufferSize, "multi-thread-write-buffer-size", "", "In memory buffer size for writing when in multi-thread mode") - flags.BoolVarP(flagSet, &ci.UseJSONLog, "use-json-log", "", ci.UseJSONLog, "Use json log format") - flags.StringVarP(flagSet, &ci.OrderBy, "order-by", "", ci.OrderBy, "Instructions on how to order the transfers, e.g. 'size,descending'") - flags.StringArrayVarP(flagSet, &uploadHeaders, "header-upload", "", nil, "Set HTTP header for upload transactions") - flags.StringArrayVarP(flagSet, &downloadHeaders, "header-download", "", nil, "Set HTTP header for download transactions") - flags.StringArrayVarP(flagSet, &headers, "header", "", nil, "Set HTTP header for all transactions") - flags.StringArrayVarP(flagSet, &metadataSet, "metadata-set", "", nil, "Add metadata key=value when uploading") - flags.BoolVarP(flagSet, &ci.RefreshTimes, "refresh-times", "", ci.RefreshTimes, "Refresh the modtime of remote files") - flags.BoolVarP(flagSet, &ci.NoConsole, "no-console", "", ci.NoConsole, "Hide console window (supported on Windows only)") - flags.StringVarP(flagSet, &dscp, "dscp", "", "", "Set DSCP value to connections, value or name, e.g. CS1, LE, DF, AF21") - flags.DurationVarP(flagSet, &ci.FsCacheExpireDuration, "fs-cache-expire-duration", "", ci.FsCacheExpireDuration, "Cache remotes for this long (0 to disable caching)") - flags.DurationVarP(flagSet, &ci.FsCacheExpireInterval, "fs-cache-expire-interval", "", ci.FsCacheExpireInterval, "Interval to check for expired remotes") - flags.BoolVarP(flagSet, &ci.DisableHTTP2, "disable-http2", "", ci.DisableHTTP2, "Disable HTTP/2 in the global transport") - flags.BoolVarP(flagSet, &ci.HumanReadable, "human-readable", "", ci.HumanReadable, "Print numbers in a human-readable format, sizes with suffix Ki|Mi|Gi|Ti|Pi") - flags.DurationVarP(flagSet, &ci.KvLockTime, "kv-lock-time", "", ci.KvLockTime, "Maximum time to keep key-value database locked by process") - flags.BoolVarP(flagSet, &ci.DisableHTTPKeepAlives, "disable-http-keep-alives", "", ci.DisableHTTPKeepAlives, "Disable HTTP keep-alives and use each connection once.") - flags.BoolVarP(flagSet, &ci.Metadata, "metadata", "M", ci.Metadata, "If set, preserve metadata when copying objects") - flags.BoolVarP(flagSet, &ci.ServerSideAcrossConfigs, "server-side-across-configs", "", ci.ServerSideAcrossConfigs, "Allow server-side operations (e.g. copy) to work across different configs") - flags.FVarP(flagSet, &ci.TerminalColorMode, "color", "", "When to show colors (and other ANSI codes) AUTO|NEVER|ALWAYS") - flags.FVarP(flagSet, &ci.DefaultTime, "default-time", "", "Time to show if modtime is unknown for files and directories") - flags.BoolVarP(flagSet, &ci.Inplace, "inplace", "", ci.Inplace, "Download directly to destination file instead of atomic download to temp/rename") + flags.CountVarP(flagSet, &verbose, "verbose", "v", "Print lots more stuff (repeat for more)", "Logging,Important") + flags.BoolVarP(flagSet, &quiet, "quiet", "q", false, "Print as little stuff as possible", "Logging") + flags.DurationVarP(flagSet, &ci.ModifyWindow, "modify-window", "", ci.ModifyWindow, "Max time diff to be considered the same", "Copy") + flags.IntVarP(flagSet, &ci.Checkers, "checkers", "", ci.Checkers, "Number of checkers to run in parallel", "Performance") + flags.IntVarP(flagSet, &ci.Transfers, "transfers", "", ci.Transfers, "Number of file transfers to run in parallel", "Performance") + flags.StringVarP(flagSet, &configPath, "config", "", config.GetConfigPath(), "Config file", "Config") + flags.StringVarP(flagSet, &cacheDir, "cache-dir", "", config.GetCacheDir(), "Directory rclone will use for caching", "Config") + flags.StringVarP(flagSet, &tempDir, "temp-dir", "", os.TempDir(), "Directory rclone will use for temporary files", "Config") + flags.BoolVarP(flagSet, &ci.CheckSum, "checksum", "c", ci.CheckSum, "Skip based on checksum (if available) & size, not mod-time & size", "Copy") + flags.BoolVarP(flagSet, &ci.SizeOnly, "size-only", "", ci.SizeOnly, "Skip based on size only, not mod-time or checksum", "Copy") + flags.BoolVarP(flagSet, &ci.IgnoreTimes, "ignore-times", "I", ci.IgnoreTimes, "Don't skip files that match size and time - transfer all files", "Copy") + flags.BoolVarP(flagSet, &ci.IgnoreExisting, "ignore-existing", "", ci.IgnoreExisting, "Skip all files that exist on destination", "Copy") + flags.BoolVarP(flagSet, &ci.IgnoreErrors, "ignore-errors", "", ci.IgnoreErrors, "Delete even if there are I/O errors", "Sync") + flags.BoolVarP(flagSet, &ci.DryRun, "dry-run", "n", ci.DryRun, "Do a trial run with no permanent changes", "Config,Important") + flags.BoolVarP(flagSet, &ci.Interactive, "interactive", "i", ci.Interactive, "Enable interactive mode", "Config,Important") + flags.DurationVarP(flagSet, &ci.ConnectTimeout, "contimeout", "", ci.ConnectTimeout, "Connect timeout", "Networking") + flags.DurationVarP(flagSet, &ci.Timeout, "timeout", "", ci.Timeout, "IO idle timeout", "Networking") + flags.DurationVarP(flagSet, &ci.ExpectContinueTimeout, "expect-continue-timeout", "", ci.ExpectContinueTimeout, "Timeout when using expect / 100-continue in HTTP", "Networking") + flags.BoolVarP(flagSet, &dumpHeaders, "dump-headers", "", false, "Dump HTTP headers - may contain sensitive info", "Debugging") + flags.BoolVarP(flagSet, &dumpBodies, "dump-bodies", "", false, "Dump HTTP headers and bodies - may contain sensitive info", "Debugging") + flags.BoolVarP(flagSet, &ci.InsecureSkipVerify, "no-check-certificate", "", ci.InsecureSkipVerify, "Do not verify the server SSL certificate (insecure)", "Networking") + flags.BoolVarP(flagSet, &ci.AskPassword, "ask-password", "", ci.AskPassword, "Allow prompt for password for encrypted configuration", "Config") + flags.FVarP(flagSet, &ci.PasswordCommand, "password-command", "", "Command for supplying password for encrypted configuration", "Config") + flags.BoolVarP(flagSet, &deleteBefore, "delete-before", "", false, "When synchronizing, delete files on destination before transferring", "Sync") + flags.BoolVarP(flagSet, &deleteDuring, "delete-during", "", false, "When synchronizing, delete files during transfer", "Sync") + flags.BoolVarP(flagSet, &deleteAfter, "delete-after", "", false, "When synchronizing, delete files on destination after transferring (default)", "Sync") + flags.Int64VarP(flagSet, &ci.MaxDelete, "max-delete", "", -1, "When synchronizing, limit the number of deletes", "Sync") + flags.FVarP(flagSet, &ci.MaxDeleteSize, "max-delete-size", "", "When synchronizing, limit the total size of deletes", "Sync") + flags.BoolVarP(flagSet, &ci.TrackRenames, "track-renames", "", ci.TrackRenames, "When synchronizing, track file renames and do a server-side move if possible", "Sync") + flags.StringVarP(flagSet, &ci.TrackRenamesStrategy, "track-renames-strategy", "", ci.TrackRenamesStrategy, "Strategies to use when synchronizing using track-renames hash|modtime|leaf", "Sync") + flags.IntVarP(flagSet, &ci.LowLevelRetries, "low-level-retries", "", ci.LowLevelRetries, "Number of low level retries to do", "Config") + flags.BoolVarP(flagSet, &ci.UpdateOlder, "update", "u", ci.UpdateOlder, "Skip files that are newer on the destination", "Copy") + flags.BoolVarP(flagSet, &ci.UseServerModTime, "use-server-modtime", "", ci.UseServerModTime, "Use server modified time instead of object metadata", "Config") + flags.BoolVarP(flagSet, &ci.NoGzip, "no-gzip-encoding", "", ci.NoGzip, "Don't set Accept-Encoding: gzip", "Networking") + flags.IntVarP(flagSet, &ci.MaxDepth, "max-depth", "", ci.MaxDepth, "If set limits the recursion depth to this", "Filter") + flags.BoolVarP(flagSet, &ci.IgnoreSize, "ignore-size", "", false, "Ignore size when skipping use mod-time or checksum", "Copy") + flags.BoolVarP(flagSet, &ci.IgnoreChecksum, "ignore-checksum", "", ci.IgnoreChecksum, "Skip post copy check of checksums", "Copy") + flags.BoolVarP(flagSet, &ci.IgnoreCaseSync, "ignore-case-sync", "", ci.IgnoreCaseSync, "Ignore case when synchronizing", "Copy") + flags.BoolVarP(flagSet, &ci.NoTraverse, "no-traverse", "", ci.NoTraverse, "Don't traverse destination file system on copy", "Copy") + flags.BoolVarP(flagSet, &ci.CheckFirst, "check-first", "", ci.CheckFirst, "Do all the checks before starting transfers", "Copy") + flags.BoolVarP(flagSet, &ci.NoCheckDest, "no-check-dest", "", ci.NoCheckDest, "Don't check the destination, copy regardless", "Copy") + flags.BoolVarP(flagSet, &ci.NoUnicodeNormalization, "no-unicode-normalization", "", ci.NoUnicodeNormalization, "Don't normalize unicode characters in filenames", "Config") + flags.BoolVarP(flagSet, &ci.NoUpdateModTime, "no-update-modtime", "", ci.NoUpdateModTime, "Don't update destination mod-time if files identical", "Copy") + flags.StringArrayVarP(flagSet, &ci.CompareDest, "compare-dest", "", nil, "Include additional comma separated server-side paths during comparison", "Copy") + flags.StringArrayVarP(flagSet, &ci.CopyDest, "copy-dest", "", nil, "Implies --compare-dest but also copies files from paths into destination", "Copy") + flags.StringVarP(flagSet, &ci.BackupDir, "backup-dir", "", ci.BackupDir, "Make backups into hierarchy based in DIR", "Sync") + flags.StringVarP(flagSet, &ci.Suffix, "suffix", "", ci.Suffix, "Suffix to add to changed files", "Sync") + flags.BoolVarP(flagSet, &ci.SuffixKeepExtension, "suffix-keep-extension", "", ci.SuffixKeepExtension, "Preserve the extension when using --suffix", "Sync") + flags.BoolVarP(flagSet, &ci.UseListR, "fast-list", "", ci.UseListR, "Use recursive list if available; uses more memory but fewer transactions", "Listing") + flags.Float64VarP(flagSet, &ci.TPSLimit, "tpslimit", "", ci.TPSLimit, "Limit HTTP transactions per second to this", "Networking") + flags.IntVarP(flagSet, &ci.TPSLimitBurst, "tpslimit-burst", "", ci.TPSLimitBurst, "Max burst of transactions for --tpslimit", "Networking") + flags.StringVarP(flagSet, &bindAddr, "bind", "", "", "Local address to bind to for outgoing connections, IPv4, IPv6 or name", "Networking") + flags.StringVarP(flagSet, &disableFeatures, "disable", "", "", "Disable a comma separated list of features (use --disable help to see a list)", "Config") + flags.StringVarP(flagSet, &ci.UserAgent, "user-agent", "", ci.UserAgent, "Set the user-agent to a specified string", "Networking") + flags.BoolVarP(flagSet, &ci.Immutable, "immutable", "", ci.Immutable, "Do not modify files, fail if existing files have been modified", "Copy") + flags.BoolVarP(flagSet, &ci.AutoConfirm, "auto-confirm", "", ci.AutoConfirm, "If enabled, do not request console confirmation", "Config") + flags.IntVarP(flagSet, &ci.StatsFileNameLength, "stats-file-name-length", "", ci.StatsFileNameLength, "Max file name length in stats (0 for no limit)", "Logging") + flags.FVarP(flagSet, &ci.LogLevel, "log-level", "", "Log level DEBUG|INFO|NOTICE|ERROR", "Logging") + flags.FVarP(flagSet, &ci.StatsLogLevel, "stats-log-level", "", "Log level to show --stats output DEBUG|INFO|NOTICE|ERROR", "Logging") + flags.FVarP(flagSet, &ci.BwLimit, "bwlimit", "", "Bandwidth limit in KiB/s, or use suffix B|K|M|G|T|P or a full timetable", "Networking") + flags.FVarP(flagSet, &ci.BwLimitFile, "bwlimit-file", "", "Bandwidth limit per file in KiB/s, or use suffix B|K|M|G|T|P or a full timetable", "Networking") + flags.FVarP(flagSet, &ci.BufferSize, "buffer-size", "", "In memory buffer size when reading files for each --transfer", "Performance") + flags.FVarP(flagSet, &ci.StreamingUploadCutoff, "streaming-upload-cutoff", "", "Cutoff for switching to chunked upload if file size is unknown, upload starts after reaching cutoff or when file ends", "Copy") + flags.FVarP(flagSet, &ci.Dump, "dump", "", "List of items to dump from: "+fs.DumpFlagsList, "Debugging") + flags.FVarP(flagSet, &ci.MaxTransfer, "max-transfer", "", "Maximum size of data to transfer", "Copy") + flags.DurationVarP(flagSet, &ci.MaxDuration, "max-duration", "", 0, "Maximum duration rclone will transfer data for", "Copy") + flags.FVarP(flagSet, &ci.CutoffMode, "cutoff-mode", "", "Mode to stop transfers when reaching the max transfer limit HARD|SOFT|CAUTIOUS", "Copy") + flags.IntVarP(flagSet, &ci.MaxBacklog, "max-backlog", "", ci.MaxBacklog, "Maximum number of objects in sync or check backlog", "Copy,Check") + flags.IntVarP(flagSet, &ci.MaxStatsGroups, "max-stats-groups", "", ci.MaxStatsGroups, "Maximum number of stats groups to keep in memory, on max oldest is discarded", "Logging") + flags.BoolVarP(flagSet, &ci.StatsOneLine, "stats-one-line", "", ci.StatsOneLine, "Make the stats fit on one line", "Logging") + flags.BoolVarP(flagSet, &ci.StatsOneLineDate, "stats-one-line-date", "", ci.StatsOneLineDate, "Enable --stats-one-line and add current date/time prefix", "Logging") + flags.StringVarP(flagSet, &ci.StatsOneLineDateFormat, "stats-one-line-date-format", "", ci.StatsOneLineDateFormat, "Enable --stats-one-line-date and use custom formatted date: Enclose date string in double quotes (\"), see https://golang.org/pkg/time/#Time.Format", "Logging") + flags.BoolVarP(flagSet, &ci.ErrorOnNoTransfer, "error-on-no-transfer", "", ci.ErrorOnNoTransfer, "Sets exit code 9 if no files are transferred, useful in scripts", "Config") + flags.BoolVarP(flagSet, &ci.Progress, "progress", "P", ci.Progress, "Show progress during transfer", "Logging") + flags.BoolVarP(flagSet, &ci.ProgressTerminalTitle, "progress-terminal-title", "", ci.ProgressTerminalTitle, "Show progress on the terminal title (requires -P/--progress)", "Logging") + flags.BoolVarP(flagSet, &ci.Cookie, "use-cookies", "", ci.Cookie, "Enable session cookiejar", "Networking") + flags.BoolVarP(flagSet, &ci.UseMmap, "use-mmap", "", ci.UseMmap, "Use mmap allocator (see docs)", "Config") + flags.StringArrayVarP(flagSet, &ci.CaCert, "ca-cert", "", ci.CaCert, "CA certificate used to verify servers", "Networking") + flags.StringVarP(flagSet, &ci.ClientCert, "client-cert", "", ci.ClientCert, "Client SSL certificate (PEM) for mutual TLS auth", "Networking") + flags.StringVarP(flagSet, &ci.ClientKey, "client-key", "", ci.ClientKey, "Client SSL private key (PEM) for mutual TLS auth", "Networking") + flags.FVarP(flagSet, &ci.MultiThreadCutoff, "multi-thread-cutoff", "", "Use multi-thread downloads for files above this size", "Copy") + flags.IntVarP(flagSet, &ci.MultiThreadStreams, "multi-thread-streams", "", ci.MultiThreadStreams, "Max number of streams to use for multi-thread downloads", "Copy") + flags.FVarP(flagSet, &ci.MultiThreadWriteBufferSize, "multi-thread-write-buffer-size", "", "In memory buffer size for writing when in multi-thread mode", "Copy") + flags.BoolVarP(flagSet, &ci.UseJSONLog, "use-json-log", "", ci.UseJSONLog, "Use json log format", "Logging") + flags.StringVarP(flagSet, &ci.OrderBy, "order-by", "", ci.OrderBy, "Instructions on how to order the transfers, e.g. 'size,descending'", "Copy") + flags.StringArrayVarP(flagSet, &uploadHeaders, "header-upload", "", nil, "Set HTTP header for upload transactions", "Networking") + flags.StringArrayVarP(flagSet, &downloadHeaders, "header-download", "", nil, "Set HTTP header for download transactions", "Networking") + flags.StringArrayVarP(flagSet, &headers, "header", "", nil, "Set HTTP header for all transactions", "Networking") + flags.StringArrayVarP(flagSet, &metadataSet, "metadata-set", "", nil, "Add metadata key=value when uploading", "Metadata") + flags.BoolVarP(flagSet, &ci.RefreshTimes, "refresh-times", "", ci.RefreshTimes, "Refresh the modtime of remote files", "Copy") + flags.BoolVarP(flagSet, &ci.NoConsole, "no-console", "", ci.NoConsole, "Hide console window (supported on Windows only)", "Config") + flags.StringVarP(flagSet, &dscp, "dscp", "", "", "Set DSCP value to connections, value or name, e.g. CS1, LE, DF, AF21", "Networking") + flags.DurationVarP(flagSet, &ci.FsCacheExpireDuration, "fs-cache-expire-duration", "", ci.FsCacheExpireDuration, "Cache remotes for this long (0 to disable caching)", "Config") + flags.DurationVarP(flagSet, &ci.FsCacheExpireInterval, "fs-cache-expire-interval", "", ci.FsCacheExpireInterval, "Interval to check for expired remotes", "Config") + flags.BoolVarP(flagSet, &ci.DisableHTTP2, "disable-http2", "", ci.DisableHTTP2, "Disable HTTP/2 in the global transport", "Networking") + flags.BoolVarP(flagSet, &ci.HumanReadable, "human-readable", "", ci.HumanReadable, "Print numbers in a human-readable format, sizes with suffix Ki|Mi|Gi|Ti|Pi", "Config") + flags.DurationVarP(flagSet, &ci.KvLockTime, "kv-lock-time", "", ci.KvLockTime, "Maximum time to keep key-value database locked by process", "Config") + flags.BoolVarP(flagSet, &ci.DisableHTTPKeepAlives, "disable-http-keep-alives", "", ci.DisableHTTPKeepAlives, "Disable HTTP keep-alives and use each connection once.", "Networking") + flags.BoolVarP(flagSet, &ci.Metadata, "metadata", "M", ci.Metadata, "If set, preserve metadata when copying objects", "Metadata,Copy") + flags.BoolVarP(flagSet, &ci.ServerSideAcrossConfigs, "server-side-across-configs", "", ci.ServerSideAcrossConfigs, "Allow server-side operations (e.g. copy) to work across different configs", "Copy") + flags.FVarP(flagSet, &ci.TerminalColorMode, "color", "", "When to show colors (and other ANSI codes) AUTO|NEVER|ALWAYS", "Config") + flags.FVarP(flagSet, &ci.DefaultTime, "default-time", "", "Time to show if modtime is unknown for files and directories", "Config,Listing") + flags.BoolVarP(flagSet, &ci.Inplace, "inplace", "", ci.Inplace, "Download directly to destination file instead of atomic download to temp/rename", "Copy") } // ParseHeaders converts the strings passed in via the header flags into HTTPOptions diff --git a/fs/config/flags/flags.go b/fs/config/flags/flags.go index 53a4c2f16..b96f37834 100644 --- a/fs/config/flags/flags.go +++ b/fs/config/flags/flags.go @@ -5,25 +5,142 @@ package flags import ( "log" "os" + "regexp" + "strings" "time" "github.com/rclone/rclone/fs" "github.com/spf13/pflag" ) -// setValueFromEnv constructs a name from the flag passed in and +// Groups of Flags +type Groups struct { + // Groups of flags + Groups []*Group + + // GroupsMaps maps a group name to a Group + ByName map[string]*Group +} + +// Group related flags together for documentation purposes +type Group struct { + Groups *Groups + Name string + Help string + Flags *pflag.FlagSet +} + +// NewGroups constructs a collection of Groups +func NewGroups() *Groups { + return &Groups{ + ByName: make(map[string]*Group), + } +} + +// NewGroup to create Group +func (gs *Groups) NewGroup(name, help string) *Group { + group := &Group{ + Name: name, + Help: help, + Flags: pflag.NewFlagSet(name, pflag.ExitOnError), + } + gs.ByName[group.Name] = group + gs.Groups = append(gs.Groups, group) + return group +} + +// Filter makes a copy of groups filtered by flagsRe +func (gs *Groups) Filter(flagsRe *regexp.Regexp) *Groups { + newGs := NewGroups() + for _, g := range gs.Groups { + newG := newGs.NewGroup(g.Name, g.Help) + g.Flags.VisitAll(func(f *pflag.Flag) { + matched := flagsRe == nil || flagsRe.MatchString(f.Name) || flagsRe.MatchString(f.Usage) + if matched { + newG.Flags.AddFlag(f) + } + }) + } + return newGs +} + +// Include makes a copy of groups only including the ones in the filter string +func (gs *Groups) Include(groupsString string) *Groups { + if groupsString == "" { + return gs + } + want := map[string]bool{} + for _, groupName := range strings.Split(groupsString, ",") { + _, ok := All.ByName[groupName] + if !ok { + log.Fatalf("Couldn't find group %q in command annotation", groupName) + } + want[groupName] = true + } + newGs := NewGroups() + for _, g := range gs.Groups { + if !want[g.Name] { + continue + } + newG := newGs.NewGroup(g.Name, g.Help) + newG.Flags = g.Flags + } + return newGs +} + +// Add a new flag to the Group +func (g *Group) Add(flag *pflag.Flag) { + g.Flags.AddFlag(flag) +} + +// AllRegistered returns all flags in a group +func (gs *Groups) AllRegistered() map[*pflag.Flag]struct{} { + out := make(map[*pflag.Flag]struct{}) + for _, g := range gs.Groups { + g.Flags.VisitAll(func(f *pflag.Flag) { + out[f] = struct{}{} + }) + } + return out +} + +var All *Groups + +// Groups of flags for documentation purposes +func init() { + All = NewGroups() + All.NewGroup("Copy", "Flags for anything which can Copy a file.") + All.NewGroup("Sync", "Flags just used for `rclone sync`.") + All.NewGroup("Important", "Important flags useful for most commands.") + All.NewGroup("Check", "Flags used for `rclone check`.") + All.NewGroup("Networking", "General networking and HTTP stuff.") + All.NewGroup("Performance", "Flags helpful for increasing performance.") + All.NewGroup("Config", "General configuration of rclone.") + All.NewGroup("Debugging", "Flags for developers.") + All.NewGroup("Filter", "Flags for filtering directory listings.") + All.NewGroup("Listing", "Flags for listing directories.") + All.NewGroup("Logging", "Logging and statistics.") + All.NewGroup("Metadata", "Flags to control metadata.") + All.NewGroup("RC", "Flags to control the Remote Control API.") +} + +// installFlag constructs a name from the flag passed in and // sets the value and default from the environment if possible // the value may be overridden when the command line is parsed // -// Used to create non-backend flags like --stats -func setValueFromEnv(flags *pflag.FlagSet, name string) { +// Used to create non-backend flags like --stats. +// +// It also adds the flag to the groups passed in. +func installFlag(flags *pflag.FlagSet, name string, groupsString string) { + // Find flag + flag := flags.Lookup(name) + if flag == nil { + log.Fatalf("Couldn't find flag --%q", name) + } + + // Read default from environment if possible envKey := fs.OptionToEnv(name) - envValue, found := os.LookupEnv(envKey) - if found { - flag := flags.Lookup(name) - if flag == nil { - log.Fatalf("Couldn't find flag --%q", name) - } + if envValue, envFound := os.LookupEnv(envKey); envFound { err := flags.Set(name, envValue) if err != nil { log.Fatalf("Invalid value when setting --%s from environment variable %s=%q: %v", name, envKey, envValue, err) @@ -31,6 +148,20 @@ func setValueFromEnv(flags *pflag.FlagSet, name string) { fs.Debugf(nil, "Setting --%s %q from environment variable %s=%q", name, flag.Value, envKey, envValue) flag.DefValue = envValue } + + // Add flag to Group if it is a global flag + if flags == pflag.CommandLine { + for _, groupName := range strings.Split(groupsString, ",") { + if groupName == "rc-" { + groupName = "RC" + } + group, ok := All.ByName[groupName] + if !ok { + log.Fatalf("Couldn't find group %q for flag --%s", groupName, name) + } + group.Add(flag) + } + } } // SetDefaultFromEnv constructs a name from the flag passed in and @@ -54,105 +185,105 @@ func SetDefaultFromEnv(flags *pflag.FlagSet, name string) { // StringP defines a flag which can be set by an environment variable // // It is a thin wrapper around pflag.StringP -func StringP(name, shorthand string, value string, usage string) (out *string) { +func StringP(name, shorthand string, value string, usage string, groups string) (out *string) { out = pflag.StringP(name, shorthand, value, usage) - setValueFromEnv(pflag.CommandLine, name) + installFlag(pflag.CommandLine, name, groups) return out } // StringVarP defines a flag which can be set by an environment variable // // It is a thin wrapper around pflag.StringVarP -func StringVarP(flags *pflag.FlagSet, p *string, name, shorthand string, value string, usage string) { +func StringVarP(flags *pflag.FlagSet, p *string, name, shorthand string, value string, usage string, groups string) { flags.StringVarP(p, name, shorthand, value, usage) - setValueFromEnv(flags, name) + installFlag(flags, name, groups) } // BoolP defines a flag which can be set by an environment variable // // It is a thin wrapper around pflag.BoolP -func BoolP(name, shorthand string, value bool, usage string) (out *bool) { +func BoolP(name, shorthand string, value bool, usage string, groups string) (out *bool) { out = pflag.BoolP(name, shorthand, value, usage) - setValueFromEnv(pflag.CommandLine, name) + installFlag(pflag.CommandLine, name, groups) return out } // BoolVarP defines a flag which can be set by an environment variable // // It is a thin wrapper around pflag.BoolVarP -func BoolVarP(flags *pflag.FlagSet, p *bool, name, shorthand string, value bool, usage string) { +func BoolVarP(flags *pflag.FlagSet, p *bool, name, shorthand string, value bool, usage string, groups string) { flags.BoolVarP(p, name, shorthand, value, usage) - setValueFromEnv(flags, name) + installFlag(flags, name, groups) } // IntP defines a flag which can be set by an environment variable // // It is a thin wrapper around pflag.IntP -func IntP(name, shorthand string, value int, usage string) (out *int) { +func IntP(name, shorthand string, value int, usage string, groups string) (out *int) { out = pflag.IntP(name, shorthand, value, usage) - setValueFromEnv(pflag.CommandLine, name) + installFlag(pflag.CommandLine, name, groups) return out } // Int64P defines a flag which can be set by an environment variable // // It is a thin wrapper around pflag.IntP -func Int64P(name, shorthand string, value int64, usage string) (out *int64) { +func Int64P(name, shorthand string, value int64, usage string, groups string) (out *int64) { out = pflag.Int64P(name, shorthand, value, usage) - setValueFromEnv(pflag.CommandLine, name) + installFlag(pflag.CommandLine, name, groups) return out } // Int64VarP defines a flag which can be set by an environment variable // // It is a thin wrapper around pflag.Int64VarP -func Int64VarP(flags *pflag.FlagSet, p *int64, name, shorthand string, value int64, usage string) { +func Int64VarP(flags *pflag.FlagSet, p *int64, name, shorthand string, value int64, usage string, groups string) { flags.Int64VarP(p, name, shorthand, value, usage) - setValueFromEnv(flags, name) + installFlag(flags, name, groups) } // IntVarP defines a flag which can be set by an environment variable // // It is a thin wrapper around pflag.IntVarP -func IntVarP(flags *pflag.FlagSet, p *int, name, shorthand string, value int, usage string) { +func IntVarP(flags *pflag.FlagSet, p *int, name, shorthand string, value int, usage string, groups string) { flags.IntVarP(p, name, shorthand, value, usage) - setValueFromEnv(flags, name) + installFlag(flags, name, groups) } // Uint32VarP defines a flag which can be set by an environment variable // // It is a thin wrapper around pflag.Uint32VarP -func Uint32VarP(flags *pflag.FlagSet, p *uint32, name, shorthand string, value uint32, usage string) { +func Uint32VarP(flags *pflag.FlagSet, p *uint32, name, shorthand string, value uint32, usage string, groups string) { flags.Uint32VarP(p, name, shorthand, value, usage) - setValueFromEnv(flags, name) + installFlag(flags, name, groups) } // Float64P defines a flag which can be set by an environment variable // // It is a thin wrapper around pflag.Float64P -func Float64P(name, shorthand string, value float64, usage string) (out *float64) { +func Float64P(name, shorthand string, value float64, usage string, groups string) (out *float64) { out = pflag.Float64P(name, shorthand, value, usage) - setValueFromEnv(pflag.CommandLine, name) + installFlag(pflag.CommandLine, name, groups) return out } // Float64VarP defines a flag which can be set by an environment variable // // It is a thin wrapper around pflag.Float64VarP -func Float64VarP(flags *pflag.FlagSet, p *float64, name, shorthand string, value float64, usage string) { +func Float64VarP(flags *pflag.FlagSet, p *float64, name, shorthand string, value float64, usage string, groups string) { flags.Float64VarP(p, name, shorthand, value, usage) - setValueFromEnv(flags, name) + installFlag(flags, name, groups) } // DurationP defines a flag which can be set by an environment variable // // It wraps the duration in an fs.Duration for extra suffixes and // passes it to pflag.VarP -func DurationP(name, shorthand string, value time.Duration, usage string) (out *time.Duration) { +func DurationP(name, shorthand string, value time.Duration, usage string, groups string) (out *time.Duration) { out = new(time.Duration) *out = value pflag.VarP((*fs.Duration)(out), name, shorthand, usage) - setValueFromEnv(pflag.CommandLine, name) + installFlag(pflag.CommandLine, name, groups) return out } @@ -160,25 +291,25 @@ func DurationP(name, shorthand string, value time.Duration, usage string) (out * // // It wraps the duration in an fs.Duration for extra suffixes and // passes it to pflag.VarP -func DurationVarP(flags *pflag.FlagSet, p *time.Duration, name, shorthand string, value time.Duration, usage string) { +func DurationVarP(flags *pflag.FlagSet, p *time.Duration, name, shorthand string, value time.Duration, usage string, groups string) { flags.VarP((*fs.Duration)(p), name, shorthand, usage) - setValueFromEnv(flags, name) + installFlag(flags, name, groups) } // VarP defines a flag which can be set by an environment variable // // It is a thin wrapper around pflag.VarP -func VarP(value pflag.Value, name, shorthand, usage string) { +func VarP(value pflag.Value, name, shorthand, usage string, groups string) { pflag.VarP(value, name, shorthand, usage) - setValueFromEnv(pflag.CommandLine, name) + installFlag(pflag.CommandLine, name, groups) } // FVarP defines a flag which can be set by an environment variable // // It is a thin wrapper around pflag.VarP -func FVarP(flags *pflag.FlagSet, value pflag.Value, name, shorthand, usage string) { +func FVarP(flags *pflag.FlagSet, value pflag.Value, name, shorthand, usage string, groups string) { flags.VarP(value, name, shorthand, usage) - setValueFromEnv(flags, name) + installFlag(flags, name, groups) } // StringArrayP defines a flag which can be set by an environment variable @@ -186,9 +317,9 @@ func FVarP(flags *pflag.FlagSet, value pflag.Value, name, shorthand, usage strin // It sets one value only - command line flags can be used to set more. // // It is a thin wrapper around pflag.StringArrayP -func StringArrayP(name, shorthand string, value []string, usage string) (out *[]string) { +func StringArrayP(name, shorthand string, value []string, usage string, groups string) (out *[]string) { out = pflag.StringArrayP(name, shorthand, value, usage) - setValueFromEnv(pflag.CommandLine, name) + installFlag(pflag.CommandLine, name, groups) return out } @@ -197,24 +328,24 @@ func StringArrayP(name, shorthand string, value []string, usage string) (out *[] // It sets one value only - command line flags can be used to set more. // // It is a thin wrapper around pflag.StringArrayVarP -func StringArrayVarP(flags *pflag.FlagSet, p *[]string, name, shorthand string, value []string, usage string) { +func StringArrayVarP(flags *pflag.FlagSet, p *[]string, name, shorthand string, value []string, usage string, groups string) { flags.StringArrayVarP(p, name, shorthand, value, usage) - setValueFromEnv(flags, name) + installFlag(flags, name, groups) } // CountP defines a flag which can be set by an environment variable // // It is a thin wrapper around pflag.CountP -func CountP(name, shorthand string, usage string) (out *int) { +func CountP(name, shorthand string, usage string, groups string) (out *int) { out = pflag.CountP(name, shorthand, usage) - setValueFromEnv(pflag.CommandLine, name) + installFlag(pflag.CommandLine, name, groups) return out } // CountVarP defines a flag which can be set by an environment variable // // It is a thin wrapper around pflag.CountVarP -func CountVarP(flags *pflag.FlagSet, p *int, name, shorthand string, usage string) { +func CountVarP(flags *pflag.FlagSet, p *int, name, shorthand string, usage string, groups string) { flags.CountVarP(p, name, shorthand, usage) - setValueFromEnv(flags, name) + installFlag(flags, name, groups) } diff --git a/fs/filter/filterflags/filterflags.go b/fs/filter/filterflags/filterflags.go index 5bb17b8a3..e5202bfc1 100644 --- a/fs/filter/filterflags/filterflags.go +++ b/fs/filter/filterflags/filterflags.go @@ -33,27 +33,31 @@ func AddRuleFlags(flagSet *pflag.FlagSet, Opt *filter.RulesOpt, what, prefix str if prefix == "" { shortFilter = "f" } - flags.StringArrayVarP(flagSet, &Opt.FilterRule, prefix+"filter", shortFilter, nil, fmt.Sprintf("Add a %s filtering rule", what)) - flags.StringArrayVarP(flagSet, &Opt.FilterFrom, prefix+"filter-from", "", nil, fmt.Sprintf("Read %s filtering patterns from a file (use - to read from stdin)", what)) - flags.StringArrayVarP(flagSet, &Opt.ExcludeRule, prefix+"exclude", "", nil, fmt.Sprintf("Exclude %ss matching pattern", what)) - flags.StringArrayVarP(flagSet, &Opt.ExcludeFrom, prefix+"exclude-from", "", nil, fmt.Sprintf("Read %s exclude patterns from file (use - to read from stdin)", what)) - flags.StringArrayVarP(flagSet, &Opt.IncludeRule, prefix+"include", "", nil, fmt.Sprintf("Include %ss matching pattern", what)) - flags.StringArrayVarP(flagSet, &Opt.IncludeFrom, prefix+"include-from", "", nil, fmt.Sprintf("Read %s include patterns from file (use - to read from stdin)", what)) + group := "Filter" + if prefix == "metadata-" { + group += ",Metadata" + } + flags.StringArrayVarP(flagSet, &Opt.FilterRule, prefix+"filter", shortFilter, nil, fmt.Sprintf("Add a %s filtering rule", what), group) + flags.StringArrayVarP(flagSet, &Opt.FilterFrom, prefix+"filter-from", "", nil, fmt.Sprintf("Read %s filtering patterns from a file (use - to read from stdin)", what), group) + flags.StringArrayVarP(flagSet, &Opt.ExcludeRule, prefix+"exclude", "", nil, fmt.Sprintf("Exclude %ss matching pattern", what), group) + flags.StringArrayVarP(flagSet, &Opt.ExcludeFrom, prefix+"exclude-from", "", nil, fmt.Sprintf("Read %s exclude patterns from file (use - to read from stdin)", what), group) + flags.StringArrayVarP(flagSet, &Opt.IncludeRule, prefix+"include", "", nil, fmt.Sprintf("Include %ss matching pattern", what), group) + flags.StringArrayVarP(flagSet, &Opt.IncludeFrom, prefix+"include-from", "", nil, fmt.Sprintf("Read %s include patterns from file (use - to read from stdin)", what), group) } // AddFlags adds the non filing system specific flags to the command func AddFlags(flagSet *pflag.FlagSet) { rc.AddOptionReload("filter", &Opt, Reload) - flags.BoolVarP(flagSet, &Opt.DeleteExcluded, "delete-excluded", "", false, "Delete files on dest excluded from sync") + flags.BoolVarP(flagSet, &Opt.DeleteExcluded, "delete-excluded", "", false, "Delete files on dest excluded from sync", "Filter") AddRuleFlags(flagSet, &Opt.RulesOpt, "file", "") AddRuleFlags(flagSet, &Opt.MetaRules, "metadata", "metadata-") - flags.StringArrayVarP(flagSet, &Opt.ExcludeFile, "exclude-if-present", "", nil, "Exclude directories if filename is present") - flags.StringArrayVarP(flagSet, &Opt.FilesFrom, "files-from", "", nil, "Read list of source-file names from file (use - to read from stdin)") - flags.StringArrayVarP(flagSet, &Opt.FilesFromRaw, "files-from-raw", "", nil, "Read list of source-file names from file without any processing of lines (use - to read from stdin)") - flags.FVarP(flagSet, &Opt.MinAge, "min-age", "", "Only transfer files older than this in s or suffix ms|s|m|h|d|w|M|y") - flags.FVarP(flagSet, &Opt.MaxAge, "max-age", "", "Only transfer files younger than this in s or suffix ms|s|m|h|d|w|M|y") - flags.FVarP(flagSet, &Opt.MinSize, "min-size", "", "Only transfer files bigger than this in KiB or suffix B|K|M|G|T|P") - flags.FVarP(flagSet, &Opt.MaxSize, "max-size", "", "Only transfer files smaller than this in KiB or suffix B|K|M|G|T|P") - flags.BoolVarP(flagSet, &Opt.IgnoreCase, "ignore-case", "", false, "Ignore case in filters (case insensitive)") + flags.StringArrayVarP(flagSet, &Opt.ExcludeFile, "exclude-if-present", "", nil, "Exclude directories if filename is present", "Filter") + flags.StringArrayVarP(flagSet, &Opt.FilesFrom, "files-from", "", nil, "Read list of source-file names from file (use - to read from stdin)", "Filter") + flags.StringArrayVarP(flagSet, &Opt.FilesFromRaw, "files-from-raw", "", nil, "Read list of source-file names from file without any processing of lines (use - to read from stdin)", "Filter") + flags.FVarP(flagSet, &Opt.MinAge, "min-age", "", "Only transfer files older than this in s or suffix ms|s|m|h|d|w|M|y", "Filter") + flags.FVarP(flagSet, &Opt.MaxAge, "max-age", "", "Only transfer files younger than this in s or suffix ms|s|m|h|d|w|M|y", "Filter") + flags.FVarP(flagSet, &Opt.MinSize, "min-size", "", "Only transfer files bigger than this in KiB or suffix B|K|M|G|T|P", "Filter") + flags.FVarP(flagSet, &Opt.MaxSize, "max-size", "", "Only transfer files smaller than this in KiB or suffix B|K|M|G|T|P", "Filter") + flags.BoolVarP(flagSet, &Opt.IgnoreCase, "ignore-case", "", false, "Ignore case in filters (case insensitive)", "Filter") //cvsExclude = BoolP("cvs-exclude", "C", false, "Exclude files in the same way CVS does") } diff --git a/fs/log/logflags/logflags.go b/fs/log/logflags/logflags.go index 818aaac51..d1d3c8d89 100644 --- a/fs/log/logflags/logflags.go +++ b/fs/log/logflags/logflags.go @@ -12,9 +12,9 @@ import ( func AddFlags(flagSet *pflag.FlagSet) { rc.AddOption("log", &log.Opt) - flags.StringVarP(flagSet, &log.Opt.File, "log-file", "", log.Opt.File, "Log everything to this file") - flags.StringVarP(flagSet, &log.Opt.Format, "log-format", "", log.Opt.Format, "Comma separated list of log format options") - flags.BoolVarP(flagSet, &log.Opt.UseSyslog, "syslog", "", log.Opt.UseSyslog, "Use Syslog for logging") - flags.StringVarP(flagSet, &log.Opt.SyslogFacility, "syslog-facility", "", log.Opt.SyslogFacility, "Facility for syslog, e.g. KERN,USER,...") - flags.BoolVarP(flagSet, &log.Opt.LogSystemdSupport, "log-systemd", "", log.Opt.LogSystemdSupport, "Activate systemd integration for the logger") + flags.StringVarP(flagSet, &log.Opt.File, "log-file", "", log.Opt.File, "Log everything to this file", "Logging") + flags.StringVarP(flagSet, &log.Opt.Format, "log-format", "", log.Opt.Format, "Comma separated list of log format options", "Logging") + flags.BoolVarP(flagSet, &log.Opt.UseSyslog, "syslog", "", log.Opt.UseSyslog, "Use Syslog for logging", "Logging") + flags.StringVarP(flagSet, &log.Opt.SyslogFacility, "syslog-facility", "", log.Opt.SyslogFacility, "Facility for syslog, e.g. KERN,USER,...", "Logging") + flags.BoolVarP(flagSet, &log.Opt.LogSystemdSupport, "log-systemd", "", log.Opt.LogSystemdSupport, "Activate systemd integration for the logger", "Logging") } diff --git a/fs/rc/rcflags/rcflags.go b/fs/rc/rcflags/rcflags.go index 7857c5189..6711d5255 100644 --- a/fs/rc/rcflags/rcflags.go +++ b/fs/rc/rcflags/rcflags.go @@ -18,18 +18,18 @@ var ( // AddFlags adds the remote control flags to the flagSet func AddFlags(flagSet *pflag.FlagSet) { rc.AddOption("rc", &Opt) - flags.BoolVarP(flagSet, &Opt.Enabled, "rc", "", false, "Enable the remote control server") - flags.StringVarP(flagSet, &Opt.Files, "rc-files", "", "", "Path to local files to serve on the HTTP server") - flags.BoolVarP(flagSet, &Opt.Serve, "rc-serve", "", false, "Enable the serving of remote objects") - flags.BoolVarP(flagSet, &Opt.NoAuth, "rc-no-auth", "", false, "Don't require auth for certain methods") - flags.BoolVarP(flagSet, &Opt.WebUI, "rc-web-gui", "", false, "Launch WebGUI on localhost") - flags.BoolVarP(flagSet, &Opt.WebGUIUpdate, "rc-web-gui-update", "", false, "Check and update to latest version of web gui") - flags.BoolVarP(flagSet, &Opt.WebGUIForceUpdate, "rc-web-gui-force-update", "", false, "Force update to latest version of web gui") - flags.BoolVarP(flagSet, &Opt.WebGUINoOpenBrowser, "rc-web-gui-no-open-browser", "", false, "Don't open the browser automatically") - flags.StringVarP(flagSet, &Opt.WebGUIFetchURL, "rc-web-fetch-url", "", "https://api.github.com/repos/rclone/rclone-webui-react/releases/latest", "URL to fetch the releases for webgui") - flags.BoolVarP(flagSet, &Opt.EnableMetrics, "rc-enable-metrics", "", false, "Enable prometheus metrics on /metrics") - flags.DurationVarP(flagSet, &Opt.JobExpireDuration, "rc-job-expire-duration", "", Opt.JobExpireDuration, "Expire finished async jobs older than this value") - flags.DurationVarP(flagSet, &Opt.JobExpireInterval, "rc-job-expire-interval", "", Opt.JobExpireInterval, "Interval to check for expired async jobs") + flags.BoolVarP(flagSet, &Opt.Enabled, "rc", "", false, "Enable the remote control server", "RC") + flags.StringVarP(flagSet, &Opt.Files, "rc-files", "", "", "Path to local files to serve on the HTTP server", "RC") + flags.BoolVarP(flagSet, &Opt.Serve, "rc-serve", "", false, "Enable the serving of remote objects", "RC") + flags.BoolVarP(flagSet, &Opt.NoAuth, "rc-no-auth", "", false, "Don't require auth for certain methods", "RC") + flags.BoolVarP(flagSet, &Opt.WebUI, "rc-web-gui", "", false, "Launch WebGUI on localhost", "RC") + flags.BoolVarP(flagSet, &Opt.WebGUIUpdate, "rc-web-gui-update", "", false, "Check and update to latest version of web gui", "RC") + flags.BoolVarP(flagSet, &Opt.WebGUIForceUpdate, "rc-web-gui-force-update", "", false, "Force update to latest version of web gui", "RC") + flags.BoolVarP(flagSet, &Opt.WebGUINoOpenBrowser, "rc-web-gui-no-open-browser", "", false, "Don't open the browser automatically", "RC") + flags.StringVarP(flagSet, &Opt.WebGUIFetchURL, "rc-web-fetch-url", "", "https://api.github.com/repos/rclone/rclone-webui-react/releases/latest", "URL to fetch the releases for webgui", "RC") + flags.BoolVarP(flagSet, &Opt.EnableMetrics, "rc-enable-metrics", "", false, "Enable prometheus metrics on /metrics", "RC") + flags.DurationVarP(flagSet, &Opt.JobExpireDuration, "rc-job-expire-duration", "", Opt.JobExpireDuration, "Expire finished async jobs older than this value", "RC") + flags.DurationVarP(flagSet, &Opt.JobExpireInterval, "rc-job-expire-interval", "", Opt.JobExpireInterval, "Interval to check for expired async jobs", "RC") Opt.HTTP.AddFlagsPrefix(flagSet, FlagPrefix) Opt.Auth.AddFlagsPrefix(flagSet, FlagPrefix) Opt.Template.AddFlagsPrefix(flagSet, FlagPrefix) diff --git a/lib/http/auth.go b/lib/http/auth.go index d08dec55d..6b5ce6eb5 100644 --- a/lib/http/auth.go +++ b/lib/http/auth.go @@ -75,11 +75,11 @@ type AuthConfig struct { // AddFlagsPrefix adds flags to the flag set for AuthConfig func (cfg *AuthConfig) AddFlagsPrefix(flagSet *pflag.FlagSet, prefix string) { - flags.StringVarP(flagSet, &cfg.HtPasswd, prefix+"htpasswd", "", cfg.HtPasswd, "A htpasswd file - if not provided no authentication is done") - flags.StringVarP(flagSet, &cfg.Realm, prefix+"realm", "", cfg.Realm, "Realm for authentication") - flags.StringVarP(flagSet, &cfg.BasicUser, prefix+"user", "", cfg.BasicUser, "User name for authentication") - flags.StringVarP(flagSet, &cfg.BasicPass, prefix+"pass", "", cfg.BasicPass, "Password for authentication") - flags.StringVarP(flagSet, &cfg.Salt, prefix+"salt", "", cfg.Salt, "Password hashing salt") + flags.StringVarP(flagSet, &cfg.HtPasswd, prefix+"htpasswd", "", cfg.HtPasswd, "A htpasswd file - if not provided no authentication is done", prefix) + flags.StringVarP(flagSet, &cfg.Realm, prefix+"realm", "", cfg.Realm, "Realm for authentication", prefix) + flags.StringVarP(flagSet, &cfg.BasicUser, prefix+"user", "", cfg.BasicUser, "User name for authentication", prefix) + flags.StringVarP(flagSet, &cfg.BasicPass, prefix+"pass", "", cfg.BasicPass, "Password for authentication", prefix) + flags.StringVarP(flagSet, &cfg.Salt, prefix+"salt", "", cfg.Salt, "Password hashing salt", prefix) } // AddAuthFlagsPrefix adds flags to the flag set for AuthConfig diff --git a/lib/http/server.go b/lib/http/server.go index 3a43d37d9..68de85e50 100644 --- a/lib/http/server.go +++ b/lib/http/server.go @@ -114,16 +114,16 @@ type Config struct { // AddFlagsPrefix adds flags for the httplib func (cfg *Config) AddFlagsPrefix(flagSet *pflag.FlagSet, prefix string) { - flags.StringArrayVarP(flagSet, &cfg.ListenAddr, prefix+"addr", "", cfg.ListenAddr, "IPaddress:Port or :Port to bind server to") - flags.DurationVarP(flagSet, &cfg.ServerReadTimeout, prefix+"server-read-timeout", "", cfg.ServerReadTimeout, "Timeout for server reading data") - flags.DurationVarP(flagSet, &cfg.ServerWriteTimeout, prefix+"server-write-timeout", "", cfg.ServerWriteTimeout, "Timeout for server writing data") - flags.IntVarP(flagSet, &cfg.MaxHeaderBytes, prefix+"max-header-bytes", "", cfg.MaxHeaderBytes, "Maximum size of request header") - flags.StringVarP(flagSet, &cfg.TLSCert, prefix+"cert", "", cfg.TLSCert, "TLS PEM key (concatenation of certificate and CA certificate)") - flags.StringVarP(flagSet, &cfg.TLSKey, prefix+"key", "", cfg.TLSKey, "TLS PEM Private key") - flags.StringVarP(flagSet, &cfg.ClientCA, prefix+"client-ca", "", cfg.ClientCA, "Client certificate authority to verify clients with") - flags.StringVarP(flagSet, &cfg.BaseURL, prefix+"baseurl", "", cfg.BaseURL, "Prefix for URLs - leave blank for root") - flags.StringVarP(flagSet, &cfg.MinTLSVersion, prefix+"min-tls-version", "", cfg.MinTLSVersion, "Minimum TLS version that is acceptable") - flags.StringVarP(flagSet, &cfg.AllowOrigin, prefix+"allow-origin", "", cfg.AllowOrigin, "Origin which cross-domain request (CORS) can be executed from") + flags.StringArrayVarP(flagSet, &cfg.ListenAddr, prefix+"addr", "", cfg.ListenAddr, "IPaddress:Port or :Port to bind server to", prefix) + flags.DurationVarP(flagSet, &cfg.ServerReadTimeout, prefix+"server-read-timeout", "", cfg.ServerReadTimeout, "Timeout for server reading data", prefix) + flags.DurationVarP(flagSet, &cfg.ServerWriteTimeout, prefix+"server-write-timeout", "", cfg.ServerWriteTimeout, "Timeout for server writing data", prefix) + flags.IntVarP(flagSet, &cfg.MaxHeaderBytes, prefix+"max-header-bytes", "", cfg.MaxHeaderBytes, "Maximum size of request header", prefix) + flags.StringVarP(flagSet, &cfg.TLSCert, prefix+"cert", "", cfg.TLSCert, "TLS PEM key (concatenation of certificate and CA certificate)", prefix) + flags.StringVarP(flagSet, &cfg.TLSKey, prefix+"key", "", cfg.TLSKey, "TLS PEM Private key", prefix) + flags.StringVarP(flagSet, &cfg.ClientCA, prefix+"client-ca", "", cfg.ClientCA, "Client certificate authority to verify clients with", prefix) + flags.StringVarP(flagSet, &cfg.BaseURL, prefix+"baseurl", "", cfg.BaseURL, "Prefix for URLs - leave blank for root", prefix) + flags.StringVarP(flagSet, &cfg.MinTLSVersion, prefix+"min-tls-version", "", cfg.MinTLSVersion, "Minimum TLS version that is acceptable", prefix) + flags.StringVarP(flagSet, &cfg.AllowOrigin, prefix+"allow-origin", "", cfg.AllowOrigin, "Origin which cross-domain request (CORS) can be executed from", prefix) } // AddHTTPFlagsPrefix adds flags for the httplib diff --git a/lib/http/template.go b/lib/http/template.go index fbd514463..e72481f13 100644 --- a/lib/http/template.go +++ b/lib/http/template.go @@ -67,7 +67,7 @@ type TemplateConfig struct { // AddFlagsPrefix for the templating functionality func (cfg *TemplateConfig) AddFlagsPrefix(flagSet *pflag.FlagSet, prefix string) { - flags.StringVarP(flagSet, &cfg.Path, prefix+"template", "", cfg.Path, "User-specified template") + flags.StringVarP(flagSet, &cfg.Path, prefix+"template", "", cfg.Path, "User-specified template", prefix) } // AddTemplateFlagsPrefix for the templating functionality diff --git a/vfs/vfsflags/vfsflags.go b/vfs/vfsflags/vfsflags.go index b4682f785..46fde2d65 100644 --- a/vfs/vfsflags/vfsflags.go +++ b/vfs/vfsflags/vfsflags.go @@ -18,27 +18,27 @@ var ( // AddFlags adds the non filing system specific flags to the command func AddFlags(flagSet *pflag.FlagSet) { rc.AddOption("vfs", &Opt) - flags.BoolVarP(flagSet, &Opt.NoModTime, "no-modtime", "", Opt.NoModTime, "Don't read/write the modification time (can speed things up)") - flags.BoolVarP(flagSet, &Opt.NoChecksum, "no-checksum", "", Opt.NoChecksum, "Don't compare checksums on up/download") - flags.BoolVarP(flagSet, &Opt.NoSeek, "no-seek", "", Opt.NoSeek, "Don't allow seeking in files") - flags.DurationVarP(flagSet, &Opt.DirCacheTime, "dir-cache-time", "", Opt.DirCacheTime, "Time to cache directory entries for") - flags.DurationVarP(flagSet, &Opt.PollInterval, "poll-interval", "", Opt.PollInterval, "Time to wait between polling for changes, must be smaller than dir-cache-time and only on supported remotes (set 0 to disable)") - flags.BoolVarP(flagSet, &Opt.ReadOnly, "read-only", "", Opt.ReadOnly, "Only allow read-only access") - flags.FVarP(flagSet, &Opt.CacheMode, "vfs-cache-mode", "", "Cache mode off|minimal|writes|full") - flags.DurationVarP(flagSet, &Opt.CachePollInterval, "vfs-cache-poll-interval", "", Opt.CachePollInterval, "Interval to poll the cache for stale objects") - flags.DurationVarP(flagSet, &Opt.CacheMaxAge, "vfs-cache-max-age", "", Opt.CacheMaxAge, "Max time since last access of objects in the cache") - flags.FVarP(flagSet, &Opt.CacheMaxSize, "vfs-cache-max-size", "", "Max total size of objects in the cache") - flags.FVarP(flagSet, &Opt.ChunkSize, "vfs-read-chunk-size", "", "Read the source objects in chunks") - flags.FVarP(flagSet, &Opt.ChunkSizeLimit, "vfs-read-chunk-size-limit", "", "If greater than --vfs-read-chunk-size, double the chunk size after each chunk read, until the limit is reached ('off' is unlimited)") - flags.FVarP(flagSet, DirPerms, "dir-perms", "", "Directory permissions") - flags.FVarP(flagSet, FilePerms, "file-perms", "", "File permissions") - flags.BoolVarP(flagSet, &Opt.CaseInsensitive, "vfs-case-insensitive", "", Opt.CaseInsensitive, "If a file name not found, find a case insensitive match") - flags.DurationVarP(flagSet, &Opt.WriteWait, "vfs-write-wait", "", Opt.WriteWait, "Time to wait for in-sequence write before giving error") - flags.DurationVarP(flagSet, &Opt.ReadWait, "vfs-read-wait", "", Opt.ReadWait, "Time to wait for in-sequence read before seeking") - flags.DurationVarP(flagSet, &Opt.WriteBack, "vfs-write-back", "", Opt.WriteBack, "Time to writeback files after last use when using cache") - flags.FVarP(flagSet, &Opt.ReadAhead, "vfs-read-ahead", "", "Extra read ahead over --buffer-size when using cache-mode full") - flags.BoolVarP(flagSet, &Opt.UsedIsSize, "vfs-used-is-size", "", Opt.UsedIsSize, "Use the `rclone size` algorithm for Used size") - flags.BoolVarP(flagSet, &Opt.FastFingerprint, "vfs-fast-fingerprint", "", Opt.FastFingerprint, "Use fast (less accurate) fingerprints for change detection") - flags.FVarP(flagSet, &Opt.DiskSpaceTotalSize, "vfs-disk-space-total-size", "", "Specify the total space of disk") + flags.BoolVarP(flagSet, &Opt.NoModTime, "no-modtime", "", Opt.NoModTime, "Don't read/write the modification time (can speed things up)", "VFS") + flags.BoolVarP(flagSet, &Opt.NoChecksum, "no-checksum", "", Opt.NoChecksum, "Don't compare checksums on up/download", "VFS") + flags.BoolVarP(flagSet, &Opt.NoSeek, "no-seek", "", Opt.NoSeek, "Don't allow seeking in files", "VFS") + flags.DurationVarP(flagSet, &Opt.DirCacheTime, "dir-cache-time", "", Opt.DirCacheTime, "Time to cache directory entries for", "VFS") + flags.DurationVarP(flagSet, &Opt.PollInterval, "poll-interval", "", Opt.PollInterval, "Time to wait between polling for changes, must be smaller than dir-cache-time and only on supported remotes (set 0 to disable)", "VFS") + flags.BoolVarP(flagSet, &Opt.ReadOnly, "read-only", "", Opt.ReadOnly, "Only allow read-only access", "VFS") + flags.FVarP(flagSet, &Opt.CacheMode, "vfs-cache-mode", "", "Cache mode off|minimal|writes|full", "VFS") + flags.DurationVarP(flagSet, &Opt.CachePollInterval, "vfs-cache-poll-interval", "", Opt.CachePollInterval, "Interval to poll the cache for stale objects", "VFS") + flags.DurationVarP(flagSet, &Opt.CacheMaxAge, "vfs-cache-max-age", "", Opt.CacheMaxAge, "Max time since last access of objects in the cache", "VFS") + flags.FVarP(flagSet, &Opt.CacheMaxSize, "vfs-cache-max-size", "", "Max total size of objects in the cache", "VFS") + flags.FVarP(flagSet, &Opt.ChunkSize, "vfs-read-chunk-size", "", "Read the source objects in chunks", "VFS") + flags.FVarP(flagSet, &Opt.ChunkSizeLimit, "vfs-read-chunk-size-limit", "", "If greater than --vfs-read-chunk-size, double the chunk size after each chunk read, until the limit is reached ('off' is unlimited)", "VFS") + flags.FVarP(flagSet, DirPerms, "dir-perms", "", "Directory permissions", "VFS") + flags.FVarP(flagSet, FilePerms, "file-perms", "", "File permissions", "VFS") + flags.BoolVarP(flagSet, &Opt.CaseInsensitive, "vfs-case-insensitive", "", Opt.CaseInsensitive, "If a file name not found, find a case insensitive match", "VFS") + flags.DurationVarP(flagSet, &Opt.WriteWait, "vfs-write-wait", "", Opt.WriteWait, "Time to wait for in-sequence write before giving error", "VFS") + flags.DurationVarP(flagSet, &Opt.ReadWait, "vfs-read-wait", "", Opt.ReadWait, "Time to wait for in-sequence read before seeking", "VFS") + flags.DurationVarP(flagSet, &Opt.WriteBack, "vfs-write-back", "", Opt.WriteBack, "Time to writeback files after last use when using cache", "VFS") + flags.FVarP(flagSet, &Opt.ReadAhead, "vfs-read-ahead", "", "Extra read ahead over --buffer-size when using cache-mode full", "VFS") + flags.BoolVarP(flagSet, &Opt.UsedIsSize, "vfs-used-is-size", "", Opt.UsedIsSize, "Use the `rclone size` algorithm for Used size", "VFS") + flags.BoolVarP(flagSet, &Opt.FastFingerprint, "vfs-fast-fingerprint", "", Opt.FastFingerprint, "Use fast (less accurate) fingerprints for change detection", "VFS") + flags.FVarP(flagSet, &Opt.DiskSpaceTotalSize, "vfs-disk-space-total-size", "", "Specify the total space of disk", "VFS") platformFlags(flagSet) } diff --git a/vfs/vfsflags/vfsflags_unix.go b/vfs/vfsflags/vfsflags_unix.go index 0ec37991d..cfffad6fb 100644 --- a/vfs/vfsflags/vfsflags_unix.go +++ b/vfs/vfsflags/vfsflags_unix.go @@ -13,9 +13,9 @@ import ( func platformFlags(flagSet *pflag.FlagSet) { Opt.Umask = unix.Umask(0) // read the umask unix.Umask(Opt.Umask) // set it back to what it was - flags.IntVarP(flagSet, &Opt.Umask, "umask", "", Opt.Umask, "Override the permission bits set by the filesystem (not supported on Windows)") + flags.IntVarP(flagSet, &Opt.Umask, "umask", "", Opt.Umask, "Override the permission bits set by the filesystem (not supported on Windows)", "VFS") Opt.UID = uint32(unix.Geteuid()) Opt.GID = uint32(unix.Getegid()) - flags.Uint32VarP(flagSet, &Opt.UID, "uid", "", Opt.UID, "Override the uid field set by the filesystem (not supported on Windows)") - flags.Uint32VarP(flagSet, &Opt.GID, "gid", "", Opt.GID, "Override the gid field set by the filesystem (not supported on Windows)") + flags.Uint32VarP(flagSet, &Opt.UID, "uid", "", Opt.UID, "Override the uid field set by the filesystem (not supported on Windows)", "VFS") + flags.Uint32VarP(flagSet, &Opt.GID, "gid", "", Opt.GID, "Override the gid field set by the filesystem (not supported on Windows)", "VFS") }