Show repository sizes in list
`list -a` had sizes because archives are files; repositories are directories, and a long listing reports the inode size for those -- 4096 for every single one. Taking that number would have filled the column with the same meaningless value, so the real disk usage is asked of `du` instead, appended to the same remote command so it still costs one round trip. The column is dropped entirely when no usable sizes come back, rather than showing a column of zeroes, so a server without a working `du` degrades to the previous output. The summary line carries the total. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -943,3 +943,45 @@ func TestExpandAlias(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestSplitAtMarker(t *testing.T) {
|
||||
lines := []string{"a", "b", "---mgsh---", "c", "d"}
|
||||
before, after := splitAtMarker(lines, "---mgsh---")
|
||||
if strings.Join(before, ",") != "a,b" || strings.Join(after, ",") != "c,d" {
|
||||
t.Errorf("split = %v / %v", before, after)
|
||||
}
|
||||
// no marker: everything is the first section, so a server that produced no
|
||||
// du output simply yields no sizes
|
||||
before, after = splitAtMarker([]string{"a", "b"}, "---mgsh---")
|
||||
if strings.Join(before, ",") != "a,b" || after != nil {
|
||||
t.Errorf("split without marker = %v / %v", before, after)
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseDuSizes(t *testing.T) {
|
||||
lines := []string{
|
||||
"185432\tBetaflight3.0.0.git",
|
||||
"2144\twebsite.git",
|
||||
"876 spaced-with-blanks.git", // some du implementations use spaces
|
||||
"1024\t./with-dot-slash.git",
|
||||
"1500\tmy project.git", // a name with a space survives
|
||||
"garbage",
|
||||
"",
|
||||
}
|
||||
got := parseDuSizes(lines)
|
||||
want := map[string]int64{
|
||||
"Betaflight3.0.0.git": 185432 * 1024,
|
||||
"website.git": 2144 * 1024,
|
||||
"spaced-with-blanks.git": 876 * 1024,
|
||||
"with-dot-slash.git": 1024 * 1024,
|
||||
"my project.git": 1500 * 1024,
|
||||
}
|
||||
if len(got) != len(want) {
|
||||
t.Fatalf("parseDuSizes = %v, want %d entries", got, len(want))
|
||||
}
|
||||
for k, v := range want {
|
||||
if got[k] != v {
|
||||
t.Errorf("parseDuSizes[%q] = %d, want %d", k, got[k], v)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user