mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Stop using git count-objects and use raw directory size for repository (#8848)
* Migrate from git count-objects to a raw directory size * As per @guillep2k ignore unusual files
This commit is contained in:
		@@ -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
 | 
					// CountObjects returns the results of git count-objects on the repoPath
 | 
				
			||||||
func GetRepoSize(repoPath string) (*CountObject, error) {
 | 
					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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user