diff --git a/modules/git/repo.go b/modules/git/repo.go index 0e96ef68d8..3fbec66429 100644 --- a/modules/git/repo.go +++ b/modules/git/repo.go @@ -248,26 +248,11 @@ const ( statSizeGarbage = "size-garbage: " ) -// CountObjects returns the results of git count-objects on the repoPath -func CountObjects(ctx context.Context, repoPath string) (*CountObject, error) { - return CountObjectsWithEnv(ctx, repoPath, nil) -} - -// CountObjectsWithEnv returns the results of git count-objects on the repoPath with custom env setup -func CountObjectsWithEnv(ctx context.Context, repoPath string, env []string) (*CountObject, error) { - cmd := gitcmd.NewCommand("count-objects", "-v") - stdout, _, err := cmd.WithDir(repoPath).WithEnv(env).RunStdString(ctx) - if err != nil { - return nil, err - } - - return parseSize(stdout), nil -} - -// parseSize parses the output from count-objects and return a CountObject -func parseSize(objects string) *CountObject { +// ParseCountObjectsResult parses the output from git count-objects -v +// and returns a CountObject struct with the parsed values +func ParseCountObjectsResult(output string) *CountObject { repoSize := new(CountObject) - for line := range strings.SplitSeq(objects, "\n") { + for line := range strings.SplitSeq(output, "\n") { switch { case strings.HasPrefix(line, statCount): repoSize.Count, _ = strconv.ParseInt(line[7:], 10, 64) diff --git a/modules/gitrepo/size.go b/modules/gitrepo/size.go index 7524bb2542..b3f741dae5 100644 --- a/modules/gitrepo/size.go +++ b/modules/gitrepo/size.go @@ -4,8 +4,12 @@ package gitrepo import ( + "context" "os" "path/filepath" + + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/git/gitcmd" ) const notRegularFileMode = os.ModeSymlink | os.ModeNamedPipe | os.ModeSocket | os.ModeDevice | os.ModeCharDevice | os.ModeIrregular @@ -35,3 +39,20 @@ func CalcRepositorySize(repo Repository) (int64, error) { }) return size, err } + +// CountObjects returns the results of git count-objects on the repository +func CountObjects(ctx context.Context, repo Repository) (*git.CountObject, error) { + return CountObjectsWithEnv(ctx, repo, nil) +} + +// CountObjectsWithEnv returns the results of git count-objects on the repository +// with custom environment variables (e.g., GIT_QUARANTINE_PATH for pre-receive hooks) +func CountObjectsWithEnv(ctx context.Context, repo Repository, env []string) (*git.CountObject, error) { + cmd := gitcmd.NewCommand("count-objects", "-v") + stdout, _, err := cmd.WithDir(repoPath(repo)).WithEnv(env).RunStdString(ctx) + if err != nil { + return nil, err + } + + return git.ParseCountObjectsResult(stdout), nil +} diff --git a/routers/private/hook_pre_receive.go b/routers/private/hook_pre_receive.go index 76920f575b..7863d7c016 100644 --- a/routers/private/hook_pre_receive.go +++ b/routers/private/hook_pre_receive.go @@ -547,7 +547,7 @@ func HookPreReceive(ctx *gitea_context.PrivateContext) { // Only do CountObjects (push/repo) when we're doing the repo-size limit at all if needGitDelta { - repoSize, err = git.CountObjects(ctx, repo.RepoPath()) + repoSize, err = gitrepo.CountObjects(ctx, repo) if err != nil { log.Error("Unable to get repository size with env %v: %s Error: %v", repo.RepoPath(), ourCtx.env, err) ctx.JSON(http.StatusInternalServerError, map[string]any{ @@ -556,7 +556,7 @@ func HookPreReceive(ctx *gitea_context.PrivateContext) { return } - pushSize, err = git.CountObjectsWithEnv(ctx, repo.RepoPath(), ourCtx.env) + pushSize, err = gitrepo.CountObjectsWithEnv(ctx, repo, ourCtx.env) if err != nil { log.Error("Unable to get push size with env %v: %s Error: %v", repo.RepoPath(), ourCtx.env, err) ctx.JSON(http.StatusInternalServerError, map[string]any{