59 lines
1.2 KiB
Go
59 lines
1.2 KiB
Go
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
|
|
}
|