@@ -85,7 +85,16 @@ func DeleteBlobByID(ctx context.Context, blobID int64) error { | |||
} | |||
// GetTotalBlobSize returns the total blobs size in bytes | |||
func GetTotalBlobSize() (int64, error) { | |||
return db.GetEngine(db.DefaultContext). | |||
func GetTotalBlobSize(ctx context.Context) (int64, error) { | |||
return db.GetEngine(ctx). | |||
SumInt(&PackageBlob{}, "size") | |||
} | |||
// GetTotalUnreferencedBlobSize returns the total size of all unreferenced blobs in bytes | |||
func GetTotalUnreferencedBlobSize(ctx context.Context) (int64, error) { | |||
return db.GetEngine(ctx). | |||
Table("package_blob"). | |||
Join("LEFT", "package_file", "package_file.blob_id = package_blob.id"). | |||
Where("package_file.id IS NULL"). | |||
SumInt(&PackageBlob{}, "size") | |||
} |
@@ -199,9 +199,9 @@ func SearchFiles(ctx context.Context, opts *PackageFileSearchOptions) ([]*Packag | |||
return pfs, count, err | |||
} | |||
// CalculateBlobSize sums up all blob sizes matching the search options. | |||
// CalculateFileSize sums up all blob sizes matching the search options. | |||
// It does NOT respect the deduplication of blobs. | |||
func CalculateBlobSize(ctx context.Context, opts *PackageFileSearchOptions) (int64, error) { | |||
func CalculateFileSize(ctx context.Context, opts *PackageFileSearchOptions) (int64, error) { | |||
return db.GetEngine(ctx). | |||
Table("package_file"). | |||
Where(opts.toConds()). |
@@ -2645,6 +2645,7 @@ repos.size = Size | |||
packages.package_manage_panel = Package Management | |||
packages.total_size = Total Size: %s | |||
packages.unreferenced_size = Unreferenced Size: %s | |||
packages.owner = Owner | |||
packages.creator = Creator | |||
packages.name = Name |
@@ -51,12 +51,18 @@ func Packages(ctx *context.Context) { | |||
return | |||
} | |||
totalBlobSize, err := packages_model.GetTotalBlobSize() | |||
totalBlobSize, err := packages_model.GetTotalBlobSize(ctx) | |||
if err != nil { | |||
ctx.ServerError("GetTotalBlobSize", err) | |||
return | |||
} | |||
totalUnreferencedBlobSize, err := packages_model.GetTotalUnreferencedBlobSize(ctx) | |||
if err != nil { | |||
ctx.ServerError("CalculateBlobSize", err) | |||
return | |||
} | |||
ctx.Data["Title"] = ctx.Tr("packages.title") | |||
ctx.Data["PageIsAdmin"] = true | |||
ctx.Data["PageIsAdminPackages"] = true | |||
@@ -65,8 +71,9 @@ func Packages(ctx *context.Context) { | |||
ctx.Data["AvailableTypes"] = packages_model.TypeList | |||
ctx.Data["SortType"] = sort | |||
ctx.Data["PackageDescriptors"] = pds | |||
ctx.Data["Total"] = total | |||
ctx.Data["TotalBlobSize"] = totalBlobSize | |||
ctx.Data["TotalCount"] = total | |||
ctx.Data["TotalBlobSize"] = totalBlobSize - totalUnreferencedBlobSize | |||
ctx.Data["TotalUnreferencedBlobSize"] = totalUnreferencedBlobSize | |||
pager := context.NewPagination(int(total), setting.UI.PackagesPagingNum, page, 5) | |||
pager.AddParamString("q", query) |
@@ -361,11 +361,11 @@ func checkSizeQuotaExceeded(ctx context.Context, doer, owner *user_model.User, p | |||
} | |||
if setting.Packages.LimitTotalOwnerSize > -1 { | |||
totalSize, err := packages_model.CalculateBlobSize(ctx, &packages_model.PackageFileSearchOptions{ | |||
totalSize, err := packages_model.CalculateFileSize(ctx, &packages_model.PackageFileSearchOptions{ | |||
OwnerID: owner.ID, | |||
}) | |||
if err != nil { | |||
log.Error("CalculateBlobSize failed: %v", err) | |||
log.Error("CalculateFileSize failed: %v", err) | |||
return err | |||
} | |||
if totalSize+uploadSize > setting.Packages.LimitTotalOwnerSize { |
@@ -4,7 +4,9 @@ | |||
<div class="ui container"> | |||
{{template "base/alert" .}} | |||
<h4 class="ui top attached header"> | |||
{{.locale.Tr "admin.packages.package_manage_panel"}} ({{.locale.Tr "admin.total" .Total}}, {{.locale.Tr "admin.packages.total_size" (FileSize .TotalBlobSize)}}) | |||
{{.locale.Tr "admin.packages.package_manage_panel"}} ({{.locale.Tr "admin.total" .TotalCount}}, | |||
{{.locale.Tr "admin.packages.total_size" (FileSize .TotalBlobSize)}}, | |||
{{.locale.Tr "admin.packages.unreferenced_size" (FileSize .TotalUnreferencedBlobSize)}}) | |||
</h4> | |||
<div class="ui attached segment"> | |||
<form class="ui form ignore-dirty"> |