0
0
mirror of https://github.com/go-gitea/gitea.git synced 2026-05-16 21:17:26 +02:00

move of sizerelated CountObjects, CountObjectsWithEnv to modules/gitrepo/size.go and to use Repository interface

This commit is contained in:
DmitryFrolovTri 2026-01-22 16:23:50 +00:00
parent d2beb1d0d4
commit 3dcfd233a8
3 changed files with 27 additions and 21 deletions

View File

@ -248,26 +248,11 @@ const (
statSizeGarbage = "size-garbage: " statSizeGarbage = "size-garbage: "
) )
// CountObjects returns the results of git count-objects on the repoPath // ParseCountObjectsResult parses the output from git count-objects -v
func CountObjects(ctx context.Context, repoPath string) (*CountObject, error) { // and returns a CountObject struct with the parsed values
return CountObjectsWithEnv(ctx, repoPath, nil) func ParseCountObjectsResult(output string) *CountObject {
}
// 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 {
repoSize := new(CountObject) repoSize := new(CountObject)
for line := range strings.SplitSeq(objects, "\n") { for line := range strings.SplitSeq(output, "\n") {
switch { switch {
case strings.HasPrefix(line, statCount): case strings.HasPrefix(line, statCount):
repoSize.Count, _ = strconv.ParseInt(line[7:], 10, 64) repoSize.Count, _ = strconv.ParseInt(line[7:], 10, 64)

View File

@ -4,8 +4,12 @@
package gitrepo package gitrepo
import ( import (
"context"
"os" "os"
"path/filepath" "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 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 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
}

View File

@ -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 // Only do CountObjects (push/repo) when we're doing the repo-size limit at all
if needGitDelta { if needGitDelta {
repoSize, err = git.CountObjects(ctx, repo.RepoPath()) repoSize, err = gitrepo.CountObjects(ctx, repo)
if err != nil { if err != nil {
log.Error("Unable to get repository size with env %v: %s Error: %v", repo.RepoPath(), ourCtx.env, err) 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{ ctx.JSON(http.StatusInternalServerError, map[string]any{
@ -556,7 +556,7 @@ func HookPreReceive(ctx *gitea_context.PrivateContext) {
return return
} }
pushSize, err = git.CountObjectsWithEnv(ctx, repo.RepoPath(), ourCtx.env) pushSize, err = gitrepo.CountObjectsWithEnv(ctx, repo, ourCtx.env)
if err != nil { if err != nil {
log.Error("Unable to get push size with env %v: %s Error: %v", repo.RepoPath(), ourCtx.env, err) 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{ ctx.JSON(http.StatusInternalServerError, map[string]any{