Skip to content
Draft
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
192 commits
Select commit Hold shift + click to select a range
bb96349
rebase on master
sapk Nov 7, 2020
56b92a1
generate swagger
sapk Nov 7, 2020
2f65545
add some tests
sapk Nov 7, 2020
7c31cfc
add some tests
sapk Nov 7, 2020
6a2e670
Merge remote-tracking branch 'upstream/main' into limit-repo-size ini…
sapk Nov 12, 2022
df60de2
Fixing Merge errors - still few to go
DmitryFrolovTri Nov 12, 2022
136b631
Removed code frmo models/repo/repo.go to stop compile errors - TODO f…
DmitryFrolovTri Nov 14, 2022
20bfff3
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Nov 15, 2022
75585de
lint related changes
DmitryFrolovTri Nov 15, 2022
036e55c
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Nov 16, 2022
62d3c05
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Nov 24, 2022
ee31efc
fix migrations.go conflict
DmitryFrolovTri Nov 24, 2022
36b43fe
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Nov 26, 2022
762799b
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Nov 26, 2022
b391383
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Nov 30, 2022
04de706
Merge branch 'main' into limit-repo-size
zeripath Dec 3, 2022
d9ab187
update license header
techknowlogick Dec 4, 2022
31359b4
moved AddSizeLimitOnRepo migration to v1_19 package
DmitryFrolovTri Dec 4, 2022
4c0921e
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Dec 4, 2022
1c7b3b6
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Dec 5, 2022
a16f5fa
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Dec 5, 2022
af2e3a3
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Dec 6, 2022
4687f0c
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Dec 8, 2022
d1368ec
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Dec 14, 2022
4256bdc
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Dec 16, 2022
cdc5a2c
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Dec 19, 2022
e26bcfc
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Dec 21, 2022
2763393
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Dec 25, 2022
e7ab661
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Dec 27, 2022
6060ae1
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jan 9, 2023
8383ec5
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jan 9, 2023
562bc27
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jan 9, 2023
d13d457
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jan 9, 2023
80fa68b
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jan 10, 2023
4a31279
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jan 11, 2023
fe168a4
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jan 11, 2023
f8b1413
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jan 12, 2023
ac99056
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jan 13, 2023
0666202
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jan 14, 2023
c20faef
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jan 16, 2023
3429b99
Fix merge conflict in migrations.go, v238.go, create v999.go and Merg…
DmitryFrolovTri Jan 17, 2023
bcea146
Fix merge conflig in migrations.go Merge remote-tracking branch 'upst…
DmitryFrolovTri Jan 18, 2023
7aeb909
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jan 19, 2023
dd0246e
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jan 20, 2023
64f5b94
Fixing lint error in models/migrations/v1_19 for v999.go
DmitryFrolovTri Jan 20, 2023
9a36273
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jan 22, 2023
cc2521c
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jan 23, 2023
8adfb6d
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jan 23, 2023
b00f27e
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jan 24, 2023
37725e4
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jan 26, 2023
7b4e90b
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jan 29, 2023
9da8b9d
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Feb 1, 2023
82dcd0c
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Feb 3, 2023
ae06851
Fixed Test(SizeLimit/Over)
truecode112 Feb 6, 2023
e3b4628
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Feb 6, 2023
8494f19
fix fmt errors
DmitryFrolovTri Feb 6, 2023
0afa267
Fixed unclosed logger test
truecode112 Feb 6, 2023
211c085
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Feb 6, 2023
8293e7f
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Feb 14, 2023
920fb58
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Feb 17, 2023
f583b8f
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Feb 27, 2023
8a84718
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Feb 27, 2023
4b09713
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Mar 13, 2023
3f8bdd1
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Mar 22, 2023
ab5ffc0
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Mar 25, 2023
83cc033
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Apr 14, 2023
d98a62a
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Apr 17, 2023
7f28229
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Apr 18, 2023
4793882
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri May 3, 2023
3592ae7
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri May 3, 2023
1765ea3
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri May 11, 2023
a22b738
Added ENABLE_SIZE_LIMIT config option
truecode112 May 15, 2023
66c476e
UI related changed for ENABLE_SIZE_LIMIT & REPO_SIZE_LIMIT options
truecode112 May 15, 2023
d843a67
Overall Done for Global Repo Size Limit Option
truecode112 May 15, 2023
0231760
All done for Global Repo Size Option
truecode112 May 15, 2023
82f3e2d
add test for global repo size limit option
truecode112 May 15, 2023
2a1abe5
Add test script
truecode112 May 15, 2023
3d0004a
Modified app.example.ini with REPO_SIZE_LIMIT and ENABLE_SIZE_LIMIT o…
DmitryFrolovTri May 15, 2023
414c902
updated content/doc/administration/config-cheat-sheet.en-us.md with E…
DmitryFrolovTri May 15, 2023
31600a0
Config parameter REPO_SIZE_LIMIT = XXXX (should accept bytes human re…
May 16, 2023
703ba07
Config parameter REPO_SIZE_LIMIT = XXXX (should accept bytes human re…
May 16, 2023
c55ccfd
revert saving config part
May 16, 2023
9e5f2fd
lint error fixed.
May 16, 2023
80f8977
fixed issues for testing
May 16, 2023
8ac833a
Fixed issues in test scripts.
May 16, 2023
c31c510
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri May 17, 2023
8750728
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri May 17, 2023
c2fc283
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri May 17, 2023
4936e49
present a correct message when repo is over
May 17, 2023
e9c29f8
doDeleteCommitAndPush implemented
May 18, 2023
57c94e6
Allow operations that potentially reduce repository size through even…
DmitryFrolovTri May 19, 2023
656a3dc
Update modules/setting/repository.go
DmitryFrolovTri May 19, 2023
ef760d7
Update modules/base/tool_test.go
DmitryFrolovTri May 19, 2023
51a7697
Fix in /modules/setting/repository.go
DmitryFrolovTri May 19, 2023
2cbdee0
Revert "doDeleteCommitAndPush implemented"
DmitryFrolovTri May 19, 2023
88e74d6
Correctly report messages on erros with rev-list size getting on pre …
DmitryFrolovTri May 21, 2023
7120c30
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri May 21, 2023
db5a8da
Refactor hook_pre_recieve to increase speed of size checking
DmitryFrolovTri May 23, 2023
08c65ff
Update for TestScript to Reduce RepoSize
May 23, 2023
ab3097d
Merge branch 'limit-repo-size' of https://github.com/DmitryFrolovTri/…
May 23, 2023
ed4865c
Refactor hook_pre_recieve to increase speed of size checking and mino…
DmitryFrolovTri May 23, 2023
c96ec8d
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri May 23, 2023
fd73ace
Merge branch 'limit-repo-size' of https://github.com/DmitryFrolovTri/…
May 23, 2023
256173f
Fixed lint errors in hook_pre_recieve.go
DmitryFrolovTri May 23, 2023
6e99cf4
Merge branch 'limit-repo-size' into upstream
DmitryFrolovTri May 23, 2023
a32f797
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri May 23, 2023
7bc9554
The size unit of measurements should be mentioned in the config and d…
DmitryFrolovTri May 23, 2023
22bb76c
Revert "Update for TestScript to Reduce RepoSize"
DmitryFrolovTri May 24, 2023
a08c6fe
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri May 24, 2023
64f6dd6
Documentation modification for the repo size limit feature
DmitryFrolovTri May 24, 2023
20d4d4f
test script to check if repo size is reduced.
May 25, 2023
39ade30
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri May 26, 2023
0c3a46f
checking reduced size scenario 2
May 26, 2023
ccc564a
Merge branch 'limit-repo-size' of https://github.com/DmitryFrolovTri/…
May 26, 2023
851c988
Fixed getting repo size via api call.
May 31, 2023
649da24
Removing unneeded comments
DmitryFrolovTri Jun 7, 2023
44df2b6
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jun 7, 2023
9c9f75f
Limit repo size packs (#1)
DmitryFrolovTri Jun 12, 2023
cdf5946
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jun 13, 2023
eac9822
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jun 13, 2023
4b709c6
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jun 14, 2023
7240e3a
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jun 19, 2023
c203d2c
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jun 29, 2023
bc1cb65
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jun 30, 2023
9014d9f
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jun 30, 2023
79251d5
fixed a lint error
DmitryFrolovTri Jun 30, 2023
bc051a3
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jul 11, 2023
b521d36
Now in hook_pre_recieve.go, when cat file -s is called - the work is …
DmitryFrolovTri Jul 11, 2023
9bf945f
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jul 24, 2023
efd3596
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jul 24, 2023
410d0cd
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jul 24, 2023
236681b
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jul 28, 2023
918325f
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Aug 23, 2023
0e05c2e
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Aug 23, 2023
e5a04cd
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Sep 4, 2023
e9b8e6f
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Sep 5, 2023
8097699
Updated routers/web/admin/repos_test.go to use code.gitea.io/gitea/mo…
DmitryFrolovTri Sep 5, 2023
23a492d
Merge remote-tracking branch 'upstream/main' into limit-repo-size, fi…
DmitryFrolovTri Sep 14, 2023
f810b42
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Oct 4, 2023
cfd013f
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Oct 25, 2023
aec62fa
Update templates/repo/settings/options.tmpl
DmitryFrolovTri Nov 7, 2023
b709876
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Nov 8, 2023
e1267d5
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Dec 2, 2023
3612140
fix a panic in hook_pre_recieve.go
DmitryFrolovTri Dec 2, 2023
006f216
fix race condition due to opts.Env. Exclude size breach determination…
DmitryFrolovTri Dec 3, 2023
0fee4f4
Merge remote-tracking branch 'upstream/main' into limit-repo-size.
DmitryFrolovTri Feb 28, 2024
ecdc2a7
Fixes related to prior merge
DmitryFrolovTri Feb 28, 2024
807da90
Postmerge update auth for TestGit/HTTP/SizeLimit - Over, UnderAfterRe…
DmitryFrolovTri Feb 28, 2024
4b6a77c
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Feb 28, 2024
bf1870d
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Mar 5, 2024
748dbd0
Merge remote-tracking branch 'upstream/main' into limit-repo-size
techknowlogick Sep 7, 2024
ef94e79
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Dec 9, 2025
554c303
refactor of the size determination logic for latest gitea code
DmitryFrolovTri Dec 9, 2025
f4dff6a
fixing the git_gneral_tests.go for new gitea version
DmitryFrolovTri Dec 9, 2025
758f4f3
correctly add the migration for size limit / fix test
DmitryFrolovTri Dec 9, 2025
206d688
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Dec 9, 2025
e709a88
make fmt
DmitryFrolovTri Dec 11, 2025
de1b2d8
fixing lint fmt errors
DmitryFrolovTri Dec 11, 2025
56d388e
refactor messages and admin settings to latest gitea
DmitryFrolovTri Dec 12, 2025
4bda9b8
refactor repo settings for LimitSize and new gitea, size can be enter…
DmitryFrolovTri Dec 12, 2025
17ef999
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Dec 12, 2025
4ef0f99
LFSSize and related features
DmitryFrolovTri Dec 18, 2025
624fe24
refactor to remove ENABLE_SIZE_LIMIT option and replace it with -1 in…
DmitryFrolovTri Dec 18, 2025
243c16d
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Dec 18, 2025
4c5967c
Update templates/repo/settings/options.tmpl
silverwind Dec 18, 2025
521d277
Update templates/repo/settings/options.tmpl
silverwind Dec 18, 2025
b81fe08
Updated migrations to follow standard naming
DmitryFrolovTri Dec 18, 2025
7b10eb2
Merge latest master commits and fix the translations.
silverwind Dec 24, 2025
7942523
SizeLimit w/o DB changes
DmitryFrolovTri Jan 13, 2026
c16ad56
refactor handling of -1 from base to business logic and UI for sizeli…
DmitryFrolovTri Jan 21, 2026
3641d45
fixing tests
DmitryFrolovTri Jan 21, 2026
374989a
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jan 21, 2026
ca9489a
merge of upstream/main + limitsize w/o DB
DmitryFrolovTri Jan 22, 2026
baafa7b
lint-go fixes
DmitryFrolovTri Jan 22, 2026
fee277f
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jan 22, 2026
303cb6f
Replace WithStdin to WithStdinCopy in hook_pre_receive.go
DmitryFrolovTri Jan 22, 2026
902829d
Fix LFS tests, git-lfs not initialized/installed
DmitryFrolovTri Jan 22, 2026
014c969
fix UI display in user repository settings
DmitryFrolovTri Jan 22, 2026
3622a71
fix locale issue
DmitryFrolovTri Jan 22, 2026
d2beb1d
remove the size_limit from repo API we now have only global size_limi…
DmitryFrolovTri Jan 22, 2026
3dcfd23
move of sizerelated CountObjects, CountObjectsWithEnv to modules/gitr…
DmitryFrolovTri Jan 22, 2026
fd57c84
revert unnecessary description update
DmitryFrolovTri Jan 22, 2026
5c80b8d
Merge branch 'main' into limit-repo-size
silverwind Jan 23, 2026
10edee8
Update models/repo/repo.go
DmitryFrolovTri Jan 23, 2026
a779d64
rename UpdateGlobalRepoFrom -> UpdateGlobalRepoForm
DmitryFrolovTri Jan 27, 2026
86d5918
TestGetFileSize -> TestGetFileSizeParsesHumanSizes, refactor to cover…
DmitryFrolovTri Jan 27, 2026
15a12f0
modules/git/repo.go const for 1024
DmitryFrolovTri Jan 28, 2026
00ba5be
Cleaned up unmodified local files to get them from upstream
DmitryFrolovTri Jan 28, 2026
4ba3f21
remvoed need for sha1 & updated trace messages in lfs server.go
DmitryFrolovTri Jan 28, 2026
f8403ad
Merge remote-tracking branch 'upstream/main' into limit-repo-size
DmitryFrolovTri Jan 28, 2026
f53f2b9
routers/private/hook_pre_receive.go fixes
DmitryFrolovTri Jan 28, 2026
0f2a872
tests/integration/git_general_test.go revert to upstream/main and tes…
DmitryFrolovTri Jan 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions models/migrations/migrations.go
Original file line number Diff line number Diff line change
Expand Up @@ -442,6 +442,8 @@ var migrations = []Migration{
NewMigration("Add package cleanup rule table", v1_19.CreatePackageCleanupRuleTable),
// v235 -> v236
NewMigration("Add index for access_token", v1_19.AddIndexForAccessToken),
// to modify later
NewMigration("add size limit on repository", addSizeLimitOnRepo),
}

// GetCurrentDBVersion returns the current db version
Expand Down
15 changes: 15 additions & 0 deletions models/migrations/v160.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// Copyright 2022 The Gitea Authors. All rights reserved.
Comment thread
DmitryFrolovTri marked this conversation as resolved.
Outdated
// SPDX-License-Identifier: MIT

package migrations

import "xorm.io/xorm"

func addSizeLimitOnRepo(x *xorm.Engine) error {
type Repository struct {
ID int64 `xorm:"pk autoincr"`
SizeLimit int64 `xorm:"NOT NULL DEFAULT 0"`
}

return x.Sync2(new(Repository))
}
40 changes: 40 additions & 0 deletions models/repo/repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ type Repository struct {
IsTemplate bool `xorm:"INDEX NOT NULL DEFAULT false"`
TemplateID int64 `xorm:"INDEX"`
Size int64 `xorm:"NOT NULL DEFAULT 0"`
SizeLimit int64 `xorm:"NOT NULL DEFAULT 0"`
CodeIndexerStatus *RepoIndexerStatus `xorm:"-"`
StatsIndexerStatus *RepoIndexerStatus `xorm:"-"`
IsFsckEnabled bool `xorm:"NOT NULL DEFAULT true"`
Expand Down Expand Up @@ -506,6 +507,45 @@ func (repo *Repository) IsOwnedBy(userID int64) bool {
return repo.OwnerID == userID
}

// TODO - DmitryFrolovTri Review every commented function and see if we need to reinstate it
Comment thread
DmitryFrolovTri marked this conversation as resolved.
Outdated
// 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 {
return repo.SizeLimit > 0 && repo.Size+additionalSize > repo.SizeLimit
}

// CanCreateBranch returns true if repository meets the requirements for creating new branches.
func (repo *Repository) CanCreateBranch() bool {
return !repo.IsMirror
Expand Down
68 changes: 68 additions & 0 deletions modules/git/repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,74 @@ func Push(ctx context.Context, repoPath string, opts PushOptions) error {
return err
}

// CountObject represents repository count objects report
type CountObject struct {
Count int64
Size int64
InPack int64
Packs int64
SizePack int64
PrunePack int64
Garbage int64
SizeGarbage int64
}

const (
statCount = "count: "
statSize = "size: "
statInpack = "in-pack: "
statPacks = "packs: "
statSizePack = "size-pack: "
statPrunePackage = "prune-package: "
statGarbage = "garbage: "
statSizeGarbage = "size-garbage: "
)

// CountObjects returns the results of git count-objects on the repoPath
func CountObjects(ctx context.Context, repoPath string) (*CountObject, error) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's better to move all the functions to modules/gitrepo and used gitrepo.Repository instead of repoPath.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok will work on this

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) {
Comment thread
DmitryFrolovTri marked this conversation as resolved.
Outdated
cmd := NewCommand(ctx, "count-objects", "-v")
stdout, _, err := cmd.RunStdString(&RunOpts{Dir: repoPath, Env: env})
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)
for _, line := range strings.Split(objects, "\n") {
switch {
case strings.HasPrefix(line, statCount):
repoSize.Count, _ = strconv.ParseInt(line[7:], 10, 64)
case strings.HasPrefix(line, statSize):
number, _ := strconv.ParseInt(line[6:], 10, 64)
repoSize.Size = number * 1024
case strings.HasPrefix(line, statInpack):
repoSize.InPack, _ = strconv.ParseInt(line[9:], 10, 64)
case strings.HasPrefix(line, statPacks):
repoSize.Packs, _ = strconv.ParseInt(line[7:], 10, 64)
case strings.HasPrefix(line, statSizePack):
number, _ := strconv.ParseInt(line[11:], 10, 64)
repoSize.SizePack = number * 1024
case strings.HasPrefix(line, statPrunePackage):
repoSize.PrunePack, _ = strconv.ParseInt(line[16:], 10, 64)
case strings.HasPrefix(line, statGarbage):
repoSize.Garbage, _ = strconv.ParseInt(line[9:], 10, 64)
case strings.HasPrefix(line, statSizeGarbage):
number, _ := strconv.ParseInt(line[14:], 10, 64)
repoSize.SizeGarbage = number * 1024
}
}
return repoSize
}
Comment on lines +251 to +280

Copilot AI Jan 30, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The ParseCountObjectsResult function silently ignores parse errors when converting string values to int64. If strconv.ParseInt fails (lines 259, 261, 264, 266, 268, 271, 273, 275), the error is discarded and the field remains at its zero value. This could lead to incorrect size calculations if the git count-objects output format changes or is corrupted. While this makes the function resilient to parsing errors, it would be safer to at least log these errors or return them so callers are aware that the parsed results may be incomplete.

Copilot uses AI. Check for mistakes.

// GetLatestCommitTime returns time for latest commit in repository (across all branches)
func GetLatestCommitTime(ctx context.Context, repoPath string) (time.Time, error) {
cmd := NewCommand(ctx, "for-each-ref", "--sort=-committerdate", BranchPrefix, "--count", "1", "--format=%(committerdate)")
Expand Down
2 changes: 2 additions & 0 deletions modules/repository/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@ type CreateRepoOptions struct {
Status repo_model.RepositoryStatus
TrustModel repo_model.TrustModelType
MirrorInterval string
SizeLimit int64
}

// CreateRepository creates a repository for the user/organization.
Expand Down Expand Up @@ -205,6 +206,7 @@ func CreateRepository(doer, u *user_model.User, opts CreateRepoOptions) (*repo_m
Status: opts.Status,
IsEmpty: !opts.AutoInit,
TrustModel: opts.TrustModel,
SizeLimit: opts.SizeLimit,
IsMirror: opts.IsMirror,
}

Expand Down
4 changes: 4 additions & 0 deletions modules/structs/repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,8 @@ type CreateRepoOption struct {
// TrustModel of the repository
// enum: default,collaborator,committer,collaboratorcommitter
TrustModel string `json:"trust_model"`
// SizeLimit of the repository
SizeLimit int64 `json:"size_limit"`
}

// EditRepoOption options when editing a repository's properties
Expand Down Expand Up @@ -188,6 +190,8 @@ type EditRepoOption struct {
DefaultMergeStyle *string `json:"default_merge_style,omitempty"`
// set to `true` to archive this repository.
Archived *bool `json:"archived,omitempty"`
// SizeLimit of the repository.
SizeLimit *int64 `json:"size_limit,omitempty"`
// set to a string like `8h30m0s` to set the mirror interval time
MirrorInterval *string `json:"mirror_interval,omitempty"`
// enable prune - remove obsolete remote-tracking references
Expand Down
3 changes: 3 additions & 0 deletions options/locale/locale_en-US.ini
Original file line number Diff line number Diff line change
Expand Up @@ -840,6 +840,7 @@ owner_helper = Some organizations may not show up in the dropdown due to a maxim
repo_name = Repository Name
repo_name_helper = Good repository names use short, memorable and unique keywords.
repo_size = Repository Size
repo_size_limit = Repository Size Limit
template = Template
template_select = Select a template.
template_helper = Make repository a template
Expand Down Expand Up @@ -953,6 +954,8 @@ form.reach_limit_of_creation_1 = The owner has already reached the limit of %d r
form.reach_limit_of_creation_n = The owner has already reached the limit of %d repositories.
form.name_reserved = The repository name '%s' is reserved.
form.name_pattern_not_allowed = The pattern '%s' is not allowed in a repository name.
form.repo_size_limit_negative = Repository size limitation cannot be negative.
form.repo_size_limit_only_by_admins = Only administrators can change the repository size limitation.

need_auth = Authorization
migrate_options = Migration Options
Expand Down
5 changes: 5 additions & 0 deletions routers/api/v1/repo/repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,7 @@ func CreateUserRepo(ctx *context.APIContext, owner *user_model.User, opt api.Cre
DefaultBranch: opt.DefaultBranch,
TrustModel: repo_model.ToTrustModel(opt.TrustModel),
IsTemplate: opt.Template,
SizeLimit: opt.SizeLimit,
})
if err != nil {
if repo_model.IsErrRepoAlreadyExist(err) {
Expand Down Expand Up @@ -714,6 +715,10 @@ func updateBasicProperties(ctx *context.APIContext, opts api.EditRepoOption) err
repo.DefaultBranch = *opts.DefaultBranch
}

if opts.SizeLimit != nil {
repo.SizeLimit = *opts.SizeLimit
}

if err := repo_service.UpdateRepository(repo, visibilityChanged); err != nil {
ctx.Error(http.StatusInternalServerError, "UpdateRepository", err)
return err
Expand Down
23 changes: 23 additions & 0 deletions routers/private/hook_pre_receive.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,12 +113,35 @@ func HookPreReceive(ctx *gitea_context.PrivateContext) {
opts: opts,
}

repo := ourCtx.Repo.Repository
Comment thread
DmitryFrolovTri marked this conversation as resolved.

pushSize, err := git.CountObjectsWithEnv(ctx, repo.RepoPath(), ourCtx.env)
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]interface{}{
"err": err.Error(),
})
return
}
log.Trace("Push size %d", pushSize.Size)

// Iterate across the provided old commit IDs
for i := range opts.OldCommitIDs {
oldCommitID := opts.OldCommitIDs[i]
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
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),
})
}
Comment on lines +531 to +764

Copilot AI Jan 30, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's a critical bug in the size calculation logic when processing multiple refs in a single push. The variables addedSize, removedSize, incomingNewToRepoLFS, removedLFSSize, and addedLFSSize are declared outside the loop (lines 531-537) but are being accumulated within the loop (lines 573-764). This means that when multiple refs are pushed simultaneously (e.g., pushing multiple branches or tags), the size calculations from each ref will be added together, leading to incorrect total sizes. For example, if two branches share common objects, those objects will be double-counted. The variables should either be reset at the beginning of each iteration, or the size calculation and enforcement logic should be moved inside the loop after each ref is processed.

Copilot uses AI. Check for mistakes.
// 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):
preReceiveBranch(ourCtx, oldCommitID, newCommitID, refFullName)
Expand Down
1 change: 1 addition & 0 deletions routers/web/repo/repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,7 @@ func CreatePost(ctx *context.Context) {
AutoInit: form.AutoInit,
IsTemplate: form.Template,
TrustModel: repo_model.ToTrustModel(form.TrustModel),
SizeLimit: form.SizeLimit,
})
if err == nil {
log.Trace("Repository created [%d]: %s/%s", repo.ID, ctxUser.Name, repo.Name)
Expand Down
15 changes: 15 additions & 0 deletions routers/web/repo/setting.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ func SettingsCtxData(ctx *context.Context) {
ctx.Data["DisableNewPushMirrors"] = setting.Mirror.DisableNewPush
ctx.Data["DefaultMirrorInterval"] = setting.Mirror.DefaultInterval
ctx.Data["MinimumMirrorInterval"] = setting.Mirror.MinInterval
ctx.Data["Err_RepoSize"] = ctx.Repo.Repository.RepoSizeIsOversized(ctx.Repo.Repository.SizeLimit / 10) // less than 10% left

signing, _ := asymkey_service.SigningKey(ctx, ctx.Repo.Repository.RepoPath())
ctx.Data["SigningKeyAvailable"] = len(signing) > 0
Expand Down Expand Up @@ -119,6 +120,7 @@ func SettingsPost(ctx *context.Context) {
ctx.Data["CodeIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled

repo := ctx.Repo.Repository
ctx.Data["Err_RepoSize"] = repo.RepoSizeIsOversized(repo.SizeLimit / 10) // less than 10% left

switch ctx.FormString("action") {
case "update":
Expand Down Expand Up @@ -183,6 +185,19 @@ func SettingsPost(ctx *context.Context) {
return
}

if form.RepoSizeLimit < 0 {
ctx.Data["Err_RepoSizeLimit"] = true
ctx.RenderWithErr(ctx.Tr("repo.form.repo_size_limit_negative"), tplSettingsOptions, &form)
return
}

if !ctx.Doer.IsAdmin && repo.SizeLimit != form.RepoSizeLimit {
ctx.Data["Err_RepoSizeLimit"] = true
ctx.RenderWithErr(ctx.Tr("repo.form.repo_size_limit_only_by_admins"), tplSettingsOptions, &form)
return
}
repo.SizeLimit = form.RepoSizeLimit

repo.IsPrivate = form.Private
if err := repo_service.UpdateRepository(repo, visibilityChanged); err != nil {
ctx.ServerError("UpdateRepository", err)
Expand Down
2 changes: 2 additions & 0 deletions services/forms/repo_form.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ type CreateRepoForm struct {
Avatar bool
Labels bool
TrustModel string
SizeLimit int64
}

// Validate validates the fields
Expand Down Expand Up @@ -132,6 +133,7 @@ type RepoSettingForm struct {
Private bool
Template bool
EnablePrune bool
RepoSizeLimit int64

// Advanced settings
EnableWiki bool
Expand Down
6 changes: 6 additions & 0 deletions templates/repo/settings/options.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@
<input id="repo_name" name="repo_name" value="{{.Repository.Name}}" data-repo-name="{{.Repository.Name}}" autofocus required>
</div>
<div class="inline field">
<label>{{.i18n.Tr "repo.repo_size"}}</label>
<span {{if .Err_RepoSize}}class="ui text red"{{end}}>{{FileSize .Repository.Size}}{{if .Repository.SizeLimit}}/{{FileSize .Repository.SizeLimit}}{{end}}</span>
</div>
<div class="field {{if .Err_RepoSizeLimit}}error{{end}}" {{if not .IsAdmin}}style="display:none;"{{end}}>
Comment thread
silverwind marked this conversation as resolved.
Outdated
<label for="repo_size_limit">{{.locale.Tr "repo.repo_size_limit"}}</label>
<input id="repo_size_limit" name="repo_size_limit" type="number" value="{{.Repository.SizeLimit}}" data-repo-size-limit="{{.Repository.SizeLimit}}">
<label>{{.locale.Tr "repo.repo_size"}}</label>
<span>{{FileSize .Repository.Size}}</span>
</div>
Expand Down
12 changes: 12 additions & 0 deletions templates/swagger/v1_json.tmpl

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions tests/integration/api_helper_for_declarative_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -461,3 +461,17 @@ func doAPIAddRepoToOrganizationTeam(ctx APITestContext, teamID int64, orgName, r
ctx.Session.MakeRequest(t, req, http.StatusNoContent)
}
}

func doAPISetRepoSizeLimit(ctx APITestContext, owner, repo string, size int64) func(*testing.T) {
return func(t *testing.T) {
urlStr := fmt.Sprintf("/api/v1/repos/%s/%s?token=%s",
owner, repo, ctx.Token)
req := NewRequestWithJSON(t, http.MethodPatch, urlStr, &api.EditRepoOption{SizeLimit: &size})

if ctx.ExpectedCode != 0 {
ctx.Session.MakeRequest(t, req, ctx.ExpectedCode)
return
}
ctx.Session.MakeRequest(t, req, 200)
}
}
Loading