diff --git a/routers/web/shared/packages/packages.go b/routers/web/shared/packages/packages.go index 538c1e4b71..0920beac5c 100644 --- a/routers/web/shared/packages/packages.go +++ b/routers/web/shared/packages/packages.go @@ -172,7 +172,8 @@ func SetRulePreviewContext(ctx *context.Context, owner *user_model.User) { ctx.ServerError("SearchVersions", err) return } - for _, pv := range pvs[pcr.KeepCount:] { + keep := min(len(pvs), pcr.KeepCount) + for _, pv := range pvs[keep:] { 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 03ad853216..d938ac6970 100644 --- a/services/packages/cleanup/cleanup.go +++ b/services/packages/cleanup/cleanup.go @@ -69,7 +69,8 @@ func ExecuteCleanupRules(outerCtx context.Context) error { return fmt.Errorf("CleanupRule [%d]: SearchVersions failed: %w", pcr.ID, err) } versionDeleted := false - for _, pv := range pvs[pcr.KeepCount:] { + keep := min(len(pvs), pcr.KeepCount) + for _, pv := range pvs[keep:] { 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 2007b7d6b3..0c616496ff 100644 --- a/tests/integration/api_packages_test.go +++ b/tests/integration/api_packages_test.go @@ -573,6 +573,19 @@ func TestPackageCleanup(t *testing.T) { KeepCount: 2, }, }, + { + Name: "KeepCountGreaterThanTotal", + Versions: []version{ + {Version: "keep", ShouldExist: true}, + {Version: "v1.0", ShouldExist: true}, + {Version: "test-3", ShouldExist: true}, + {Version: "test-4", ShouldExist: true}, + }, + Rule: &packages_model.PackageCleanupRule{ + Enabled: true, + KeepCount: 2000, + }, + }, { Name: "KeepPattern", Versions: []version{