]> source.dussan.org Git - gitea.git/commitdiff
Stop using git count-objects and use raw directory size for repository (#8848)
authorzeripath <art27@cantab.net>
Sun, 10 Nov 2019 21:33:47 +0000 (21:33 +0000)
committerGitHub <noreply@github.com>
Sun, 10 Nov 2019 21:33:47 +0000 (21:33 +0000)
* Migrate from git count-objects to a raw directory size
* As per @guillep2k ignore unusual files

models/migrations/v28.go
models/repo.go
modules/git/repo.go
modules/util/path.go

index 587e944ce64e5ec432e4c5146591853f7f078b32..a849fea3c23cf2fbf556d7e93ff71ce2500712c0 100644 (file)
@@ -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"
-                       countObject, err := git.GetRepoSize(repoPath)
+                       countObject, err := git.CountObjects(repoPath)
                        if err != nil {
-                               log.Warn("GetRepoSize: %v", err)
+                               log.Warn("CountObjects: %v", err)
                                continue
                        }
 
index 90918025fb9a0c5787697d32830350b787c87847..d79a8fdf6106edf9a1a6b102a29912e403f2350d 100644 (file)
@@ -36,6 +36,7 @@ import (
        api "code.gitea.io/gitea/modules/structs"
        "code.gitea.io/gitea/modules/sync"
        "code.gitea.io/gitea/modules/timeutil"
+       "code.gitea.io/gitea/modules/util"
 
        "github.com/mcuadros/go-version"
        "github.com/unknwon/com"
@@ -708,17 +709,17 @@ func (repo *Repository) IsOwnedBy(userID int64) bool {
 }
 
 func (repo *Repository) updateSize(e Engine) error {
-       repoInfoSize, err := git.GetRepoSize(repo.repoPath(e))
+       size, err := util.GetDirectorySize(repo.repoPath(e))
        if err != nil {
                return fmt.Errorf("UpdateSize: %v", err)
        }
 
-       repo.Size = repoInfoSize.Size + repoInfoSize.SizePack
+       repo.Size = size
        _, err = e.ID(repo.ID).Cols("size").Update(repo)
        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 {
        return repo.updateSize(x)
 }
index 4c6690b9133e56969bd6cc64cc713dc388037efa..80f61097724e63bdffc03f716759297a61d8db90 100644 (file)
@@ -304,8 +304,8 @@ const (
        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")
        stdout, err := cmd.RunInDir(repoPath)
        if err != nil {
index f79334209cd4f9b25f903cb2b24c961952fae6e7..2b198eb6dc6e24f38d413892a2379c5a25f34bb0 100644 (file)
@@ -4,7 +4,10 @@
 
 package util
 
-import "path/filepath"
+import (
+       "os"
+       "path/filepath"
+)
 
 // EnsureAbsolutePath ensure that a path is absolute, making it
 // relative to absoluteBase if necessary
@@ -14,3 +17,17 @@ func EnsureAbsolutePath(path string, absoluteBase string) string {
        }
        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()&notRegularFileMode) == 0 {
+                       size += info.Size()
+               }
+               return err
+       })
+       return size, err
+}