mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Fix error when calculate the repository size (#22392)
Fix #22386 `GetDirectorySize` moved as `getDirectorySize` because it becomes a special function which should not be put in `util`. Co-authored-by: Jason Song <i@wolfogre.com>
This commit is contained in:
		@@ -24,7 +24,7 @@
 | 
			
		||||
  fork_id: 0
 | 
			
		||||
  is_template: false
 | 
			
		||||
  template_id: 0
 | 
			
		||||
  size: 0
 | 
			
		||||
  size: 6708
 | 
			
		||||
  is_fsck_enabled: true
 | 
			
		||||
  close_issues_via_commit_in_any_branch: false
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -184,7 +184,7 @@ func ChangeRepositoryName(doer *user_model.User, repo *Repository, newRepoName s
 | 
			
		||||
	return committer.Commit()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UpdateRepoSize updates the repository size, calculating it using util.GetDirectorySize
 | 
			
		||||
// UpdateRepoSize updates the repository size, calculating it using getDirectorySize
 | 
			
		||||
func UpdateRepoSize(ctx context.Context, repoID, size int64) error {
 | 
			
		||||
	_, err := db.GetEngine(ctx).ID(repoID).Cols("size").NoAutoTime().Update(&Repository{
 | 
			
		||||
		Size: size,
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,7 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models"
 | 
			
		||||
@@ -285,9 +286,36 @@ func CreateRepository(doer, u *user_model.User, opts CreateRepoOptions) (*repo_m
 | 
			
		||||
	return repo, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UpdateRepoSize updates the repository size, calculating it using util.GetDirectorySize
 | 
			
		||||
const notRegularFileMode = os.ModeSymlink | os.ModeNamedPipe | os.ModeSocket | os.ModeDevice | os.ModeCharDevice | os.ModeIrregular
 | 
			
		||||
 | 
			
		||||
// getDirectorySize returns the disk consumption for a given path
 | 
			
		||||
func getDirectorySize(path string) (int64, error) {
 | 
			
		||||
	var size int64
 | 
			
		||||
	err := filepath.WalkDir(path, func(_ string, info os.DirEntry, err error) error {
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			if os.IsNotExist(err) { // ignore the error because the file maybe deleted during traversing.
 | 
			
		||||
				return nil
 | 
			
		||||
			}
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		if info.IsDir() {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		f, err := info.Info()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		if (f.Mode() & notRegularFileMode) == 0 {
 | 
			
		||||
			size += f.Size()
 | 
			
		||||
		}
 | 
			
		||||
		return err
 | 
			
		||||
	})
 | 
			
		||||
	return size, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UpdateRepoSize updates the repository size, calculating it using getDirectorySize
 | 
			
		||||
func UpdateRepoSize(ctx context.Context, repo *repo_model.Repository) error {
 | 
			
		||||
	size, err := util.GetDirectorySize(repo.RepoPath())
 | 
			
		||||
	size, err := getDirectorySize(repo.RepoPath())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("updateSize: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -168,3 +168,13 @@ func TestUpdateRepositoryVisibilityChanged(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.True(t, act.IsPrivate)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestGetDirectorySize(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
	repo, err := repo_model.GetRepositoryByID(db.DefaultContext, 1)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	size, err := getDirectorySize(repo.RepoPath())
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.EqualValues(t, size, repo.Size)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -22,20 +22,6 @@ func EnsureAbsolutePath(path, absoluteBase string) string {
 | 
			
		||||
	return filepath.Join(absoluteBase, path)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const notRegularFileMode os.FileMode = os.ModeSymlink | os.ModeNamedPipe | os.ModeSocket | os.ModeDevice | os.ModeCharDevice | os.ModeIrregular
 | 
			
		||||
 | 
			
		||||
// GetDirectorySize returns the 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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsDir returns true if given path is a directory,
 | 
			
		||||
// or returns false when it's a file or does not exist.
 | 
			
		||||
func IsDir(dir string) (bool, error) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user