diff options
author | zeripath <art27@cantab.net> | 2023-01-16 22:07:06 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-16 16:07:06 -0600 |
commit | 9a6d78eaa89ffbf60a1f579bd220fe0cfb720e3b (patch) | |
tree | 44bca326c92c8a42f943e1d6219ac95a9e9d15da | |
parent | af8151cbb9e62cf60b2d9276fab2564c5cede45b (diff) | |
download | gitea-9a6d78eaa89ffbf60a1f579bd220fe0cfb720e3b.tar.gz gitea-9a6d78eaa89ffbf60a1f579bd220fe0cfb720e3b.zip |
Fix error when calculate the repository size (#22392) (#22474)
Backport #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>
-rw-r--r-- | models/fixtures/repository.yml | 2 | ||||
-rw-r--r-- | models/repo/update.go | 2 | ||||
-rw-r--r-- | modules/repository/create.go | 32 | ||||
-rw-r--r-- | modules/repository/create_test.go | 10 | ||||
-rw-r--r-- | modules/util/path.go | 14 |
5 files changed, 42 insertions, 18 deletions
diff --git a/models/fixtures/repository.yml b/models/fixtures/repository.yml index f09953be7e..386904683a 100644 --- a/models/fixtures/repository.yml +++ b/models/fixtures/repository.yml @@ -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 diff --git a/models/repo/update.go b/models/repo/update.go index cc21deb0bc..3d538a4454 100644 --- a/models/repo/update.go +++ b/models/repo/update.go @@ -185,7 +185,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, diff --git a/modules/repository/create.go b/modules/repository/create.go index 1fec0335a2..d4269ff8b8 100644 --- a/modules/repository/create.go +++ b/modules/repository/create.go @@ -9,6 +9,7 @@ import ( "fmt" "os" "path" + "path/filepath" "strings" "code.gitea.io/gitea/models" @@ -286,9 +287,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) } diff --git a/modules/repository/create_test.go b/modules/repository/create_test.go index 3040782845..ff70468db1 100644 --- a/modules/repository/create_test.go +++ b/modules/repository/create_test.go @@ -169,3 +169,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(1) + assert.NoError(t, err) + + size, err := getDirectorySize(repo.RepoPath()) + assert.NoError(t, err) + assert.EqualValues(t, size, repo.Size) +} diff --git a/modules/util/path.go b/modules/util/path.go index 3d4ddec21c..ac2b82acfe 100644 --- a/modules/util/path.go +++ b/modules/util/path.go @@ -23,20 +23,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) { |