-
+
{{FileSize .Repository.Size}}
From 136b6318ed71334df1d17a516b99ed1f8047430a Mon Sep 17 00:00:00 2001
From: DmitryFrolovTri <23313323+DmitryFrolovTri@users.noreply.github.com>
Date: Mon, 14 Nov 2022 15:17:00 +0000
Subject: [PATCH 06/55] Removed code frmo models/repo/repo.go to stop compile
errors - TODO for later see what is still needed
---
models/repo/repo.go | 65 +++++++++++++++++++++++----------------------
1 file changed, 33 insertions(+), 32 deletions(-)
diff --git a/models/repo/repo.go b/models/repo/repo.go
index bcf315c67402c..49009af567552 100644
--- a/models/repo/repo.go
+++ b/models/repo/repo.go
@@ -516,38 +516,39 @@ func (repo *Repository) IsOwnedBy(userID int64) bool {
return repo.OwnerID == userID
}
-func (repo *Repository) computeSize() (int64, error) {
- size, err := util.GetDirectorySize(repo.RepoPath())
- if err != nil {
- return 0, fmt.Errorf("computeSize: %v", err)
- }
-
- objs, err := repo.GetLFSMetaObjects(repo.ID, -1, 0)
- if err != nil {
- return 0, fmt.Errorf("computeSize: GetLFSMetaObjects: %v", err)
- }
- for _, obj := range objs {
- size += obj.Size
- }
-
- return size, nil
-}
-
-func (repo *Repository) updateSize(e Engine) error {
- size, err := repo.computeSize()
- if err != nil {
- return fmt.Errorf("updateSize: %v", err)
- }
-
- repo.Size = size
- _, err = e.ID(repo.ID).Cols("size").Update(repo)
- return err
-}
-
-// UpdateSize updates the repository size, calculating it using util.GetDirectorySize
-func (repo *Repository) UpdateSize(ctx DBContext) error {
- return repo.updateSize(ctx.e)
-}
+// TODO - DmitryFrolovTri Review every commented function and see if we need to reinstate it
+// func (repo *Repository) computeSize() (int64, error) {
+// size, err := util.GetDirectorySize(repo.RepoPath())
+// if err != nil {
+// return 0, fmt.Errorf("computeSize: %v", err)
+// }
+
+// objs, err := repo.GetLFSMetaObjects(repo.ID, -1, 0)
+// if err != nil {
+// return 0, fmt.Errorf("computeSize: GetLFSMetaObjects: %v", err)
+// }
+// for _, obj := range objs {
+// size += obj.Size
+// }
+
+// return size, nil
+// }
+
+// func (repo *Repository) updateSize(ctx context.Context Engine) error {
+// size, err := repo.computeSize()
+// if err != nil {
+// return fmt.Errorf("updateSize: %v", err)
+// }
+
+// repo.Size = size
+// _, err = e.ID(repo.ID).Cols("size").Update(repo)
+// return err
+// }
+
+// // UpdateSize updates the repository size, calculating it using util.GetDirectorySize
+// func (repo *Repository) UpdateSize(ctx DBContext) error {
+// return repo.updateSize(ctx.e)
+// }
// RepoSizeIsOversized return if is over size limitation
func (repo *Repository) RepoSizeIsOversized(additionalSize int64) bool {
From 75585dec3c204eb79a23b9025fb6c63fe631c57b Mon Sep 17 00:00:00 2001
From: DmitryFrolovTri <23313323+DmitryFrolovTri@users.noreply.github.com>
Date: Tue, 15 Nov 2022 15:32:58 +0000
Subject: [PATCH 07/55] lint related changes
---
routers/private/hook_pre_receive.go | 10 +++++-----
tests/integration/git_test.go | 24 ++++++++++++------------
2 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/routers/private/hook_pre_receive.go b/routers/private/hook_pre_receive.go
index 1def817208934..eb18da8a4d7a8 100644
--- a/routers/private/hook_pre_receive.go
+++ b/routers/private/hook_pre_receive.go
@@ -132,16 +132,16 @@ func HookPreReceive(ctx *gitea_context.PrivateContext) {
newCommitID := opts.NewCommitIDs[i]
refFullName := opts.RefFullNames[i]
- //Check size
- if newCommitID != git.EmptySHA && repo.RepoSizeIsOversized(pushSize.Size) { //Check next size if we are not deleting a reference
+ // Check size
+ if newCommitID != git.EmptySHA && repo.RepoSizeIsOversized(pushSize.Size) { // Check next size if we are not deleting a reference
log.Warn("Forbidden: new repo size is over limitation: %d", repo.SizeLimit)
ctx.JSON(http.StatusForbidden, map[string]interface{}{
"err": fmt.Sprintf("new repo size is over limitation: %d", repo.SizeLimit),
})
}
- //TODO investigate why on force push some git objects are not cleaned on server side.
- //TODO corner-case force push and branch creation -> git.EmptySHA == oldCommitID
- //TODO calculate pushed LFS objects size
+ // TODO investigate why on force push some git objects are not cleaned on server side.
+ // TODO corner-case force push and branch creation -> git.EmptySHA == oldCommitID
+ // TODO calculate pushed LFS objects size
switch {
case strings.HasPrefix(refFullName, git.BranchPrefix):
diff --git a/tests/integration/git_test.go b/tests/integration/git_test.go
index 33c74b2aed0a5..0314f2913ac2e 100644
--- a/tests/integration/git_test.go
+++ b/tests/integration/git_test.go
@@ -79,29 +79,29 @@ func testGit(t *testing.T, u *url.URL) {
t.Run("SizeLimit", func(t *testing.T) {
t.Run("Under", func(t *testing.T) {
- PrintCurrentTest(t)
+ tests.PrintCurrentTest(t)
doCommitAndPush(t, littleSize, dstPath, "data-file-")
})
t.Run("Over", func(t *testing.T) {
- PrintCurrentTest(t)
+ tests.PrintCurrentTest(t)
doAPISetRepoSizeLimit(forkedUserCtx, forkedUserCtx.Username, forkedUserCtx.Reponame, littleSize)
doCommitAndPushWithExpectedError(t, bigSize, dstPath, "data-file-")
})
t.Run("UnderAfterResize", func(t *testing.T) {
- PrintCurrentTest(t)
+ tests.PrintCurrentTest(t)
doAPISetRepoSizeLimit(forkedUserCtx, forkedUserCtx.Username, forkedUserCtx.Reponame, bigSize*10)
doCommitAndPush(t, littleSize, dstPath, "data-file-")
})
t.Run("Deletion", func(t *testing.T) {
- PrintCurrentTest(t)
- //TODO doDeleteCommitAndPush(t, littleSize, dstPath, "data-file-")
+ tests.PrintCurrentTest(t)
+ // TODO doDeleteCommitAndPush(t, littleSize, dstPath, "data-file-")
})
- //TODO delete branch
- //TODO delete tag
- //TODO add big commit that will be over with the push
- //TODO add lfs
- //TODO remove lfs
- //TODO add missing case
+ // TODO delete branch
+ // TODO delete tag
+ // TODO add big commit that will be over with the push
+ // TODO add lfs
+ // TODO remove lfs
+ // TODO add missing case
})
t.Run("CreateAgitFlowPull", doCreateAgitFlowPull(dstPath, &httpContext, "master", "test/head"))
t.Run("BranchProtectMerge", doBranchProtectPRMerge(&httpContext, dstPath))
@@ -324,7 +324,7 @@ func doCommitAndPush(t *testing.T, size int, repoPath, prefix string) string {
func doCommitAndPushWithExpectedError(t *testing.T, size int, repoPath, prefix string) string {
name, err := generateCommitWithNewData(size, repoPath, "user2@example.com", "User Two", prefix)
assert.NoError(t, err)
- _, err = git.NewCommand("push", "origin", "master").RunInDir(repoPath) //Push
+ _, _, err = git.NewCommand(git.DefaultContext, "push", "origin", "master").RunStdString(&git.RunOpts{Dir: repoPath}) // Push
assert.Error(t, err)
return name
}
From d9ab187078e28e9b129424edffbc288359d949ec Mon Sep 17 00:00:00 2001
From: techknowlogick
Date: Sun, 4 Dec 2022 00:19:29 -0500
Subject: [PATCH 08/55] update license header
---
models/migrations/v160.go | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/models/migrations/v160.go b/models/migrations/v160.go
index 82cc528bb9cd4..5897cb2714190 100644
--- a/models/migrations/v160.go
+++ b/models/migrations/v160.go
@@ -1,6 +1,5 @@
-// Copyright 2020 The Gitea Authors. All rights reserved.
-// Use of this source code is governed by a MIT-style
-// license that can be found in the LICENSE file.
+// Copyright 2022 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
package migrations
From 31359b4721470eace23c371761b9831c9a0a7e7b Mon Sep 17 00:00:00 2001
From: DmitryFrolovTri <23313323+DmitryFrolovTri@users.noreply.github.com>
Date: Sun, 4 Dec 2022 06:53:08 +0000
Subject: [PATCH 09/55] moved AddSizeLimitOnRepo migration to v1_19 package
---
models/migrations/migrations.go | 2 +-
models/migrations/{v160.go => v1_19/v236.go} | 8 +++++---
2 files changed, 6 insertions(+), 4 deletions(-)
rename models/migrations/{v160.go => v1_19/v236.go} (71%)
diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go
index c9ebde3dce3c1..f9b77fae42f39 100644
--- a/models/migrations/migrations.go
+++ b/models/migrations/migrations.go
@@ -443,7 +443,7 @@ var migrations = []Migration{
// v235 -> v236
NewMigration("Add index for access_token", v1_19.AddIndexForAccessToken),
// to modify later
- NewMigration("add size limit on repository", addSizeLimitOnRepo),
+ NewMigration("add size limit on repository", v1_19.AddSizeLimitOnRepo),
}
// GetCurrentDBVersion returns the current db version
diff --git a/models/migrations/v160.go b/models/migrations/v1_19/v236.go
similarity index 71%
rename from models/migrations/v160.go
rename to models/migrations/v1_19/v236.go
index 5897cb2714190..1045835d0f43c 100644
--- a/models/migrations/v160.go
+++ b/models/migrations/v1_19/v236.go
@@ -1,11 +1,13 @@
// Copyright 2022 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
-package migrations
+package v1_19 // nolint
-import "xorm.io/xorm"
+import (
+ "xorm.io/xorm"
+)
-func addSizeLimitOnRepo(x *xorm.Engine) error {
+func AddSizeLimitOnRepo(x *xorm.Engine) error {
type Repository struct {
ID int64 `xorm:"pk autoincr"`
SizeLimit int64 `xorm:"NOT NULL DEFAULT 0"`
From 64f5b94590876b5313ab30af3b76c18980d856c1 Mon Sep 17 00:00:00 2001
From: DmitryFrolovTri <23313323+DmitryFrolovTri@users.noreply.github.com>
Date: Fri, 20 Jan 2023 11:37:38 +0000
Subject: [PATCH 10/55] Fixing lint error in models/migrations/v1_19 for
v999.go
---
models/migrations/v1_19/v999.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/models/migrations/v1_19/v999.go b/models/migrations/v1_19/v999.go
index 1045835d0f43c..d6724138540b8 100644
--- a/models/migrations/v1_19/v999.go
+++ b/models/migrations/v1_19/v999.go
@@ -1,7 +1,7 @@
// Copyright 2022 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
-package v1_19 // nolint
+package v1_19 //nolint
import (
"xorm.io/xorm"
From ae06851102fce9ed675a608e1f02c982aaadd195 Mon Sep 17 00:00:00 2001
From: truecode112
Date: Mon, 6 Feb 2023 08:57:52 +0300
Subject: [PATCH 11/55] Fixed Test(SizeLimit/Over)
---
tests/integration/git_test.go | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/tests/integration/git_test.go b/tests/integration/git_test.go
index 03bb2954add45..9f479d81cea42 100644
--- a/tests/integration/git_test.go
+++ b/tests/integration/git_test.go
@@ -29,6 +29,7 @@ import (
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/tests"
+ "code.gitea.io/gitea/modules/log"
"github.com/stretchr/testify/assert"
)
@@ -58,6 +59,8 @@ func testGit(t *testing.T, u *url.URL) {
dstPath := t.TempDir()
+ dstForkedPath := t.TempDir()
+
t.Run("CreateRepoInDifferentUser", doAPICreateRepository(forkedUserCtx, false))
t.Run("AddUserAsCollaborator", doAPIAddCollaborator(forkedUserCtx, httpContext.Username, perm.AccessModeRead))
@@ -84,12 +87,15 @@ func testGit(t *testing.T, u *url.URL) {
})
t.Run("Over", func(t *testing.T) {
tests.PrintCurrentTest(t)
- doAPISetRepoSizeLimit(forkedUserCtx, forkedUserCtx.Username, forkedUserCtx.Reponame, littleSize)
- doCommitAndPushWithExpectedError(t, bigSize, dstPath, "data-file-")
+ u.Path = forkedUserCtx.GitPath()
+ u.User = url.UserPassword(forkedUserCtx.Username, userPassword)
+ t.Run("Clone", doGitClone(dstForkedPath, u))
+ t.Run("APISetRepoSizeLimit", doAPISetRepoSizeLimit(forkedUserCtx, forkedUserCtx.Username, forkedUserCtx.Reponame, littleSize))
+ doCommitAndPushWithExpectedError(t, bigSize, dstForkedPath, "data-file-")
})
t.Run("UnderAfterResize", func(t *testing.T) {
tests.PrintCurrentTest(t)
- doAPISetRepoSizeLimit(forkedUserCtx, forkedUserCtx.Username, forkedUserCtx.Reponame, bigSize*10)
+ t.Run("APISetRepoSizeLimit", doAPISetRepoSizeLimit(forkedUserCtx, forkedUserCtx.Username, forkedUserCtx.Reponame, bigSize*10))
doCommitAndPush(t, littleSize, dstPath, "data-file-")
})
t.Run("Deletion", func(t *testing.T) {
@@ -114,6 +120,8 @@ func testGit(t *testing.T, u *url.URL) {
mediaTest(t, &forkedUserCtx, little, big, littleLFS, bigLFS)
})
+ u.Path = httpContext.GitPath()
+ u.User = url.UserPassword(username, userPassword)
t.Run("PushCreate", doPushCreate(httpContext, u))
})
t.Run("SSH", func(t *testing.T) {
@@ -212,7 +220,9 @@ func commitAndPushTest(t *testing.T, dstPath, prefix string) (little, big string
defer tests.PrintCurrentTest(t)()
t.Run("Little", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
+ log.Error("before doCommitAndPush")
little = doCommitAndPush(t, littleSize, dstPath, prefix)
+ log.Error("after doCommitAndPush")
})
t.Run("Big", func(t *testing.T) {
if testing.Short() {
From 8494f19f29602db3ce8c64b03ee2fa9d49eb49b5 Mon Sep 17 00:00:00 2001
From: DmitryFrolovTri <23313323+DmitryFrolovTri@users.noreply.github.com>
Date: Mon, 6 Feb 2023 07:09:35 +0000
Subject: [PATCH 12/55] fix fmt errors
---
tests/integration/git_test.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/integration/git_test.go b/tests/integration/git_test.go
index 692a1fda29ca5..e75f3a25007f4 100644
--- a/tests/integration/git_test.go
+++ b/tests/integration/git_test.go
@@ -25,11 +25,11 @@ import (
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/lfs"
+ "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/tests"
- "code.gitea.io/gitea/modules/log"
"github.com/stretchr/testify/assert"
)
From 0afa267c181dbfd082aa282f025491c350927861 Mon Sep 17 00:00:00 2001
From: truecode112
Date: Mon, 6 Feb 2023 16:48:19 +0300
Subject: [PATCH 13/55] Fixed unclosed logger test
---
tests/integration/git_test.go | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/tests/integration/git_test.go b/tests/integration/git_test.go
index e75f3a25007f4..9d2cc66eb3a2a 100644
--- a/tests/integration/git_test.go
+++ b/tests/integration/git_test.go
@@ -82,11 +82,11 @@ func testGit(t *testing.T, u *url.URL) {
t.Run("SizeLimit", func(t *testing.T) {
t.Run("Under", func(t *testing.T) {
- tests.PrintCurrentTest(t)
+ defer tests.PrintCurrentTest(t)()
doCommitAndPush(t, littleSize, dstPath, "data-file-")
})
t.Run("Over", func(t *testing.T) {
- tests.PrintCurrentTest(t)
+ defer tests.PrintCurrentTest(t)()
u.Path = forkedUserCtx.GitPath()
u.User = url.UserPassword(forkedUserCtx.Username, userPassword)
t.Run("Clone", doGitClone(dstForkedPath, u))
@@ -94,12 +94,12 @@ func testGit(t *testing.T, u *url.URL) {
doCommitAndPushWithExpectedError(t, bigSize, dstForkedPath, "data-file-")
})
t.Run("UnderAfterResize", func(t *testing.T) {
- tests.PrintCurrentTest(t)
+ defer tests.PrintCurrentTest(t)()
t.Run("APISetRepoSizeLimit", doAPISetRepoSizeLimit(forkedUserCtx, forkedUserCtx.Username, forkedUserCtx.Reponame, bigSize*10))
doCommitAndPush(t, littleSize, dstPath, "data-file-")
})
t.Run("Deletion", func(t *testing.T) {
- tests.PrintCurrentTest(t)
+ defer tests.PrintCurrentTest(t)()
// TODO doDeleteCommitAndPush(t, littleSize, dstPath, "data-file-")
})
// TODO delete branch
From a22b73866a7c2f7464c99c5ecd7d91e10fb930ce Mon Sep 17 00:00:00 2001
From: truecode112
Date: Mon, 15 May 2023 06:24:17 +0300
Subject: [PATCH 14/55] Added ENABLE_SIZE_LIMIT config option
---
models/repo/repo.go | 1 +
1 file changed, 1 insertion(+)
diff --git a/models/repo/repo.go b/models/repo/repo.go
index 361086ea42633..12181ef71bb5f 100644
--- a/models/repo/repo.go
+++ b/models/repo/repo.go
@@ -164,6 +164,7 @@ type Repository struct {
TemplateID int64 `xorm:"INDEX"`
Size int64 `xorm:"NOT NULL DEFAULT 0"`
SizeLimit int64 `xorm:"NOT NULL DEFAULT 0"`
+ EnableSizeLimit bool `xorm:"NOT NULL DEFAULT true"`
CodeIndexerStatus *RepoIndexerStatus `xorm:"-"`
StatsIndexerStatus *RepoIndexerStatus `xorm:"-"`
IsFsckEnabled bool `xorm:"NOT NULL DEFAULT true"`
From 66c476e5debfbd960b0c78a53323d6d7bce2431f Mon Sep 17 00:00:00 2001
From: truecode112
Date: Mon, 15 May 2023 09:57:47 +0300
Subject: [PATCH 15/55] UI related changed for ENABLE_SIZE_LIMIT &
REPO_SIZE_LIMIT options
---
modules/base/tool.go | 9 ++++++++-
modules/setting/repository.go | 20 +++++++++++++++++++
routers/web/admin/repos.go | 36 ++++++++++++++++++++++++++++++++++
routers/web/explore/repo.go | 5 +++++
routers/web/web.go | 2 ++
services/forms/repo_form.go | 6 ++++++
templates/admin/repo/list.tmpl | 21 ++++++++++++++++++++
7 files changed, 98 insertions(+), 1 deletion(-)
diff --git a/modules/base/tool.go b/modules/base/tool.go
index 13b07c043e473..96d1391e3a809 100644
--- a/modules/base/tool.go
+++ b/modules/base/tool.go
@@ -138,7 +138,14 @@ func CreateTimeLimitCode(data string, minutes int, startInf interface{}) string
// FileSize calculates the file size and generate user-friendly string.
func FileSize(s int64) string {
- return humanize.IBytes(uint64(s))
+ return humanize.Bytes(uint64(s))
+}
+
+// Get FileSize bytes value from String.
+func GetFileSize(s string) (int64, error) {
+ v, err := humanize.ParseBytes(s)
+ iv := int64(v)
+ return iv, err
}
// EllipsisString returns a truncated short string,
diff --git a/modules/setting/repository.go b/modules/setting/repository.go
index 56e7e6f4aca56..a495f471d6baa 100644
--- a/modules/setting/repository.go
+++ b/modules/setting/repository.go
@@ -7,6 +7,7 @@ import (
"os/exec"
"path"
"path/filepath"
+ "strconv"
"strings"
"code.gitea.io/gitea/modules/log"
@@ -265,12 +266,31 @@ var (
RepoArchive = struct {
Storage
}{}
+
+ EnableSizeLimit = true
+ RepoSizeLimit int64 = 0
)
+func SaveGlobalRepositorySetting(enable_size_limit bool, repo_size_limit int64) {
+ EnableSizeLimit = enable_size_limit
+ RepoSizeLimit = repo_size_limit
+ sec := CfgProvider.Section("repository")
+ if EnableSizeLimit {
+ sec.Key("ENABLE_SIZE_LIMIT").SetValue("true")
+ } else {
+ sec.Key("ENABLE_SIZE_LIMIT").SetValue("false")
+ }
+
+ sec.Key("REPO_SIZE_LIMIT").SetValue(strconv.FormatInt(RepoSizeLimit, 10))
+}
+
func loadRepositoryFrom(rootCfg ConfigProvider) {
var err error
+
// Determine and create root git repository path.
sec := rootCfg.Section("repository")
+ EnableSizeLimit = sec.Key("ENABLE_SIZE_LIMIT").MustBool()
+ RepoSizeLimit = sec.Key("REPO_SIZE_LIMIT").MustInt64(0)
Repository.DisableHTTPGit = sec.Key("DISABLE_HTTP_GIT").MustBool()
Repository.UseCompatSSHURI = sec.Key("USE_COMPAT_SSH_URI").MustBool()
Repository.MaxCreationLimit = sec.Key("MAX_CREATION_LIMIT").MustInt(-1)
diff --git a/routers/web/admin/repos.go b/routers/web/admin/repos.go
index 9a0e467b48712..2287f81fe1f9a 100644
--- a/routers/web/admin/repos.go
+++ b/routers/web/admin/repos.go
@@ -17,7 +17,9 @@ import (
repo_module "code.gitea.io/gitea/modules/repository"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
+ "code.gitea.io/gitea/modules/web"
"code.gitea.io/gitea/routers/web/explore"
+ "code.gitea.io/gitea/services/forms"
repo_service "code.gitea.io/gitea/services/repository"
)
@@ -31,6 +33,9 @@ func Repos(ctx *context.Context) {
ctx.Data["Title"] = ctx.Tr("admin.repositories")
ctx.Data["PageIsAdminRepositories"] = true
+ ctx.Data["EnableSizeLimit"] = setting.EnableSizeLimit
+ ctx.Data["RepoSizeLimit"] = base.FileSize(setting.RepoSizeLimit)
+
explore.RenderRepoSearch(ctx, &explore.RepoSearchOptions{
Private: true,
PageSize: setting.UI.Admin.RepoPagingNum,
@@ -39,6 +44,37 @@ func Repos(ctx *context.Context) {
})
}
+func UpdateRepoPost(ctx *context.Context) {
+ form := web.GetForm(ctx).(*forms.UpdateGlobalRepoFrom)
+ ctx.Data["Title"] = ctx.Tr("admin.repositories")
+ ctx.Data["PageIsAdminRepositories"] = true
+
+ repo_size_limit, err := base.GetFileSize(form.RepoSizeLimit)
+
+ ctx.Data["EnableSizeLimit"] = form.EnableSizeLimit
+ ctx.Data["RepoSizeLimit"] = form.RepoSizeLimit
+
+ if err != nil {
+ ctx.Data["Err_Repo_Size_Limit"] = true
+ explore.RenderRepoSearch(ctx, &explore.RepoSearchOptions{
+ Private: true,
+ PageSize: setting.UI.Admin.RepoPagingNum,
+ TplName: tplRepos,
+ OnlyShowRelevant: false,
+ })
+ return
+ }
+
+ setting.SaveGlobalRepositorySetting(form.EnableSizeLimit, repo_size_limit)
+ ctx.Flash.Success(ctx.Tr("admin.config.repository_setting_success"))
+
+ ctx.Data["RepoSizeLimit"] = base.FileSize(setting.RepoSizeLimit)
+
+ ctx.Flash.Success(ctx.Tr("admin.config.repository_setting_success"))
+ ctx.Redirect(setting.AppSubURL + "/admin/repos")
+
+}
+
// DeleteRepo delete one repository
func DeleteRepo(ctx *context.Context) {
repo, err := repo_model.GetRepositoryByID(ctx, ctx.FormInt64("id"))
diff --git a/routers/web/explore/repo.go b/routers/web/explore/repo.go
index be5ad1b015b79..a3450a142c1e0 100644
--- a/routers/web/explore/repo.go
+++ b/routers/web/explore/repo.go
@@ -141,6 +141,11 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) {
pager.AddParamString(relevantReposOnlyParam, fmt.Sprint(opts.OnlyShowRelevant))
ctx.Data["Page"] = pager
+ if ctx.Data["Err_Repo_Size_Limit"] != nil {
+ ctx.RenderWithErr(ctx.Tr("admin.config.invalid_repo_size"), opts.TplName, nil)
+ return
+ }
+
ctx.HTML(http.StatusOK, opts.TplName)
}
diff --git a/routers/web/web.go b/routers/web/web.go
index 8784b7c5f7f5e..b3b9d65dbf2e0 100644
--- a/routers/web/web.go
+++ b/routers/web/web.go
@@ -580,6 +580,8 @@ func registerRoutes(m *web.Route) {
m.Get("", admin.Repos)
m.Combo("/unadopted").Get(admin.UnadoptedRepos).Post(admin.AdoptOrDeleteRepository)
m.Post("/delete", admin.DeleteRepo)
+ m.Post("", web.Bind(forms.UpdateGlobalRepoFrom{}), admin.UpdateRepoPost)
+
})
m.Group("/packages", func() {
diff --git a/services/forms/repo_form.go b/services/forms/repo_form.go
index 9e5e5697ffa94..5e57a7effb779 100644
--- a/services/forms/repo_form.go
+++ b/services/forms/repo_form.go
@@ -28,6 +28,12 @@ import (
// |____|_ /_______ / |____| \_______ /_______ /|___| |____| \_______ /____|_ // ______|
// \/ \/ \/ \/ \/ \/ \/
+// UpdateGlobalRepoFrom for updating global repository setting
+type UpdateGlobalRepoFrom struct {
+ RepoSizeLimit string
+ EnableSizeLimit bool
+}
+
// CreateRepoForm form for creating repository
type CreateRepoForm struct {
UID int64 `binding:"Required"`
diff --git a/templates/admin/repo/list.tmpl b/templates/admin/repo/list.tmpl
index f485784d0c684..bd29db0905487 100644
--- a/templates/admin/repo/list.tmpl
+++ b/templates/admin/repo/list.tmpl
@@ -1,5 +1,26 @@
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin")}}