From c16ad5643a9c9123a4798d49ccb101c4c8318383 Mon Sep 17 00:00:00 2001 From: DmitryFrolovTri <23313323+DmitryFrolovTri@users.noreply.github.com> Date: Wed, 21 Jan 2026 09:44:52 +0000 Subject: [PATCH] refactor handling of -1 from base to business logic and UI for sizelimit working --- modules/base/tool.go | 13 ++++----- modules/setting/repository.go | 27 +++++++++++++++++++ options/locale/locale_en-US.json | 1 + routers/private/hook_pre_receive.go | 4 +-- routers/web/admin/repos.go | 13 +++++---- services/forms/repo_form.go | 4 +-- services/lfs/server.go | 8 +++--- templates/admin/repo/list.tmpl | 42 +++++++++++------------------ 8 files changed, 64 insertions(+), 48 deletions(-) diff --git a/modules/base/tool.go b/modules/base/tool.go index bae62c491cd..8446f6904c2 100644 --- a/modules/base/tool.go +++ b/modules/base/tool.go @@ -93,21 +93,18 @@ func CreateTimeLimitCode[T time.Time | string](data string, minutes int, startTi // FileSize calculates the file size and generate user-friendly string. func FileSize(s int64) string { - if s == -1 { - return "-1" - } return humanize.IBytes(uint64(s)) } -// Get FileSize bytes value from String. +// GetFileSize gets FileSize bytes value from String. func GetFileSize(s string) (int64, error) { s = strings.TrimSpace(s) - if s == "-1" { - return -1, nil + // default to bytes if no unit is provided + if _, err := strconv.ParseInt(s, 10, 64); err == nil { + s += " B" } v, err := humanize.ParseBytes(s) - iv := int64(v) - return iv, err + return int64(v), err } // StringsToInt64s converts a slice of string to a slice of int64. diff --git a/modules/setting/repository.go b/modules/setting/repository.go index 1ab7b32fb57..27bd3563654 100644 --- a/modules/setting/repository.go +++ b/modules/setting/repository.go @@ -6,6 +6,7 @@ package setting import ( "os/exec" "path/filepath" + "strconv" "strings" "code.gitea.io/gitea/modules/log" @@ -284,6 +285,32 @@ func UpdateGlobalRepositoryLimit(gitSizeMax, lfsSizeMax int64) { Repository.LFSSizeMax = lfsSizeMax } +// FormatRepositorySizeLimit formats a repository size limit for display. +// Returns "-1" for disabled limits (when sizeInBytes is -1), +// otherwise returns human-readable size using base.FileSize. +func FormatRepositorySizeLimit(sizeInBytes int64) string { + if sizeInBytes == -1 { + return "-1" + } + return humanize.IBytes(uint64(sizeInBytes)) +} + +// ParseRepositorySizeLimit parses a repository size limit string. +// Accepts "-1" to disable the limit, otherwise parses as a byte size. +// Returns the size in bytes or an error if parsing fails. +func ParseRepositorySizeLimit(s string) (int64, error) { + s = strings.TrimSpace(s) + if s == "-1" { + return -1, nil + } + // default to bytes if no unit is provided + if _, err := strconv.ParseInt(s, 10, 64); err == nil { + s += " B" + } + v, err := humanize.ParseBytes(s) + return int64(v), err +} + func parseSize(sec ConfigSection, key string, def int64) int64 { v := sec.Key(key).MustString("") if v == "" { diff --git a/options/locale/locale_en-US.json b/options/locale/locale_en-US.json index 7b8395d17ac..5249310bb79 100644 --- a/options/locale/locale_en-US.json +++ b/options/locale/locale_en-US.json @@ -3067,6 +3067,7 @@ "repos.git_size_max_helper": "Maximum Git size allowed for a single repository. Set to -1 for unlimited.", "repos.lfs_size_max": "Max LFS Size (Global)", "repos.lfs_size_max_helper": "Maximum LFS size allowed for a single repository. Set to -1 for unlimited.", + "repos.update_settings": "Update Settings", "repos.update_success": "Global repository limits have been updated.", "packages.package_manage_panel": "Package Management", "packages.total_size": "Total Size: %s", diff --git a/routers/private/hook_pre_receive.go b/routers/private/hook_pre_receive.go index edf0ea01f3b..a76d146dc71 100644 --- a/routers/private/hook_pre_receive.go +++ b/routers/private/hook_pre_receive.go @@ -835,8 +835,8 @@ func HookPreReceive(ctx *gitea_context.PrivateContext) { repo.OwnerName, repo.Name, base.FileSize(predictedGitAfter), base.FileSize(currentGit), base.FileSize(gitDelta), base.FileSize(predictedLFSAfter), base.FileSize(currentLFS), base.FileSize(lfsDelta), - base.FileSize(setting.Repository.GitSizeMax), - base.FileSize(setting.Repository.LFSSizeMax), + setting.FormatRepositorySizeLimit(setting.Repository.GitSizeMax), + setting.FormatRepositorySizeLimit(setting.Repository.LFSSizeMax), ) } diff --git a/routers/web/admin/repos.go b/routers/web/admin/repos.go index 550caac3a62..34c15e6ecb3 100644 --- a/routers/web/admin/repos.go +++ b/routers/web/admin/repos.go @@ -11,7 +11,6 @@ import ( "code.gitea.io/gitea/models/db" repo_model "code.gitea.io/gitea/models/repo" user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/templates" @@ -33,8 +32,11 @@ func Repos(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("admin.repositories") ctx.Data["PageIsAdminRepositories"] = true - ctx.Data["GitSizeMax"] = base.FileSize(setting.Repository.GitSizeMax) - ctx.Data["LFSSizeMax"] = base.FileSize(setting.Repository.LFSSizeMax) + gitSizeStr := setting.FormatRepositorySizeLimit(setting.Repository.GitSizeMax) + lfsSizeStr := setting.FormatRepositorySizeLimit(setting.Repository.LFSSizeMax) + log.Trace("Repos: GitSizeMax=%d -> %s, LFSSizeMax=%d -> %s", setting.Repository.GitSizeMax, gitSizeStr, setting.Repository.LFSSizeMax, lfsSizeStr) + ctx.Data["GitSizeMax"] = gitSizeStr + ctx.Data["LFSSizeMax"] = lfsSizeStr explore.RenderRepoSearch(ctx, &explore.RepoSearchOptions{ Private: true, @@ -52,7 +54,7 @@ func UpdateRepoPost(ctx *context.Context) { ctx.Data["GitSizeMax"] = form.GitSizeMax ctx.Data["LFSSizeMax"] = form.LFSSizeMax - gitSizeMax, err := base.GetFileSize(form.GitSizeMax) + gitSizeMax, err := setting.ParseRepositorySizeLimit(form.GitSizeMax) if err != nil { ctx.Data["Err_Git_Size_Max"] = form.GitSizeMax explore.RenderRepoSearch(ctx, &explore.RepoSearchOptions{ @@ -64,7 +66,7 @@ func UpdateRepoPost(ctx *context.Context) { return } - lfsSizeMax, err := base.GetFileSize(form.LFSSizeMax) + lfsSizeMax, err := setting.ParseRepositorySizeLimit(form.LFSSizeMax) if err != nil { ctx.Data["Err_LFS_Size_Max"] = form.LFSSizeMax explore.RenderRepoSearch(ctx, &explore.RepoSearchOptions{ @@ -77,6 +79,7 @@ func UpdateRepoPost(ctx *context.Context) { } setting.UpdateGlobalRepositoryLimit(gitSizeMax, lfsSizeMax) + log.Trace("UpdateRepoPost: After update, setting.Repository.GitSizeMax=%d, LFSSizeMax=%d", setting.Repository.GitSizeMax, setting.Repository.LFSSizeMax) ctx.Flash.Success(ctx.Tr("admin.repos.update_success")) ctx.Redirect(setting.AppSubURL + "/-/admin/repos") diff --git a/services/forms/repo_form.go b/services/forms/repo_form.go index 58409f330e4..2cf56897f64 100644 --- a/services/forms/repo_form.go +++ b/services/forms/repo_form.go @@ -46,8 +46,8 @@ type CreateRepoForm struct { } type UpdateGlobalRepoFrom struct { - GitSizeMax string - LFSSizeMax string + GitSizeMax string `form:"GitSizeMax"` + LFSSizeMax string `form:"LFSSizeMax"` } // Validate validates the fields diff --git a/services/lfs/server.go b/services/lfs/server.go index 60e6e58c853..5bd7e378f91 100644 --- a/services/lfs/server.go +++ b/services/lfs/server.go @@ -253,8 +253,8 @@ func BatchHandler(ctx *context.Context) { repository.ID, base.FileSize(repository.GitSize), base.FileSize(repository.LFSSize), - base.FileSize(repository.GetActualSizeLimit()), - base.FileSize(repository.GetActualLFSSizeLimit()), + setting.FormatRepositorySizeLimit(repository.GetActualSizeLimit()), + setting.FormatRepositorySizeLimit(repository.GetActualLFSSizeLimit()), ) // Check LFS size limits for upload operations @@ -280,11 +280,11 @@ func BatchHandler(ctx *context.Context) { if predictedLFS > repository.GetActualLFSSizeLimit() && predictedLFS > repository.LFSSize { traceBatchDecision(rc, br.Operation, "req=%s DECISION=FORBID reason=LFS_LIMIT predictedLFS=%s limit=%s (NewObjects=%d ObjectsPresentInStore=%d MetaPresent=%d StoreExists=%d Invalid=%d)", - reqID, base.FileSize(predictedLFS), base.FileSize(repository.GetActualLFSSizeLimit()), + reqID, base.FileSize(predictedLFS), setting.FormatRepositorySizeLimit(repository.GetActualLFSSizeLimit()), ) writeStatusMessage(ctx, http.StatusForbidden, fmt.Sprintf("LFS size %s would exceed limit %s", - base.FileSize(predictedLFS), base.FileSize(repository.GetActualLFSSizeLimit()))) + base.FileSize(predictedLFS), setting.FormatRepositorySizeLimit(repository.GetActualLFSSizeLimit()))) return } diff --git a/templates/admin/repo/list.tmpl b/templates/admin/repo/list.tmpl index aebddeb19cd..d5ae95a5cbb 100644 --- a/templates/admin/repo/list.tmpl +++ b/templates/admin/repo/list.tmpl @@ -2,12 +2,22 @@

{{ctx.Locale.Tr "admin.repositories"}} -
- {{ctx.Locale.Tr "repo.repo_size"}} Max: {{.GitSizeMax}} - {{ctx.Locale.Tr "repo.lfs_size"}} Max: {{.LFSSizeMax}} -

-

+
+
+ {{.CsrfTokenHtml}} +
+ + +
+
+ + +
+ +
+
+

{{ctx.Locale.Tr "admin.repos.repo_manage_panel"}} ({{ctx.Locale.Tr "admin.total" .Total}})
{{ctx.Locale.Tr "admin.repos.unadopted"}} @@ -108,28 +118,6 @@ {{template "base/paginate" .}}
-
-

- {{ctx.Locale.Tr "admin.repos.settings"}} -

-
-
- {{$.CsrfTokenHtml}} -
- - -

{{ctx.Locale.Tr "admin.repos.git_size_max_helper"}}

-
-
- - -

{{ctx.Locale.Tr "admin.repos.lfs_size_max_helper"}}

-
- -
-
-
-