mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 11:41:32 +01:00 
			
		
		
		
	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:  - 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>
This commit is contained in:
		
							parent
							
								
									9538842364
								
							
						
					
					
						commit
						4aba8a6a5f
					
				| @ -20,6 +20,10 @@ const ( | |||||||
| 	SearchOrderByNewest                SearchOrderBy = "created_unix DESC" | 	SearchOrderByNewest                SearchOrderBy = "created_unix DESC" | ||||||
| 	SearchOrderBySize                  SearchOrderBy = "size ASC" | 	SearchOrderBySize                  SearchOrderBy = "size ASC" | ||||||
| 	SearchOrderBySizeReverse           SearchOrderBy = "size DESC" | 	SearchOrderBySizeReverse           SearchOrderBy = "size DESC" | ||||||
|  | 	SearchOrderByGitSize               SearchOrderBy = "git_size ASC" | ||||||
|  | 	SearchOrderByGitSizeReverse        SearchOrderBy = "git_size DESC" | ||||||
|  | 	SearchOrderByLFSSize               SearchOrderBy = "lfs_size ASC" | ||||||
|  | 	SearchOrderByLFSSizeReverse        SearchOrderBy = "lfs_size DESC" | ||||||
| 	SearchOrderByID                    SearchOrderBy = "id ASC" | 	SearchOrderByID                    SearchOrderBy = "id ASC" | ||||||
| 	SearchOrderByIDReverse             SearchOrderBy = "id DESC" | 	SearchOrderByIDReverse             SearchOrderBy = "id DESC" | ||||||
| 	SearchOrderByStars                 SearchOrderBy = "num_stars ASC" | 	SearchOrderByStars                 SearchOrderBy = "num_stars ASC" | ||||||
|  | |||||||
| @ -507,6 +507,8 @@ var migrations = []Migration{ | |||||||
| 	NewMigration("Add variable table", v1_21.CreateVariableTable), | 	NewMigration("Add variable table", v1_21.CreateVariableTable), | ||||||
| 	// v262 -> v263 | 	// v262 -> v263 | ||||||
| 	NewMigration("Add TriggerEvent to action_run table", v1_21.AddTriggerEventToActionRun), | 	NewMigration("Add TriggerEvent to action_run table", v1_21.AddTriggerEventToActionRun), | ||||||
|  | 	// v263 -> v264 | ||||||
|  | 	NewMigration("Add git_size and lfs_size columns to repository table", v1_21.AddGitSizeAndLFSSizeToRepositoryTable), | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // GetCurrentDBVersion returns the current db version | // GetCurrentDBVersion returns the current db version | ||||||
|  | |||||||
							
								
								
									
										41
									
								
								models/migrations/v1_21/v263.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								models/migrations/v1_21/v263.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,41 @@ | |||||||
|  | // Copyright 2023 The Gitea Authors. All rights reserved. | ||||||
|  | // SPDX-License-Identifier: MIT | ||||||
|  | 
 | ||||||
|  | package v1_21 //nolint | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 
 | ||||||
|  | 	"xorm.io/xorm" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // AddGitSizeAndLFSSizeToRepositoryTable: add GitSize and LFSSize columns to Repository | ||||||
|  | func AddGitSizeAndLFSSizeToRepositoryTable(x *xorm.Engine) error { | ||||||
|  | 	type Repository struct { | ||||||
|  | 		GitSize int64 `xorm:"NOT NULL DEFAULT 0"` | ||||||
|  | 		LFSSize int64 `xorm:"NOT NULL DEFAULT 0"` | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	sess := x.NewSession() | ||||||
|  | 	defer sess.Close() | ||||||
|  | 
 | ||||||
|  | 	if err := sess.Begin(); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if err := sess.Sync2(new(Repository)); err != nil { | ||||||
|  | 		return fmt.Errorf("Sync2: %w", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	_, 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)`) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	_, err = sess.Exec(`UPDATE repository SET git_size = size - lfs_size`) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return sess.Commit() | ||||||
|  | } | ||||||
| @ -16,6 +16,7 @@ import ( | |||||||
| 	"code.gitea.io/gitea/models/db" | 	"code.gitea.io/gitea/models/db" | ||||||
| 	"code.gitea.io/gitea/models/unit" | 	"code.gitea.io/gitea/models/unit" | ||||||
| 	user_model "code.gitea.io/gitea/models/user" | 	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/log" | ||||||
| 	"code.gitea.io/gitea/modules/markup" | 	"code.gitea.io/gitea/modules/markup" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| @ -163,6 +164,8 @@ type Repository struct { | |||||||
| 	IsTemplate                      bool               `xorm:"INDEX NOT NULL DEFAULT false"` | 	IsTemplate                      bool               `xorm:"INDEX NOT NULL DEFAULT false"` | ||||||
| 	TemplateID                      int64              `xorm:"INDEX"` | 	TemplateID                      int64              `xorm:"INDEX"` | ||||||
| 	Size                            int64              `xorm:"NOT NULL DEFAULT 0"` | 	Size                            int64              `xorm:"NOT NULL DEFAULT 0"` | ||||||
|  | 	GitSize                         int64              `xorm:"NOT NULL DEFAULT 0"` | ||||||
|  | 	LFSSize                         int64              `xorm:"NOT NULL DEFAULT 0"` | ||||||
| 	CodeIndexerStatus               *RepoIndexerStatus `xorm:"-"` | 	CodeIndexerStatus               *RepoIndexerStatus `xorm:"-"` | ||||||
| 	StatsIndexerStatus              *RepoIndexerStatus `xorm:"-"` | 	StatsIndexerStatus              *RepoIndexerStatus `xorm:"-"` | ||||||
| 	IsFsckEnabled                   bool               `xorm:"NOT NULL DEFAULT true"` | 	IsFsckEnabled                   bool               `xorm:"NOT NULL DEFAULT true"` | ||||||
| @ -196,6 +199,42 @@ func (repo *Repository) SanitizedOriginalURL() string { | |||||||
| 	return u.String() | 	return u.String() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // text representations to be returned in SizeDetail.Name | ||||||
|  | const ( | ||||||
|  | 	SizeDetailNameGit = "git" | ||||||
|  | 	SizeDetailNameLFS = "lfs" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type SizeDetail struct { | ||||||
|  | 	Name string | ||||||
|  | 	Size int64 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SizeDetails forms a struct with various size details about repository | ||||||
|  | func (repo *Repository) SizeDetails() []SizeDetail { | ||||||
|  | 	sizeDetails := []SizeDetail{ | ||||||
|  | 		{ | ||||||
|  | 			Name: SizeDetailNameGit, | ||||||
|  | 			Size: repo.GitSize, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			Name: SizeDetailNameLFS, | ||||||
|  | 			Size: repo.LFSSize, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	return sizeDetails | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SizeDetailsString returns a concatenation of all repository size details as a string | ||||||
|  | func (repo *Repository) SizeDetailsString() string { | ||||||
|  | 	var str strings.Builder | ||||||
|  | 	sizeDetails := repo.SizeDetails() | ||||||
|  | 	for _, detail := range sizeDetails { | ||||||
|  | 		str.WriteString(fmt.Sprintf("%s: %s, ", detail.Name, base.FileSize(detail.Size))) | ||||||
|  | 	} | ||||||
|  | 	return strings.TrimSuffix(str.String(), ", ") | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (repo *Repository) LogString() string { | func (repo *Repository) LogString() string { | ||||||
| 	if repo == nil { | 	if repo == nil { | ||||||
| 		return "<Repository nil>" | 		return "<Repository nil>" | ||||||
|  | |||||||
| @ -185,9 +185,11 @@ func ChangeRepositoryName(doer *user_model.User, repo *Repository, newRepoName s | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // UpdateRepoSize updates the repository size, calculating it using getDirectorySize | // UpdateRepoSize updates the repository size, calculating it using getDirectorySize | ||||||
| func UpdateRepoSize(ctx context.Context, repoID, size int64) error { | func UpdateRepoSize(ctx context.Context, repoID, gitSize, lfsSize int64) error { | ||||||
| 	_, err := db.GetEngine(ctx).ID(repoID).Cols("size").NoAutoTime().Update(&Repository{ | 	_, err := db.GetEngine(ctx).ID(repoID).Cols("size", "git_size", "lfs_size").NoAutoTime().Update(&Repository{ | ||||||
| 		Size: size, | 		Size:    gitSize + lfsSize, | ||||||
|  | 		GitSize: gitSize, | ||||||
|  | 		LFSSize: lfsSize, | ||||||
| 	}) | 	}) | ||||||
| 	return err | 	return err | ||||||
| } | } | ||||||
|  | |||||||
| @ -330,7 +330,7 @@ func UpdateRepoSize(ctx context.Context, repo *repo_model.Repository) error { | |||||||
| 		return fmt.Errorf("updateSize: GetLFSMetaObjects: %w", err) | 		return fmt.Errorf("updateSize: GetLFSMetaObjects: %w", err) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return repo_model.UpdateRepoSize(ctx, repo.ID, size+lfsSize) | 	return repo_model.UpdateRepoSize(ctx, repo.ID, size, lfsSize) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // CheckDaemonExportOK creates/removes git-daemon-export-ok for git-daemon... | // CheckDaemonExportOK creates/removes git-daemon-export-ok for git-daemon... | ||||||
|  | |||||||
| @ -2797,6 +2797,7 @@ repos.stars = Stars | |||||||
| repos.forks = Forks | repos.forks = Forks | ||||||
| repos.issues = Issues | repos.issues = Issues | ||||||
| repos.size = Size | repos.size = Size | ||||||
|  | repos.lfs_size = LFS Size | ||||||
| 
 | 
 | ||||||
| packages.package_manage_panel = Package Management | packages.package_manage_panel = Package Management | ||||||
| packages.total_size = Total Size: %s | packages.total_size = Total Size: %s | ||||||
|  | |||||||
| @ -73,6 +73,14 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { | |||||||
| 		orderBy = db.SearchOrderBySizeReverse | 		orderBy = db.SearchOrderBySizeReverse | ||||||
| 	case "size": | 	case "size": | ||||||
| 		orderBy = db.SearchOrderBySize | 		orderBy = db.SearchOrderBySize | ||||||
|  | 	case "reversegitsize": | ||||||
|  | 		orderBy = db.SearchOrderByGitSizeReverse | ||||||
|  | 	case "gitsize": | ||||||
|  | 		orderBy = db.SearchOrderByGitSize | ||||||
|  | 	case "reverselfssize": | ||||||
|  | 		orderBy = db.SearchOrderByLFSSizeReverse | ||||||
|  | 	case "lfssize": | ||||||
|  | 		orderBy = db.SearchOrderByLFSSize | ||||||
| 	case "moststars": | 	case "moststars": | ||||||
| 		orderBy = db.SearchOrderByStarsReverse | 		orderBy = db.SearchOrderByStarsReverse | ||||||
| 	case "feweststars": | 	case "feweststars": | ||||||
|  | |||||||
| @ -29,9 +29,13 @@ | |||||||
| 							{{SortArrow "mostforks" "fewestforks" $.SortType false}} | 							{{SortArrow "mostforks" "fewestforks" $.SortType false}} | ||||||
| 						</th> | 						</th> | ||||||
| 						<th>{{.locale.Tr "admin.repos.issues"}}</th> | 						<th>{{.locale.Tr "admin.repos.issues"}}</th> | ||||||
| 						<th  data-sortt-asc="size" data-sortt-desc="reversesize"> | 						<th  data-sortt-asc="gitsize" data-sortt-desc="reversegitsize"> | ||||||
| 							{{.locale.Tr "admin.repos.size"}} | 							{{.locale.Tr "admin.repos.size"}} | ||||||
| 							{{SortArrow "size" "reversesize" $.SortType false}} | 							{{SortArrow "gitsize" "reversegitsize" $.SortType false}} | ||||||
|  | 						</th> | ||||||
|  | 						<th  data-sortt-asc="lfssize" data-sortt-desc="reverselfssize"> | ||||||
|  | 							{{.locale.Tr "admin.repos.lfs_size"}} | ||||||
|  | 							{{SortArrow "lfssize" "reverselfssize" $.SortType false}} | ||||||
| 						</th> | 						</th> | ||||||
| 						<th>{{.locale.Tr "admin.auths.updated"}}</th> | 						<th>{{.locale.Tr "admin.auths.updated"}}</th> | ||||||
| 						<th>{{.locale.Tr "admin.users.created"}}</th> | 						<th>{{.locale.Tr "admin.users.created"}}</th> | ||||||
| @ -80,7 +84,8 @@ | |||||||
| 							<td>{{.NumStars}}</td> | 							<td>{{.NumStars}}</td> | ||||||
| 							<td>{{.NumForks}}</td> | 							<td>{{.NumForks}}</td> | ||||||
| 							<td>{{.NumIssues}}</td> | 							<td>{{.NumIssues}}</td> | ||||||
| 							<td>{{FileSize .Size}}</td> | 							<td>{{FileSize .GitSize}}</td> | ||||||
|  | 							<td>{{FileSize .LFSSize}}</td> | ||||||
| 							<td>{{DateTime "short" .UpdatedUnix}}</td> | 							<td>{{DateTime "short" .UpdatedUnix}}</td> | ||||||
| 							<td>{{DateTime "short" .CreatedUnix}}</td> | 							<td>{{DateTime "short" .CreatedUnix}}</td> | ||||||
| 							<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> | 							<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> | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 				</div> | 				</div> | ||||||
| 				<div class="inline field"> | 				<div class="inline field"> | ||||||
| 					<label>{{.locale.Tr "repo.repo_size"}}</label> | 					<label>{{.locale.Tr "repo.repo_size"}}</label> | ||||||
| 					<span>{{FileSize .Repository.Size}}</span> | 					<span {{if not (eq .Repository.Size 0)}} data-tooltip-content="{{.Repository.SizeDetailsString}}"{{end}}>{{FileSize .Repository.Size}}</span> | ||||||
| 				</div> | 				</div> | ||||||
| 				<div class="inline field"> | 				<div class="inline field"> | ||||||
| 					<label>{{.locale.Tr "repo.template"}}</label> | 					<label>{{.locale.Tr "repo.template"}}</label> | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 						<a href="{{.RepoLink}}/tags">{{svg "octicon-tag"}} <b>{{.NumTags}}</b> {{.locale.TrN .NumTags "repo.tag" "repo.tags"}}</a> | 						<a href="{{.RepoLink}}/tags">{{svg "octicon-tag"}} <b>{{.NumTags}}</b> {{.locale.TrN .NumTags "repo.tag" "repo.tags"}}</a> | ||||||
| 					</div> | 					</div> | ||||||
| 				{{end}} | 				{{end}} | ||||||
| 				<div class="item"> | 				<div class="item" {{if not (eq .Repository.Size 0)}}data-tooltip-content="{{.Repository.SizeDetailsString}}"{{end}}> | ||||||
| 					{{$fileSizeFormatted := FileSize .Repository.Size}}{{/* the formatted string is always "{val} {unit}" */}} | 					{{$fileSizeFormatted := FileSize .Repository.Size}}{{/* the formatted string is always "{val} {unit}" */}} | ||||||
| 					{{$fileSizeFields := StringUtils.Split $fileSizeFormatted " "}} | 					{{$fileSizeFields := StringUtils.Split $fileSizeFormatted " "}} | ||||||
| 					<span>{{svg "octicon-database"}} <b>{{.locale.PrettyNumber (index $fileSizeFields 0)}}</b> {{index $fileSizeFields 1}}</span> | 					<span>{{svg "octicon-database"}} <b>{{.locale.PrettyNumber (index $fileSizeFields 0)}}</b> {{index $fileSizeFields 1}}</span> | ||||||
|  | |||||||
| @ -24,7 +24,7 @@ | |||||||
| 											<span class="icon">{{svg "octicon-repo"}}</span> | 											<span class="icon">{{svg "octicon-repo"}}</span> | ||||||
| 										{{end}} | 										{{end}} | ||||||
| 										<a class="muted name" href="{{$repo.Link}}">{{$repo.OwnerName}}/{{$repo.Name}}</a> | 										<a class="muted name" href="{{$repo.Link}}">{{$repo.OwnerName}}/{{$repo.Name}}</a> | ||||||
| 										<span class="text light-3">{{FileSize $repo.Size}}</span> | 										<span class="text light-3" {{if not (eq $repo.Size 0)}} data-tooltip-content="{{$repo.SizeDetailsString}}"{{end}}>{{FileSize $repo.Size}}</span> | ||||||
| 										{{if $repo.IsFork}} | 										{{if $repo.IsFork}} | ||||||
| 											{{$.locale.Tr "repo.forked_from"}} | 											{{$.locale.Tr "repo.forked_from"}} | ||||||
| 											<span><a href="{{$repo.BaseRepo.Link}}">{{$repo.BaseRepo.OwnerName}}/{{$repo.BaseRepo.Name}}</a></span> | 											<span><a href="{{$repo.BaseRepo.Link}}">{{$repo.BaseRepo.OwnerName}}/{{$repo.BaseRepo.Name}}</a></span> | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user