Skip to content

Commit 9a6d78e

Browse files
zeripathwolfogre
andauthored
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 <[email protected]>
1 parent af8151c commit 9a6d78e

File tree

5 files changed

+42
-18
lines changed

5 files changed

+42
-18
lines changed

models/fixtures/repository.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
fork_id: 0
2525
is_template: false
2626
template_id: 0
27-
size: 0
27+
size: 6708
2828
is_fsck_enabled: true
2929
close_issues_via_commit_in_any_branch: false
3030

models/repo/update.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ func ChangeRepositoryName(doer *user_model.User, repo *Repository, newRepoName s
185185
return committer.Commit()
186186
}
187187

188-
// UpdateRepoSize updates the repository size, calculating it using util.GetDirectorySize
188+
// UpdateRepoSize updates the repository size, calculating it using getDirectorySize
189189
func UpdateRepoSize(ctx context.Context, repoID, size int64) error {
190190
_, err := db.GetEngine(ctx).ID(repoID).Cols("size").NoAutoTime().Update(&Repository{
191191
Size: size,

modules/repository/create.go

+30-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"fmt"
1010
"os"
1111
"path"
12+
"path/filepath"
1213
"strings"
1314

1415
"code.gitea.io/gitea/models"
@@ -286,9 +287,36 @@ func CreateRepository(doer, u *user_model.User, opts CreateRepoOptions) (*repo_m
286287
return repo, nil
287288
}
288289

289-
// UpdateRepoSize updates the repository size, calculating it using util.GetDirectorySize
290+
const notRegularFileMode = os.ModeSymlink | os.ModeNamedPipe | os.ModeSocket | os.ModeDevice | os.ModeCharDevice | os.ModeIrregular
291+
292+
// getDirectorySize returns the disk consumption for a given path
293+
func getDirectorySize(path string) (int64, error) {
294+
var size int64
295+
err := filepath.WalkDir(path, func(_ string, info os.DirEntry, err error) error {
296+
if err != nil {
297+
if os.IsNotExist(err) { // ignore the error because the file maybe deleted during traversing.
298+
return nil
299+
}
300+
return err
301+
}
302+
if info.IsDir() {
303+
return nil
304+
}
305+
f, err := info.Info()
306+
if err != nil {
307+
return err
308+
}
309+
if (f.Mode() & notRegularFileMode) == 0 {
310+
size += f.Size()
311+
}
312+
return err
313+
})
314+
return size, err
315+
}
316+
317+
// UpdateRepoSize updates the repository size, calculating it using getDirectorySize
290318
func UpdateRepoSize(ctx context.Context, repo *repo_model.Repository) error {
291-
size, err := util.GetDirectorySize(repo.RepoPath())
319+
size, err := getDirectorySize(repo.RepoPath())
292320
if err != nil {
293321
return fmt.Errorf("updateSize: %w", err)
294322
}

modules/repository/create_test.go

+10
Original file line numberDiff line numberDiff line change
@@ -169,3 +169,13 @@ func TestUpdateRepositoryVisibilityChanged(t *testing.T) {
169169
assert.NoError(t, err)
170170
assert.True(t, act.IsPrivate)
171171
}
172+
173+
func TestGetDirectorySize(t *testing.T) {
174+
assert.NoError(t, unittest.PrepareTestDatabase())
175+
repo, err := repo_model.GetRepositoryByID(1)
176+
assert.NoError(t, err)
177+
178+
size, err := getDirectorySize(repo.RepoPath())
179+
assert.NoError(t, err)
180+
assert.EqualValues(t, size, repo.Size)
181+
}

modules/util/path.go

-14
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,6 @@ func EnsureAbsolutePath(path, absoluteBase string) string {
2323
return filepath.Join(absoluteBase, path)
2424
}
2525

26-
const notRegularFileMode os.FileMode = os.ModeSymlink | os.ModeNamedPipe | os.ModeSocket | os.ModeDevice | os.ModeCharDevice | os.ModeIrregular
27-
28-
// GetDirectorySize returns the disk consumption for a given path
29-
func GetDirectorySize(path string) (int64, error) {
30-
var size int64
31-
err := filepath.Walk(path, func(_ string, info os.FileInfo, err error) error {
32-
if info != nil && (info.Mode()&notRegularFileMode) == 0 {
33-
size += info.Size()
34-
}
35-
return err
36-
})
37-
return size, err
38-
}
39-
4026
// IsDir returns true if given path is a directory,
4127
// or returns false when it's a file or does not exist.
4228
func IsDir(dir string) (bool, error) {

0 commit comments

Comments
 (0)