Skip to content

Commit 0c6ae61

Browse files
KN4CK3Rsilverwind
andauthored
Allow package cleanup from admin page (#25307)
Until now expired package data gets deleted daily by a cronjob. The admin page shows the size of all packages and the size of unreferenced data. The users (#25035, #20631) expect the deletion of this data if they run the cronjob from the admin page but the job only deletes data older than 24h. This PR adds a new button which deletes all expired data. ![grafik](https://github.com/go-gitea/gitea/assets/1666336/b3e35d73-9496-4fa7-a20c-e5d30b1f6850) --------- Co-authored-by: silverwind <[email protected]>
1 parent c2b6897 commit 0c6ae61

File tree

7 files changed

+45
-7
lines changed

7 files changed

+45
-7
lines changed

options/locale/locale_en-US.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2833,6 +2833,7 @@ repos.lfs_size = LFS Size
28332833
packages.package_manage_panel = Package Management
28342834
packages.total_size = Total Size: %s
28352835
packages.unreferenced_size = Unreferenced Size: %s
2836+
packages.cleanup = Clean up expired data
28362837
packages.owner = Owner
28372838
packages.creator = Creator
28382839
packages.name = Name

routers/web/admin/packages.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package admin
66
import (
77
"net/http"
88
"net/url"
9+
"time"
910

1011
"code.gitea.io/gitea/models/db"
1112
packages_model "code.gitea.io/gitea/models/packages"
@@ -14,6 +15,7 @@ import (
1415
"code.gitea.io/gitea/modules/setting"
1516
"code.gitea.io/gitea/modules/util"
1617
packages_service "code.gitea.io/gitea/services/packages"
18+
packages_cleanup_service "code.gitea.io/gitea/services/packages/cleanup"
1719
)
1820

1921
const (
@@ -99,3 +101,13 @@ func DeletePackageVersion(ctx *context.Context) {
99101
ctx.Flash.Success(ctx.Tr("packages.settings.delete.success"))
100102
ctx.JSONRedirect(setting.AppSubURL + "/admin/packages?page=" + url.QueryEscape(ctx.FormString("page")) + "&q=" + url.QueryEscape(ctx.FormString("q")) + "&type=" + url.QueryEscape(ctx.FormString("type")))
101103
}
104+
105+
func CleanupExpiredData(ctx *context.Context) {
106+
if err := packages_cleanup_service.CleanupExpiredData(ctx, time.Duration(0)); err != nil {
107+
ctx.ServerError("CleanupExpiredData", err)
108+
return
109+
}
110+
111+
ctx.Flash.Success(ctx.Tr("packages.cleanup.success"))
112+
ctx.Redirect(setting.AppSubURL + "/admin/packages")
113+
}

routers/web/web.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,7 @@ func registerRoutes(m *web.Route) {
597597
m.Group("/packages", func() {
598598
m.Get("", admin.Packages)
599599
m.Post("/delete", admin.DeletePackageVersion)
600+
m.Post("/cleanup", admin.CleanupExpiredData)
600601
}, packagesEnabled)
601602

602603
m.Group("/hooks", func() {

services/cron/tasks_basic.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ func registerCleanupPackages() {
152152
OlderThan: 24 * time.Hour,
153153
}, func(ctx context.Context, _ *user_model.User, config Config) error {
154154
realConfig := config.(*OlderThanConfig)
155-
return packages_cleanup_service.Cleanup(ctx, realConfig.OlderThan)
155+
return packages_cleanup_service.CleanupTask(ctx, realConfig.OlderThan)
156156
})
157157
}
158158

services/packages/cleanup/cleanup.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,25 @@ import (
2020
debian_service "code.gitea.io/gitea/services/packages/debian"
2121
)
2222

23-
// Cleanup removes expired package data
24-
func Cleanup(taskCtx context.Context, olderThan time.Duration) error {
25-
ctx, committer, err := db.TxContext(taskCtx)
23+
// Task method to execute cleanup rules and cleanup expired package data
24+
func CleanupTask(ctx context.Context, olderThan time.Duration) error {
25+
if err := ExecuteCleanupRules(ctx); err != nil {
26+
return err
27+
}
28+
29+
return CleanupExpiredData(ctx, olderThan)
30+
}
31+
32+
func ExecuteCleanupRules(outerCtx context.Context) error {
33+
ctx, committer, err := db.TxContext(outerCtx)
2634
if err != nil {
2735
return err
2836
}
2937
defer committer.Close()
3038

3139
err = packages_model.IterateEnabledCleanupRules(ctx, func(ctx context.Context, pcr *packages_model.PackageCleanupRule) error {
3240
select {
33-
case <-taskCtx.Done():
41+
case <-outerCtx.Done():
3442
return db.ErrCancelledf("While processing package cleanup rules")
3543
default:
3644
}
@@ -122,6 +130,16 @@ func Cleanup(taskCtx context.Context, olderThan time.Duration) error {
122130
return err
123131
}
124132

133+
return committer.Commit()
134+
}
135+
136+
func CleanupExpiredData(outerCtx context.Context, olderThan time.Duration) error {
137+
ctx, committer, err := db.TxContext(outerCtx)
138+
if err != nil {
139+
return err
140+
}
141+
defer committer.Close()
142+
125143
if err := container_service.Cleanup(ctx, olderThan); err != nil {
126144
return err
127145
}

templates/admin/packages/list.tmpl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@
44
{{.locale.Tr "admin.packages.package_manage_panel"}} ({{.locale.Tr "admin.total" .TotalCount}},
55
{{.locale.Tr "admin.packages.total_size" (FileSize .TotalBlobSize)}},
66
{{.locale.Tr "admin.packages.unreferenced_size" (FileSize .TotalUnreferencedBlobSize)}})
7+
<div class="ui right">
8+
<form method="post" action="/admin/packages/cleanup">
9+
{{.CsrfTokenHtml}}
10+
<button class="ui primary tiny button">{{.locale.Tr "admin.packages.cleanup"}}</button>
11+
</form>
12+
</div>
713
</h4>
814
<div class="ui attached segment">
915
<form class="ui form ignore-dirty">

tests/integration/api_packages_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,7 @@ func TestPackageCleanup(t *testing.T) {
475475
_, err = packages_model.GetInternalVersionByNameAndVersion(db.DefaultContext, user.ID, packages_model.TypeContainer, "cleanup-test", container_model.UploadVersion)
476476
assert.NoError(t, err)
477477

478-
err = packages_cleanup_service.Cleanup(db.DefaultContext, duration)
478+
err = packages_cleanup_service.CleanupTask(db.DefaultContext, duration)
479479
assert.NoError(t, err)
480480

481481
pbs, err = packages_model.FindExpiredUnreferencedBlobs(db.DefaultContext, duration)
@@ -610,7 +610,7 @@ func TestPackageCleanup(t *testing.T) {
610610
pcr, err := packages_model.InsertCleanupRule(db.DefaultContext, c.Rule)
611611
assert.NoError(t, err)
612612

613-
err = packages_cleanup_service.Cleanup(db.DefaultContext, duration)
613+
err = packages_cleanup_service.CleanupTask(db.DefaultContext, duration)
614614
assert.NoError(t, err)
615615

616616
for _, v := range c.Versions {

0 commit comments

Comments
 (0)