* Migrate from git count-objects to a raw directory size * As per @guillep2k ignore unusual filestags/v1.21.12.1
| @@ -60,9 +60,9 @@ func addRepoSize(x *xorm.Engine) (err error) { | |||||
| } | } | ||||
| repoPath := filepath.Join(setting.RepoRootPath, strings.ToLower(user.Name), strings.ToLower(repo.Name)) + ".git" | repoPath := filepath.Join(setting.RepoRootPath, strings.ToLower(user.Name), strings.ToLower(repo.Name)) + ".git" | ||||
| countObject, err := git.GetRepoSize(repoPath) | |||||
| countObject, err := git.CountObjects(repoPath) | |||||
| if err != nil { | if err != nil { | ||||
| log.Warn("GetRepoSize: %v", err) | |||||
| log.Warn("CountObjects: %v", err) | |||||
| continue | continue | ||||
| } | } | ||||
| @@ -36,6 +36,7 @@ import ( | |||||
| api "code.gitea.io/gitea/modules/structs" | api "code.gitea.io/gitea/modules/structs" | ||||
| "code.gitea.io/gitea/modules/sync" | "code.gitea.io/gitea/modules/sync" | ||||
| "code.gitea.io/gitea/modules/timeutil" | "code.gitea.io/gitea/modules/timeutil" | ||||
| "code.gitea.io/gitea/modules/util" | |||||
| "github.com/mcuadros/go-version" | "github.com/mcuadros/go-version" | ||||
| "github.com/unknwon/com" | "github.com/unknwon/com" | ||||
| @@ -708,17 +709,17 @@ func (repo *Repository) IsOwnedBy(userID int64) bool { | |||||
| } | } | ||||
| func (repo *Repository) updateSize(e Engine) error { | func (repo *Repository) updateSize(e Engine) error { | ||||
| repoInfoSize, err := git.GetRepoSize(repo.repoPath(e)) | |||||
| size, err := util.GetDirectorySize(repo.repoPath(e)) | |||||
| if err != nil { | if err != nil { | ||||
| return fmt.Errorf("UpdateSize: %v", err) | return fmt.Errorf("UpdateSize: %v", err) | ||||
| } | } | ||||
| repo.Size = repoInfoSize.Size + repoInfoSize.SizePack | |||||
| repo.Size = size | |||||
| _, err = e.ID(repo.ID).Cols("size").Update(repo) | _, err = e.ID(repo.ID).Cols("size").Update(repo) | ||||
| return err | return err | ||||
| } | } | ||||
| // UpdateSize updates the repository size, calculating it using git.GetRepoSize | |||||
| // UpdateSize updates the repository size, calculating it using util.GetDirectorySize | |||||
| func (repo *Repository) UpdateSize() error { | func (repo *Repository) UpdateSize() error { | ||||
| return repo.updateSize(x) | return repo.updateSize(x) | ||||
| } | } | ||||
| @@ -304,8 +304,8 @@ const ( | |||||
| statSizeGarbage = "size-garbage: " | statSizeGarbage = "size-garbage: " | ||||
| ) | ) | ||||
| // GetRepoSize returns disk consumption for repo in path | |||||
| func GetRepoSize(repoPath string) (*CountObject, error) { | |||||
| // CountObjects returns the results of git count-objects on the repoPath | |||||
| func CountObjects(repoPath string) (*CountObject, error) { | |||||
| cmd := NewCommand("count-objects", "-v") | cmd := NewCommand("count-objects", "-v") | ||||
| stdout, err := cmd.RunInDir(repoPath) | stdout, err := cmd.RunInDir(repoPath) | ||||
| if err != nil { | if err != nil { | ||||
| @@ -4,7 +4,10 @@ | |||||
| package util | package util | ||||
| import "path/filepath" | |||||
| import ( | |||||
| "os" | |||||
| "path/filepath" | |||||
| ) | |||||
| // EnsureAbsolutePath ensure that a path is absolute, making it | // EnsureAbsolutePath ensure that a path is absolute, making it | ||||
| // relative to absoluteBase if necessary | // relative to absoluteBase if necessary | ||||
| @@ -14,3 +17,17 @@ func EnsureAbsolutePath(path string, absoluteBase string) string { | |||||
| } | } | ||||
| return filepath.Join(absoluteBase, path) | return filepath.Join(absoluteBase, path) | ||||
| } | } | ||||
| const notRegularFileMode os.FileMode = os.ModeDir | os.ModeSymlink | os.ModeNamedPipe | os.ModeSocket | os.ModeDevice | os.ModeCharDevice | os.ModeIrregular | |||||
| // GetDirectorySize returns the dumb disk consumption for a given path | |||||
| func GetDirectorySize(path string) (int64, error) { | |||||
| var size int64 | |||||
| err := filepath.Walk(path, func(_ string, info os.FileInfo, err error) error { | |||||
| if info != nil && (info.Mode()¬RegularFileMode) == 0 { | |||||
| size += info.Size() | |||||
| } | |||||
| return err | |||||
| }) | |||||
| return size, err | |||||
| } | |||||