2
2
mirror of https://github.com/octoleo/restic.git synced 2024-06-08 12:00:49 +00:00

ui: update status for the backup command on non-interactive terminals

Allow the backup command to print status on non-interactive terminals.
The output is disabled by setting a MinUpdatePause == 0.
This commit is contained in:
Michael Eischer 2020-12-29 15:05:08 +01:00
parent 85fe5feadb
commit 684600cf42
3 changed files with 24 additions and 8 deletions

View File

@ -135,10 +135,10 @@ command:
Subcommands that support showing progress information such as ``backup``, Subcommands that support showing progress information such as ``backup``,
``check`` and ``prune`` will do so unless the quiet flag ``-q`` or ``check`` and ``prune`` will do so unless the quiet flag ``-q`` or
``--quiet`` is set. For interactive consoles the environment variable ``--quiet`` is set. When running from a non-interactive console progress
``RESTIC_PROGRESS_FPS`` can be used to control the frequency of progress reporting is disabled by default to not fill your logs. For interactive
reporting. When running from a non-interactive console progress reporting and non-interactive consoles the environment variable ``RESTIC_PROGRESS_FPS``
is disabled to not fill your logs. can be used to control the frequency of progress reporting.
Additionally, on Unix systems if ``restic`` receives a SIGUSR1 signal the Additionally, on Unix systems if ``restic`` receives a SIGUSR1 signal the
current progress will be written to the standard output so you can check up current progress will be written to the standard output so you can check up

View File

@ -90,7 +90,11 @@ func (b *Backup) Run(ctx context.Context) error {
defer t.Stop() defer t.Stop()
defer close(b.closed) defer close(b.closed)
// Reset status when finished // Reset status when finished
defer b.term.SetStatus([]string{""}) defer func() {
if b.term.CanUpdateStatus() {
b.term.SetStatus([]string{""})
}
}()
for { for {
select { select {
@ -132,7 +136,7 @@ func (b *Backup) Run(ctx context.Context) error {
} }
// limit update frequency // limit update frequency
if time.Since(lastUpdate) < b.MinUpdatePause { if time.Since(lastUpdate) < b.MinUpdatePause || b.MinUpdatePause == 0 {
continue continue
} }
lastUpdate = time.Now() lastUpdate = time.Now()

View File

@ -78,6 +78,11 @@ func New(wr io.Writer, errWriter io.Writer, disableStatus bool) *Terminal {
return t return t
} }
// CanUpdateStatus return whether the status output is updated in place.
func (t *Terminal) CanUpdateStatus() bool {
return t.canUpdateStatus
}
// Run updates the screen. It should be run in a separate goroutine. When // Run updates the screen. It should be run in a separate goroutine. When
// ctx is cancelled, the status lines are cleanly removed. // ctx is cancelled, the status lines are cleanly removed.
func (t *Terminal) Run(ctx context.Context) { func (t *Terminal) Run(ctx context.Context) {
@ -203,8 +208,15 @@ func (t *Terminal) runWithoutStatus(ctx context.Context) {
fmt.Fprintf(os.Stderr, "flush failed: %v\n", err) fmt.Fprintf(os.Stderr, "flush failed: %v\n", err)
} }
case <-t.status: case stat := <-t.status:
// discard status lines for _, line := range stat.lines {
// ensure that each line ends with newline
withNewline := strings.TrimRight(line, "\n") + "\n"
fmt.Fprint(t.wr, withNewline)
}
if err := t.wr.Flush(); err != nil {
fmt.Fprintf(os.Stderr, "flush failed: %v\n", err)
}
} }
} }
} }