lib/config: Format bytes in insufficient space errors (fixes #5920) (#5921)

This commit is contained in:
Jakob Borg 2019-08-02 14:43:05 +02:00 committed by GitHub
parent 1475c0344a
commit 61b9f7bd55
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 56 additions and 2 deletions

View File

@ -87,11 +87,26 @@ func CheckFreeSpace(req Size, usage fs.Usage) error {
if req.Percentage() { if req.Percentage() {
freePct := (float64(usage.Free) / float64(usage.Total)) * 100 freePct := (float64(usage.Free) / float64(usage.Total)) * 100
if freePct < val { if freePct < val {
return fmt.Errorf("%f %% < %v", freePct, req) return fmt.Errorf("%.1f %% < %v", freePct, req)
} }
} else if float64(usage.Free) < val { } else if float64(usage.Free) < val {
return fmt.Errorf("%v < %v", usage.Free, req) return fmt.Errorf("%sB < %v", formatSI(usage.Free), req)
} }
return nil return nil
} }
func formatSI(b int64) string {
switch {
case b < 1000:
return fmt.Sprintf("%d ", b)
case b < 1000*1000:
return fmt.Sprintf("%.1f K", float64(b)/1000)
case b < 1000*1000*1000:
return fmt.Sprintf("%.1f M", float64(b)/(1000*1000))
case b < 1000*1000*1000*1000:
return fmt.Sprintf("%.1f G", float64(b)/(1000*1000*1000))
default:
return fmt.Sprintf("%.1f T", float64(b)/(1000*1000*1000*1000))
}
}

View File

@ -91,3 +91,42 @@ func TestParseSize(t *testing.T) {
} }
} }
} }
func TestFormatSI(t *testing.T) {
cases := []struct {
bytes int64
result string
}{
{
bytes: 0,
result: "0 ", // space for unit
},
{
bytes: 999,
result: "999 ",
},
{
bytes: 1000,
result: "1.0 K",
},
{
bytes: 1023 * 1000,
result: "1.0 M",
},
{
bytes: 5 * 1000 * 1000 * 1000,
result: "5.0 G",
},
{
bytes: 50000 * 1000 * 1000 * 1000 * 1000,
result: "50000.0 T",
},
}
for _, tc := range cases {
res := formatSI(tc.bytes)
if res != tc.result {
t.Errorf("formatSI(%d) => %q, expected %q", tc.bytes, res, tc.result)
}
}
}