loading up the forgejo repo on tangled to test page performance
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

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 <1012112796@qq.com>
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
Co-authored-by: silverwind <me@silverwind.io>
Co-authored-by: DmitryFrolovTri <23313323+DmitryFrolovTri@users.noreply.github.com>
Co-authored-by: Giteabot <teabot@gitea.io>

+112 -10
+4
models/db/search.go
··· 20 20 SearchOrderByNewest SearchOrderBy = "created_unix DESC" 21 21 SearchOrderBySize SearchOrderBy = "size ASC" 22 22 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" 23 27 SearchOrderByID SearchOrderBy = "id ASC" 24 28 SearchOrderByIDReverse SearchOrderBy = "id DESC" 25 29 SearchOrderByStars SearchOrderBy = "num_stars ASC"
+2
models/migrations/migrations.go
··· 507 507 NewMigration("Add variable table", v1_21.CreateVariableTable), 508 508 // v262 -> v263 509 509 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), 510 512 } 511 513 512 514 // GetCurrentDBVersion returns the current db version
+41
models/migrations/v1_21/v263.go
··· 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 + }
+39
models/repo/repo.go
··· 16 16 "code.gitea.io/gitea/models/db" 17 17 "code.gitea.io/gitea/models/unit" 18 18 user_model "code.gitea.io/gitea/models/user" 19 + "code.gitea.io/gitea/modules/base" 19 20 "code.gitea.io/gitea/modules/log" 20 21 "code.gitea.io/gitea/modules/markup" 21 22 "code.gitea.io/gitea/modules/setting" ··· 163 164 IsTemplate bool `xorm:"INDEX NOT NULL DEFAULT false"` 164 165 TemplateID int64 `xorm:"INDEX"` 165 166 Size int64 `xorm:"NOT NULL DEFAULT 0"` 167 + GitSize int64 `xorm:"NOT NULL DEFAULT 0"` 168 + LFSSize int64 `xorm:"NOT NULL DEFAULT 0"` 166 169 CodeIndexerStatus *RepoIndexerStatus `xorm:"-"` 167 170 StatsIndexerStatus *RepoIndexerStatus `xorm:"-"` 168 171 IsFsckEnabled bool `xorm:"NOT NULL DEFAULT true"` ··· 194 197 } 195 198 u.User = nil 196 199 return u.String() 200 + } 201 + 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(), ", ") 197 236 } 198 237 199 238 func (repo *Repository) LogString() string {
+5 -3
models/repo/update.go
··· 185 185 } 186 186 187 187 // 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, 191 193 }) 192 194 return err 193 195 }
+1 -1
modules/repository/create.go
··· 330 330 return fmt.Errorf("updateSize: GetLFSMetaObjects: %w", err) 331 331 } 332 332 333 - return repo_model.UpdateRepoSize(ctx, repo.ID, size+lfsSize) 333 + return repo_model.UpdateRepoSize(ctx, repo.ID, size, lfsSize) 334 334 } 335 335 336 336 // CheckDaemonExportOK creates/removes git-daemon-export-ok for git-daemon...
+1
options/locale/locale_en-US.ini
··· 2797 2797 repos.forks = Forks 2798 2798 repos.issues = Issues 2799 2799 repos.size = Size 2800 + repos.lfs_size = LFS Size 2800 2801 2801 2802 packages.package_manage_panel = Package Management 2802 2803 packages.total_size = Total Size: %s
+8
routers/web/explore/repo.go
··· 73 73 orderBy = db.SearchOrderBySizeReverse 74 74 case "size": 75 75 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 76 84 case "moststars": 77 85 orderBy = db.SearchOrderByStarsReverse 78 86 case "feweststars":
+8 -3
templates/admin/repo/list.tmpl
··· 29 29 {{SortArrow "mostforks" "fewestforks" $.SortType false}} 30 30 </th> 31 31 <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"> 33 33 {{.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}} 35 39 </th> 36 40 <th>{{.locale.Tr "admin.auths.updated"}}</th> 37 41 <th>{{.locale.Tr "admin.users.created"}}</th> ··· 80 84 <td>{{.NumStars}}</td> 81 85 <td>{{.NumForks}}</td> 82 86 <td>{{.NumIssues}}</td> 83 - <td>{{FileSize .Size}}</td> 87 + <td>{{FileSize .GitSize}}</td> 88 + <td>{{FileSize .LFSSize}}</td> 84 89 <td>{{DateTime "short" .UpdatedUnix}}</td> 85 90 <td>{{DateTime "short" .CreatedUnix}}</td> 86 91 <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>
+1 -1
templates/repo/settings/options.tmpl
··· 14 14 </div> 15 15 <div class="inline field"> 16 16 <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> 18 18 </div> 19 19 <div class="inline field"> 20 20 <label>{{.locale.Tr "repo.template"}}</label>
+1 -1
templates/repo/sub_menu.tmpl
··· 14 14 <a href="{{.RepoLink}}/tags">{{svg "octicon-tag"}} <b>{{.NumTags}}</b> {{.locale.TrN .NumTags "repo.tag" "repo.tags"}}</a> 15 15 </div> 16 16 {{end}} 17 - <div class="item"> 17 + <div class="item" {{if not (eq .Repository.Size 0)}}data-tooltip-content="{{.Repository.SizeDetailsString}}"{{end}}> 18 18 {{$fileSizeFormatted := FileSize .Repository.Size}}{{/* the formatted string is always "{val} {unit}" */}} 19 19 {{$fileSizeFields := StringUtils.Split $fileSizeFormatted " "}} 20 20 <span>{{svg "octicon-database"}} <b>{{.locale.PrettyNumber (index $fileSizeFields 0)}}</b> {{index $fileSizeFields 1}}</span>
+1 -1
templates/user/settings/repos.tmpl
··· 24 24 <span class="icon">{{svg "octicon-repo"}}</span> 25 25 {{end}} 26 26 <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> 28 28 {{if $repo.IsFork}} 29 29 {{$.locale.Tr "repo.forked_from"}} 30 30 <span><a href="{{$repo.BaseRepo.Link}}">{{$repo.BaseRepo.OwnerName}}/{{$repo.BaseRepo.Name}}</a></span>