package gitcmd import ( "strconv" "strings" ) type CountObjectsResult struct { Count int64 `json:"count"` Size int64 `json:"size"` InPack int64 `json:"in_pack"` Packs int64 `json:"packs"` SizePack int64 `json:"size_pack"` Garbage int64 `json:"garbage"` SizeGarbage int64 `json:"size_garbage"` } func (c CountObjectsResult) TotalSize() int64 { return c.Size + c.SizePack } func (r *Repository) CountObjects() (*CountObjectsResult, error) { out, _, err := NewCommand("count-objects", "-v"). WithDir(r.Path). RunStdString(r.ctx) if err != nil { return nil, err } return parseCountObjects(out), nil } func parseCountObjects(out string) *CountObjectsResult { res := &CountObjectsResult{} for _, line := range strings.Split(out, "\n") { key, val, ok := strings.Cut(line, ":") if !ok { continue } n, _ := strconv.ParseInt(strings.TrimSpace(val), 10, 64) switch strings.TrimSpace(key) { case "count": res.Count = n case "size": res.Size = n * 1024 case "in-pack": res.InPack = n case "packs": res.Packs = n case "size-pack": res.SizePack = n * 1024 case "garbage": res.Garbage = n case "size-garbage": res.SizeGarbage = n * 1024 } } return res }