From 0d511b7878d58f2e4eb1ea383e788bda56bd2a5e Mon Sep 17 00:00:00 2001 From: Peter Berbec Date: Mon, 25 Mar 2019 22:41:45 -0400 Subject: [PATCH] cmd: implement --stats-one-line-date and --stats-one-line-date-format --- docs/content/docs.md | 12 +++ fs/accounting/stats.go | 8 +- fs/config.go | 110 ++++++++++++++------------- fs/config/configflags/configflags.go | 11 +++ 4 files changed, 87 insertions(+), 54 deletions(-) diff --git a/docs/content/docs.md b/docs/content/docs.md index d77b2e103..ab0e6249f 100644 --- a/docs/content/docs.md +++ b/docs/content/docs.md @@ -800,6 +800,18 @@ section](#logging) for more info on log levels. When this is specified, rclone condenses the stats into a single line showing the most important stats only. +### --stats-one-line-date ### + +When this is specified, rclone enables the single-line stats and prepends +the display with a date string. The default is `2006/01/02 15:04:05 - ` + +### --stats-one-line-date-format ### + +When this is specified, rclone enables the single-line stats and prepends +the display with a user-supplied date string. The date string MUST be +enclosed in quotes. Follow [golang specs](https://golang.org/pkg/time/#Time.Format) for +date formatting syntax. + ### --stats-unit=bits|bytes ### By default, data transfer rates will be printed in bytes/second. diff --git a/fs/accounting/stats.go b/fs/accounting/stats.go index 43c4d86bc..f0c18ab26 100644 --- a/fs/accounting/stats.go +++ b/fs/accounting/stats.go @@ -216,6 +216,7 @@ func (s *StatsInfo) String() string { currentSize = s.bytes buf = &bytes.Buffer{} xfrchkString = "" + dateString = "" ) if !fs.Config.StatsOneLine { @@ -231,9 +232,14 @@ func (s *StatsInfo) String() string { if len(xfrchk) > 0 { xfrchkString = fmt.Sprintf(" (%s)", strings.Join(xfrchk, ", ")) } + if fs.Config.StatsOneLineDate { + t := time.Now() + dateString = t.Format(fs.Config.StatsOneLineDateFormat) // Including the separator so people can customize it + } } - _, _ = fmt.Fprintf(buf, "%10s / %s, %s, %s, ETA %s%s", + _, _ = fmt.Fprintf(buf, "%s%10s / %s, %s, %s, ETA %s%s", + dateString, fs.SizeSuffix(s.bytes), fs.SizeSuffix(totalSize).Unit("Bytes"), percent(s.bytes, totalSize), diff --git a/fs/config.go b/fs/config.go index 7d3f968d3..f3745b1a1 100644 --- a/fs/config.go +++ b/fs/config.go @@ -38,59 +38,61 @@ var ( // ConfigInfo is filesystem config options type ConfigInfo struct { - LogLevel LogLevel - StatsLogLevel LogLevel - DryRun bool - CheckSum bool - SizeOnly bool - IgnoreTimes bool - IgnoreExisting bool - IgnoreErrors bool - ModifyWindow time.Duration - Checkers int - Transfers int - ConnectTimeout time.Duration // Connect timeout - Timeout time.Duration // Data channel timeout - Dump DumpFlags - InsecureSkipVerify bool // Skip server certificate verification - DeleteMode DeleteMode - MaxDelete int64 - TrackRenames bool // Track file renames. - LowLevelRetries int - UpdateOlder bool // Skip files that are newer on the destination - NoGzip bool // Disable compression - MaxDepth int - IgnoreSize bool - IgnoreChecksum bool - NoTraverse bool - NoUpdateModTime bool - DataRateUnit string - BackupDir string - Suffix string - SuffixKeepExtension bool - UseListR bool - BufferSize SizeSuffix - BwLimit BwTimetable - TPSLimit float64 - TPSLimitBurst int - BindAddr net.IP - DisableFeatures []string - UserAgent string - Immutable bool - AutoConfirm bool - StreamingUploadCutoff SizeSuffix - StatsFileNameLength int - AskPassword bool - UseServerModTime bool - MaxTransfer SizeSuffix - MaxBacklog int - StatsOneLine bool - Progress bool - Cookie bool - UseMmap bool - CaCert string // Client Side CA - ClientCert string // Client Side Cert - ClientKey string // Client Side Key + LogLevel LogLevel + StatsLogLevel LogLevel + DryRun bool + CheckSum bool + SizeOnly bool + IgnoreTimes bool + IgnoreExisting bool + IgnoreErrors bool + ModifyWindow time.Duration + Checkers int + Transfers int + ConnectTimeout time.Duration // Connect timeout + Timeout time.Duration // Data channel timeout + Dump DumpFlags + InsecureSkipVerify bool // Skip server certificate verification + DeleteMode DeleteMode + MaxDelete int64 + TrackRenames bool // Track file renames. + LowLevelRetries int + UpdateOlder bool // Skip files that are newer on the destination + NoGzip bool // Disable compression + MaxDepth int + IgnoreSize bool + IgnoreChecksum bool + NoTraverse bool + NoUpdateModTime bool + DataRateUnit string + BackupDir string + Suffix string + SuffixKeepExtension bool + UseListR bool + BufferSize SizeSuffix + BwLimit BwTimetable + TPSLimit float64 + TPSLimitBurst int + BindAddr net.IP + DisableFeatures []string + UserAgent string + Immutable bool + AutoConfirm bool + StreamingUploadCutoff SizeSuffix + StatsFileNameLength int + AskPassword bool + UseServerModTime bool + MaxTransfer SizeSuffix + MaxBacklog int + StatsOneLine bool + StatsOneLineDate bool // If we want a date prefix at all + StatsOneLineDateFormat string // If we want to customize the prefix + Progress bool + Cookie bool + UseMmap bool + CaCert string // Client Side CA + ClientCert string // Client Side Cert + ClientKey string // Client Side Key } // NewConfig creates a new config with everything set to the default @@ -120,6 +122,8 @@ func NewConfig() *ConfigInfo { c.TPSLimitBurst = 1 c.MaxTransfer = -1 c.MaxBacklog = 10000 + // We do not want to set the default here. We use this variable being empty as part of the fall-through of options. + // c.StatsOneLineDateFormat = "2006/01/02 15:04:05 - " return c } diff --git a/fs/config/configflags/configflags.go b/fs/config/configflags/configflags.go index af01f4dfa..c060ea078 100644 --- a/fs/config/configflags/configflags.go +++ b/fs/config/configflags/configflags.go @@ -87,6 +87,8 @@ func AddFlags(flagSet *pflag.FlagSet) { flags.FVarP(flagSet, &fs.Config.MaxTransfer, "max-transfer", "", "Maximum size of data to transfer.") flags.IntVarP(flagSet, &fs.Config.MaxBacklog, "max-backlog", "", fs.Config.MaxBacklog, "Maximum number of objects in sync or check backlog.") flags.BoolVarP(flagSet, &fs.Config.StatsOneLine, "stats-one-line", "", fs.Config.StatsOneLine, "Make the stats fit on one line.") + flags.BoolVarP(flagSet, &fs.Config.StatsOneLineDate, "stats-one-line-date", "", fs.Config.StatsOneLineDate, "Enables --stats-one-line and add current date/time prefix.") + flags.StringVarP(flagSet, &fs.Config.StatsOneLineDateFormat, "stats-one-line-date-format", "", fs.Config.StatsOneLineDateFormat, "Enables --stats-one-line-date and uses custom formatted date. Enclose date string in double quotes (\"). See https://golang.org/pkg/time/#Time.Format") flags.BoolVarP(flagSet, &fs.Config.Progress, "progress", "P", fs.Config.Progress, "Show progress during transfer.") flags.BoolVarP(flagSet, &fs.Config.Cookie, "use-cookies", "", fs.Config.Cookie, "Enable session cookiejar.") flags.BoolVarP(flagSet, &fs.Config.UseMmap, "use-mmap", "", fs.Config.UseMmap, "Use mmap allocator (see docs).") @@ -149,6 +151,15 @@ func SetFlags() { log.Fatalf(`Can only use --suffix with --backup-dir.`) } + switch { + case len(fs.Config.StatsOneLineDateFormat) > 0: + fs.Config.StatsOneLineDate = true + fs.Config.StatsOneLine = true + case fs.Config.StatsOneLineDate: + fs.Config.StatsOneLineDateFormat = "2006/01/02 15:04:05 - " + fs.Config.StatsOneLine = true + } + if bindAddr != "" { addrs, err := net.LookupIP(bindAddr) if err != nil {