Skip to content

Commit 4aba8a6

Browse files
a1012112796lunnysilverwindDmitryFrolovTriGiteaBot
authored
Split lfs size from repository size (#22900)
releated to #21820 - Split `Size` in repository table as two new colunms, one is `GitSize` for git size, the other is `LFSSize` for lfs data. still store full size in `Size` colunm. - Show full size on ui, but show each of them by a `title`; example: ![image](https://user-images.githubusercontent.com/25342410/218636251-e200f085-d7e7-4a25-9ff1-b586a63e07a9.png) - Return full size in api response. --------- Signed-off-by: a1012112796 <[email protected]> Co-authored-by: Lunny Xiao <[email protected]> Co-authored-by: silverwind <[email protected]> Co-authored-by: DmitryFrolovTri <[email protected]> Co-authored-by: Giteabot <[email protected]>
1 parent 9538842 commit 4aba8a6

File tree

12 files changed

+112
-10
lines changed

12 files changed

+112
-10
lines changed

models/db/search.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ const (
2020
SearchOrderByNewest SearchOrderBy = "created_unix DESC"
2121
SearchOrderBySize SearchOrderBy = "size ASC"
2222
SearchOrderBySizeReverse SearchOrderBy = "size DESC"
23+
SearchOrderByGitSize SearchOrderBy = "git_size ASC"
24+
SearchOrderByGitSizeReverse SearchOrderBy = "git_size DESC"
25+
SearchOrderByLFSSize SearchOrderBy = "lfs_size ASC"
26+
SearchOrderByLFSSizeReverse SearchOrderBy = "lfs_size DESC"
2327
SearchOrderByID SearchOrderBy = "id ASC"
2428
SearchOrderByIDReverse SearchOrderBy = "id DESC"
2529
SearchOrderByStars SearchOrderBy = "num_stars ASC"

models/migrations/migrations.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,8 @@ var migrations = []Migration{
507507
NewMigration("Add variable table", v1_21.CreateVariableTable),
508508
// v262 -> v263
509509
NewMigration("Add TriggerEvent to action_run table", v1_21.AddTriggerEventToActionRun),
510+
// v263 -> v264
511+
NewMigration("Add git_size and lfs_size columns to repository table", v1_21.AddGitSizeAndLFSSizeToRepositoryTable),
510512
}
511513

512514
// GetCurrentDBVersion returns the current db version

models/migrations/v1_21/v263.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Copyright 2023 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package v1_21 //nolint
5+
6+
import (
7+
"fmt"
8+
9+
"xorm.io/xorm"
10+
)
11+
12+
// AddGitSizeAndLFSSizeToRepositoryTable: add GitSize and LFSSize columns to Repository
13+
func AddGitSizeAndLFSSizeToRepositoryTable(x *xorm.Engine) error {
14+
type Repository struct {
15+
GitSize int64 `xorm:"NOT NULL DEFAULT 0"`
16+
LFSSize int64 `xorm:"NOT NULL DEFAULT 0"`
17+
}
18+
19+
sess := x.NewSession()
20+
defer sess.Close()
21+
22+
if err := sess.Begin(); err != nil {
23+
return err
24+
}
25+
26+
if err := sess.Sync2(new(Repository)); err != nil {
27+
return fmt.Errorf("Sync2: %w", err)
28+
}
29+
30+
_, err := sess.Exec(`UPDATE repository SET lfs_size=(SELECT SUM(size) FROM lfs_meta_object WHERE lfs_meta_object.repository_id=repository.ID) WHERE EXISTS (SELECT 1 FROM lfs_meta_object WHERE lfs_meta_object.repository_id=repository.ID)`)
31+
if err != nil {
32+
return err
33+
}
34+
35+
_, err = sess.Exec(`UPDATE repository SET git_size = size - lfs_size`)
36+
if err != nil {
37+
return err
38+
}
39+
40+
return sess.Commit()
41+
}

models/repo/repo.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"code.gitea.io/gitea/models/db"
1717
"code.gitea.io/gitea/models/unit"
1818
user_model "code.gitea.io/gitea/models/user"
19+
"code.gitea.io/gitea/modules/base"
1920
"code.gitea.io/gitea/modules/log"
2021
"code.gitea.io/gitea/modules/markup"
2122
"code.gitea.io/gitea/modules/setting"
@@ -163,6 +164,8 @@ type Repository struct {
163164
IsTemplate bool `xorm:"INDEX NOT NULL DEFAULT false"`
164165
TemplateID int64 `xorm:"INDEX"`
165166
Size int64 `xorm:"NOT NULL DEFAULT 0"`
167+
GitSize int64 `xorm:"NOT NULL DEFAULT 0"`
168+
LFSSize int64 `xorm:"NOT NULL DEFAULT 0"`
166169
CodeIndexerStatus *RepoIndexerStatus `xorm:"-"`
167170
StatsIndexerStatus *RepoIndexerStatus `xorm:"-"`
168171
IsFsckEnabled bool `xorm:"NOT NULL DEFAULT true"`
@@ -196,6 +199,42 @@ func (repo *Repository) SanitizedOriginalURL() string {
196199
return u.String()
197200
}
198201

202+
// text representations to be returned in SizeDetail.Name
203+
const (
204+
SizeDetailNameGit = "git"
205+
SizeDetailNameLFS = "lfs"
206+
)
207+
208+
type SizeDetail struct {
209+
Name string
210+
Size int64
211+
}
212+
213+
// SizeDetails forms a struct with various size details about repository
214+
func (repo *Repository) SizeDetails() []SizeDetail {
215+
sizeDetails := []SizeDetail{
216+
{
217+
Name: SizeDetailNameGit,
218+
Size: repo.GitSize,
219+
},
220+
{
221+
Name: SizeDetailNameLFS,
222+
Size: repo.LFSSize,
223+
},
224+
}
225+
return sizeDetails
226+
}
227+
228+
// SizeDetailsString returns a concatenation of all repository size details as a string
229+
func (repo *Repository) SizeDetailsString() string {
230+
var str strings.Builder
231+
sizeDetails := repo.SizeDetails()
232+
for _, detail := range sizeDetails {
233+
str.WriteString(fmt.Sprintf("%s: %s, ", detail.Name, base.FileSize(detail.Size)))
234+
}
235+
return strings.TrimSuffix(str.String(), ", ")
236+
}
237+
199238
func (repo *Repository) LogString() string {
200239
if repo == nil {
201240
return "<Repository nil>"

models/repo/update.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,9 +185,11 @@ func ChangeRepositoryName(doer *user_model.User, repo *Repository, newRepoName s
185185
}
186186

187187
// UpdateRepoSize updates the repository size, calculating it using getDirectorySize
188-
func UpdateRepoSize(ctx context.Context, repoID, size int64) error {
189-
_, err := db.GetEngine(ctx).ID(repoID).Cols("size").NoAutoTime().Update(&Repository{
190-
Size: size,
188+
func UpdateRepoSize(ctx context.Context, repoID, gitSize, lfsSize int64) error {
189+
_, err := db.GetEngine(ctx).ID(repoID).Cols("size", "git_size", "lfs_size").NoAutoTime().Update(&Repository{
190+
Size: gitSize + lfsSize,
191+
GitSize: gitSize,
192+
LFSSize: lfsSize,
191193
})
192194
return err
193195
}

modules/repository/create.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ func UpdateRepoSize(ctx context.Context, repo *repo_model.Repository) error {
330330
return fmt.Errorf("updateSize: GetLFSMetaObjects: %w", err)
331331
}
332332

333-
return repo_model.UpdateRepoSize(ctx, repo.ID, size+lfsSize)
333+
return repo_model.UpdateRepoSize(ctx, repo.ID, size, lfsSize)
334334
}
335335

336336
// CheckDaemonExportOK creates/removes git-daemon-export-ok for git-daemon...

options/locale/locale_en-US.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2797,6 +2797,7 @@ repos.stars = Stars
27972797
repos.forks = Forks
27982798
repos.issues = Issues
27992799
repos.size = Size
2800+
repos.lfs_size = LFS Size
28002801
28012802
packages.package_manage_panel = Package Management
28022803
packages.total_size = Total Size: %s

routers/web/explore/repo.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,14 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) {
7373
orderBy = db.SearchOrderBySizeReverse
7474
case "size":
7575
orderBy = db.SearchOrderBySize
76+
case "reversegitsize":
77+
orderBy = db.SearchOrderByGitSizeReverse
78+
case "gitsize":
79+
orderBy = db.SearchOrderByGitSize
80+
case "reverselfssize":
81+
orderBy = db.SearchOrderByLFSSizeReverse
82+
case "lfssize":
83+
orderBy = db.SearchOrderByLFSSize
7684
case "moststars":
7785
orderBy = db.SearchOrderByStarsReverse
7886
case "feweststars":

templates/admin/repo/list.tmpl

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,13 @@
2929
{{SortArrow "mostforks" "fewestforks" $.SortType false}}
3030
</th>
3131
<th>{{.locale.Tr "admin.repos.issues"}}</th>
32-
<th data-sortt-asc="size" data-sortt-desc="reversesize">
32+
<th data-sortt-asc="gitsize" data-sortt-desc="reversegitsize">
3333
{{.locale.Tr "admin.repos.size"}}
34-
{{SortArrow "size" "reversesize" $.SortType false}}
34+
{{SortArrow "gitsize" "reversegitsize" $.SortType false}}
35+
</th>
36+
<th data-sortt-asc="lfssize" data-sortt-desc="reverselfssize">
37+
{{.locale.Tr "admin.repos.lfs_size"}}
38+
{{SortArrow "lfssize" "reverselfssize" $.SortType false}}
3539
</th>
3640
<th>{{.locale.Tr "admin.auths.updated"}}</th>
3741
<th>{{.locale.Tr "admin.users.created"}}</th>
@@ -80,7 +84,8 @@
8084
<td>{{.NumStars}}</td>
8185
<td>{{.NumForks}}</td>
8286
<td>{{.NumIssues}}</td>
83-
<td>{{FileSize .Size}}</td>
87+
<td>{{FileSize .GitSize}}</td>
88+
<td>{{FileSize .LFSSize}}</td>
8489
<td>{{DateTime "short" .UpdatedUnix}}</td>
8590
<td>{{DateTime "short" .CreatedUnix}}</td>
8691
<td><a class="delete-button" href="" data-url="{{$.Link}}/delete?page={{$.Page.Paginater.Current}}&sort={{$.SortType}}" data-id="{{.ID}}" data-name="{{.Name}}">{{svg "octicon-trash"}}</a></td>

templates/repo/settings/options.tmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
</div>
1515
<div class="inline field">
1616
<label>{{.locale.Tr "repo.repo_size"}}</label>
17-
<span>{{FileSize .Repository.Size}}</span>
17+
<span {{if not (eq .Repository.Size 0)}} data-tooltip-content="{{.Repository.SizeDetailsString}}"{{end}}>{{FileSize .Repository.Size}}</span>
1818
</div>
1919
<div class="inline field">
2020
<label>{{.locale.Tr "repo.template"}}</label>

templates/repo/sub_menu.tmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<a href="{{.RepoLink}}/tags">{{svg "octicon-tag"}} <b>{{.NumTags}}</b> {{.locale.TrN .NumTags "repo.tag" "repo.tags"}}</a>
1515
</div>
1616
{{end}}
17-
<div class="item">
17+
<div class="item" {{if not (eq .Repository.Size 0)}}data-tooltip-content="{{.Repository.SizeDetailsString}}"{{end}}>
1818
{{$fileSizeFormatted := FileSize .Repository.Size}}{{/* the formatted string is always "{val} {unit}" */}}
1919
{{$fileSizeFields := StringUtils.Split $fileSizeFormatted " "}}
2020
<span>{{svg "octicon-database"}} <b>{{.locale.PrettyNumber (index $fileSizeFields 0)}}</b> {{index $fileSizeFields 1}}</span>

templates/user/settings/repos.tmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
<span class="icon">{{svg "octicon-repo"}}</span>
2525
{{end}}
2626
<a class="muted name" href="{{$repo.Link}}">{{$repo.OwnerName}}/{{$repo.Name}}</a>
27-
<span class="text light-3">{{FileSize $repo.Size}}</span>
27+
<span class="text light-3" {{if not (eq $repo.Size 0)}} data-tooltip-content="{{$repo.SizeDetailsString}}"{{end}}>{{FileSize $repo.Size}}</span>
2828
{{if $repo.IsFork}}
2929
{{$.locale.Tr "repo.forked_from"}}
3030
<span><a href="{{$repo.BaseRepo.Link}}">{{$repo.BaseRepo.OwnerName}}/{{$repo.BaseRepo.Name}}</a></span>

0 commit comments

Comments
 (0)