diff --git a/lib/config/size.go b/lib/config/size.go index 60081b7c9..0388941c5 100644 --- a/lib/config/size.go +++ b/lib/config/size.go @@ -87,11 +87,26 @@ func CheckFreeSpace(req Size, usage fs.Usage) error { if req.Percentage() { freePct := (float64(usage.Free) / float64(usage.Total)) * 100 if freePct < val { - return fmt.Errorf("%f %% < %v", freePct, req) + return fmt.Errorf("%.1f %% < %v", freePct, req) } } 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 } + +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)) + } +} diff --git a/lib/config/size_test.go b/lib/config/size_test.go index 598c13981..c567b22c9 100644 --- a/lib/config/size_test.go +++ b/lib/config/size_test.go @@ -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) + } + } +}