mirror of
https://github.com/octoleo/restic.git
synced 2024-11-25 06:07:44 +00:00
termstatus: test status line sanitization
This commit is contained in:
parent
bb40e49e75
commit
6d10c655a0
8
changelog/unreleased/pull-4318
Normal file
8
changelog/unreleased/pull-4318
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
Bugfix: Correctly clean up status bar output of the `backup` command
|
||||||
|
|
||||||
|
Due to a regression in restic 0.15.2, the status bar of the `backup` command
|
||||||
|
could leave some output behind. This happened if filenames were printed that
|
||||||
|
are wider than the current terminal width. This has been fixed.
|
||||||
|
|
||||||
|
https://github.com/restic/restic/issues/4319
|
||||||
|
https://github.com/restic/restic/pull/4318
|
@ -334,6 +334,21 @@ func wideRune(s string) (wide bool, utfsize uint) {
|
|||||||
return wide, uint(size)
|
return wide, uint(size)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func sanitizeLines(lines []string, width int) []string {
|
||||||
|
// Sanitize lines and truncate them if they're too long.
|
||||||
|
for i, line := range lines {
|
||||||
|
line = Quote(line)
|
||||||
|
if width > 0 {
|
||||||
|
line = Truncate(line, width-2)
|
||||||
|
}
|
||||||
|
if i < len(lines)-1 { // Last line gets no line break.
|
||||||
|
line += "\n"
|
||||||
|
}
|
||||||
|
lines[i] = line
|
||||||
|
}
|
||||||
|
return lines
|
||||||
|
}
|
||||||
|
|
||||||
// SetStatus updates the status lines.
|
// SetStatus updates the status lines.
|
||||||
// The lines should not contain newlines; this method adds them.
|
// The lines should not contain newlines; this method adds them.
|
||||||
func (t *Terminal) SetStatus(lines []string) {
|
func (t *Terminal) SetStatus(lines []string) {
|
||||||
@ -352,17 +367,7 @@ func (t *Terminal) SetStatus(lines []string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sanitize lines and truncate them if they're too long.
|
sanitizeLines(lines, width)
|
||||||
for i, line := range lines {
|
|
||||||
line = Quote(line)
|
|
||||||
if width > 0 {
|
|
||||||
line = Truncate(line, width-2)
|
|
||||||
}
|
|
||||||
if i < len(lines)-1 { // Last line gets no line break.
|
|
||||||
line += "\n"
|
|
||||||
}
|
|
||||||
lines[i] = line
|
|
||||||
}
|
|
||||||
|
|
||||||
select {
|
select {
|
||||||
case t.status <- status{lines: lines}:
|
case t.status <- status{lines: lines}:
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package termstatus
|
package termstatus
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
@ -91,3 +92,26 @@ func BenchmarkTruncateUnicode(b *testing.B) {
|
|||||||
|
|
||||||
benchmarkTruncate(b, s, w-1)
|
benchmarkTruncate(b, s, w-1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSanitizeLines(t *testing.T) {
|
||||||
|
var tests = []struct {
|
||||||
|
input []string
|
||||||
|
width int
|
||||||
|
output []string
|
||||||
|
}{
|
||||||
|
{[]string{""}, 80, []string{""}},
|
||||||
|
{[]string{"too long test line"}, 10, []string{"too long"}},
|
||||||
|
{[]string{"too long test line", "text"}, 10, []string{"too long\n", "text"}},
|
||||||
|
{[]string{"too long test line", "second long test line"}, 10, []string{"too long\n", "second l"}},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tests {
|
||||||
|
t.Run("", func(t *testing.T) {
|
||||||
|
out := sanitizeLines(test.input, test.width)
|
||||||
|
if !reflect.DeepEqual(out, test.output) {
|
||||||
|
t.Fatalf("wrong output for input %v, width %d: want %q, got %q",
|
||||||
|
test.input, test.width, test.output, out)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user