diff --git a/routers/web/shared/packages/packages.go b/routers/web/shared/packages/packages.go index 1d4fb1588d..538c1e4b71 100644 --- a/routers/web/shared/packages/packages.go +++ b/routers/web/shared/packages/packages.go @@ -9,7 +9,6 @@ import ( "net/http" "time" - "forgejo.org/models/db" packages_model "forgejo.org/models/packages" repo_model "forgejo.org/models/repo" user_model "forgejo.org/models/user" @@ -168,13 +167,12 @@ func SetRulePreviewContext(ctx *context.Context, owner *user_model.User) { PackageID: p.ID, IsInternal: optional.Some(false), Sort: packages_model.SortCreatedDesc, - Paginator: db.NewAbsoluteListOptions(pcr.KeepCount, 200), }) if err != nil { ctx.ServerError("SearchVersions", err) return } - for _, pv := range pvs { + for _, pv := range pvs[pcr.KeepCount:] { if skip, err := container_service.ShouldBeSkipped(ctx, pcr, p, pv); err != nil { ctx.ServerError("ShouldBeSkipped", err) return diff --git a/services/packages/cleanup/cleanup.go b/services/packages/cleanup/cleanup.go index f8b08a0b59..03ad853216 100644 --- a/services/packages/cleanup/cleanup.go +++ b/services/packages/cleanup/cleanup.go @@ -64,13 +64,12 @@ func ExecuteCleanupRules(outerCtx context.Context) error { PackageID: p.ID, IsInternal: optional.Some(false), Sort: packages_model.SortCreatedDesc, - Paginator: db.NewAbsoluteListOptions(pcr.KeepCount, 200), }) if err != nil { return fmt.Errorf("CleanupRule [%d]: SearchVersions failed: %w", pcr.ID, err) } versionDeleted := false - for _, pv := range pvs { + for _, pv := range pvs[pcr.KeepCount:] { if pcr.Type == packages_model.TypeContainer { if skip, err := container_service.ShouldBeSkipped(ctx, pcr, p, pv); err != nil { return fmt.Errorf("CleanupRule [%d]: container.ShouldBeSkipped failed: %w", pcr.ID, err) diff --git a/tests/integration/api_packages_test.go b/tests/integration/api_packages_test.go index 183c5ef4a4..2007b7d6b3 100644 --- a/tests/integration/api_packages_test.go +++ b/tests/integration/api_packages_test.go @@ -19,9 +19,11 @@ import ( unit_model "forgejo.org/models/unit" "forgejo.org/models/unittest" user_model "forgejo.org/models/user" + "forgejo.org/modules/container" "forgejo.org/modules/setting" api "forgejo.org/modules/structs" "forgejo.org/modules/test" + "forgejo.org/modules/translation" "forgejo.org/modules/util" packages_service "forgejo.org/services/packages" packages_cleanup_service "forgejo.org/services/packages/cleanup" @@ -535,6 +537,9 @@ func TestPackageCleanup(t *testing.T) { t.Run("CleanupRules", func(t *testing.T) { defer tests.PrintCurrentTest(t)() + locale := translation.NewLocale("en-US") + session := loginUser(t, user.Name) + type version struct { Version string ShouldExist bool @@ -656,17 +661,34 @@ func TestPackageCleanup(t *testing.T) { pcr, err := packages_model.InsertCleanupRule(db.DefaultContext, c.Rule) require.NoError(t, err) + req := NewRequest(t, "GET", fmt.Sprintf("/user/settings/packages/rules/%d/preview", pcr.ID)) + resp := session.MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + + toDelete := container.FilterSlice(c.Versions, func(v version) (version, bool) { + return v, !v.ShouldExist + }) + deletedCount := len(toDelete) + + // disabled rule would delete everything + if !pcr.Enabled { + deletedCount = 1 + htmlDoc.AssertSelection(t, htmlDoc.FindByText(fmt.Sprintf("a[href='/%s/-/packages/generic/package/keep']", user.Name), "keep"), true) + } + + htmlDoc.AssertSelection(t, htmlDoc.FindByText("p", locale.TrString("packages.owner.settings.cleanuprules.preview.overview", deletedCount)), true) + err = packages_cleanup_service.CleanupTask(db.DefaultContext, duration) require.NoError(t, err) for _, v := range c.Versions { pv, err := packages_model.GetVersionByNameAndVersion(db.DefaultContext, user.ID, packages_model.TypeGeneric, "package", v.Version) if v.ShouldExist { - require.NoError(t, err) + require.NoError(t, err, `version "%s" should exist`, v.Version) err = packages_service.DeletePackageVersionAndReferences(db.DefaultContext, pv) require.NoError(t, err) } else { - require.ErrorIs(t, err, packages_model.ErrPackageNotExist) + require.ErrorIs(t, err, packages_model.ErrPackageNotExist, `version "%s" should not exist`, v.Version) } }