From 61b5997ccd5b234f180d094061c407e877437cec Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 12 Jun 2025 11:52:27 -0700 Subject: [PATCH] Fix removing some packages will result dirty data --- routers/api/packages/chef/chef.go | 5 ++- routers/api/packages/generic/generic.go | 5 ++- routers/api/packages/npm/npm.go | 5 ++- routers/api/packages/nuget/nuget.go | 3 +- routers/api/packages/rubygems/rubygems.go | 3 +- routers/api/v1/packages/package.go | 3 +- routers/common/package.go | 45 +++++++++++++++++++++++ routers/web/admin/packages.go | 4 +- routers/web/user/package.go | 3 +- services/packages/alpine/update.go | 37 +++++++++++++++++++ services/packages/cargo/update.go | 37 +++++++++++++++++++ services/packages/debian/update.go | 37 +++++++++++++++++++ services/packages/packages.go | 10 ----- services/packages/rpm/update.go | 37 +++++++++++++++++++ 14 files changed, 212 insertions(+), 22 deletions(-) create mode 100644 routers/common/package.go create mode 100644 services/packages/alpine/update.go create mode 100644 services/packages/cargo/update.go create mode 100644 services/packages/debian/update.go create mode 100644 services/packages/rpm/update.go diff --git a/routers/api/packages/chef/chef.go b/routers/api/packages/chef/chef.go index a0c8c5696c..95b2113935 100644 --- a/routers/api/packages/chef/chef.go +++ b/routers/api/packages/chef/chef.go @@ -21,6 +21,7 @@ import ( "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/routers/common" "code.gitea.io/gitea/services/context" packages_service "code.gitea.io/gitea/services/packages" ) @@ -357,7 +358,7 @@ func DeletePackageVersion(ctx *context.Context) { packageName := ctx.PathParam("name") packageVersion := ctx.PathParam("version") - err := packages_service.RemovePackageVersionByNameAndVersion( + err := common.RemovePackageVersionByNameAndVersion( ctx, ctx.Doer, &packages_service.PackageInfo{ @@ -393,7 +394,7 @@ func DeletePackage(ctx *context.Context) { } for _, pv := range pvs { - if err := packages_service.RemovePackageVersion(ctx, ctx.Doer, pv); err != nil { + if err := common.RemovePackageVersion(ctx, ctx.Doer, pv); err != nil { apiError(ctx, http.StatusInternalServerError, err) return } diff --git a/routers/api/packages/generic/generic.go b/routers/api/packages/generic/generic.go index 0b5daa7334..5351c30bd2 100644 --- a/routers/api/packages/generic/generic.go +++ b/routers/api/packages/generic/generic.go @@ -14,6 +14,7 @@ import ( "code.gitea.io/gitea/modules/log" packages_module "code.gitea.io/gitea/modules/packages" "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/routers/common" "code.gitea.io/gitea/services/context" packages_service "code.gitea.io/gitea/services/packages" ) @@ -144,7 +145,7 @@ func UploadPackage(ctx *context.Context) { // DeletePackage deletes the specific generic package. func DeletePackage(ctx *context.Context) { - err := packages_service.RemovePackageVersionByNameAndVersion( + err := common.RemovePackageVersionByNameAndVersion( ctx, ctx.Doer, &packages_service.PackageInfo{ @@ -197,7 +198,7 @@ func DeletePackageFile(ctx *context.Context) { } if len(pfs) == 1 { - if err := packages_service.RemovePackageVersion(ctx, ctx.Doer, pv); err != nil { + if err := common.RemovePackageVersion(ctx, ctx.Doer, pv); err != nil { apiError(ctx, http.StatusInternalServerError, err) return } diff --git a/routers/api/packages/npm/npm.go b/routers/api/packages/npm/npm.go index 6ec46bcb36..aab57ab0df 100644 --- a/routers/api/packages/npm/npm.go +++ b/routers/api/packages/npm/npm.go @@ -23,6 +23,7 @@ import ( "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/routers/common" "code.gitea.io/gitea/services/context" packages_service "code.gitea.io/gitea/services/packages" @@ -256,7 +257,7 @@ func DeletePackageVersion(ctx *context.Context) { packageName := packageNameFromParams(ctx) packageVersion := ctx.PathParam("version") - err := packages_service.RemovePackageVersionByNameAndVersion( + err := common.RemovePackageVersionByNameAndVersion( ctx, ctx.Doer, &packages_service.PackageInfo{ @@ -294,7 +295,7 @@ func DeletePackage(ctx *context.Context) { } for _, pv := range pvs { - if err := packages_service.RemovePackageVersion(ctx, ctx.Doer, pv); err != nil { + if err := common.RemovePackageVersion(ctx, ctx.Doer, pv); err != nil { apiError(ctx, http.StatusInternalServerError, err) return } diff --git a/routers/api/packages/nuget/nuget.go b/routers/api/packages/nuget/nuget.go index fa5067a278..f163ae89e0 100644 --- a/routers/api/packages/nuget/nuget.go +++ b/routers/api/packages/nuget/nuget.go @@ -24,6 +24,7 @@ import ( "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/routers/common" "code.gitea.io/gitea/services/context" packages_service "code.gitea.io/gitea/services/packages" ) @@ -688,7 +689,7 @@ func DeletePackage(ctx *context.Context) { packageName := ctx.PathParam("id") packageVersion := ctx.PathParam("version") - err := packages_service.RemovePackageVersionByNameAndVersion( + err := common.RemovePackageVersionByNameAndVersion( ctx, ctx.Doer, &packages_service.PackageInfo{ diff --git a/routers/api/packages/rubygems/rubygems.go b/routers/api/packages/rubygems/rubygems.go index de8c7ef3ed..81894adec6 100644 --- a/routers/api/packages/rubygems/rubygems.go +++ b/routers/api/packages/rubygems/rubygems.go @@ -19,6 +19,7 @@ import ( rubygems_module "code.gitea.io/gitea/modules/packages/rubygems" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/routers/common" "code.gitea.io/gitea/services/context" packages_service "code.gitea.io/gitea/services/packages" ) @@ -277,7 +278,7 @@ func DeletePackage(ctx *context.Context) { packageName := ctx.FormString("gem_name") packageVersion := ctx.FormString("version") - err := packages_service.RemovePackageVersionByNameAndVersion( + err := common.RemovePackageVersionByNameAndVersion( ctx, ctx.Doer, &packages_service.PackageInfo{ diff --git a/routers/api/v1/packages/package.go b/routers/api/v1/packages/package.go index 41b7f2a43f..dfca786c10 100644 --- a/routers/api/v1/packages/package.go +++ b/routers/api/v1/packages/package.go @@ -13,6 +13,7 @@ import ( api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/routers/common" "code.gitea.io/gitea/services/context" "code.gitea.io/gitea/services/convert" packages_service "code.gitea.io/gitea/services/packages" @@ -148,7 +149,7 @@ func DeletePackage(ctx *context.APIContext) { // "404": // "$ref": "#/responses/notFound" - err := packages_service.RemovePackageVersion(ctx, ctx.Doer, ctx.Package.Descriptor.Version) + err := common.RemovePackageVersion(ctx, ctx.Doer, ctx.Package.Descriptor.Version) if err != nil { ctx.APIErrorInternal(err) return diff --git a/routers/common/package.go b/routers/common/package.go new file mode 100644 index 0000000000..cb137a1004 --- /dev/null +++ b/routers/common/package.go @@ -0,0 +1,45 @@ +// Copyright 2025 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package common + +import ( + "context" + + packages_model "code.gitea.io/gitea/models/packages" + user_model "code.gitea.io/gitea/models/user" + packages_service "code.gitea.io/gitea/services/packages" + alpine_service "code.gitea.io/gitea/services/packages/alpine" + cargo_service "code.gitea.io/gitea/services/packages/cargo" + debian_service "code.gitea.io/gitea/services/packages/debian" + rpm_service "code.gitea.io/gitea/services/packages/rpm" +) + +// RemovePackageVersionByNameAndVersion deletes a package version and all associated files +func RemovePackageVersionByNameAndVersion(ctx context.Context, doer *user_model.User, pvi *packages_service.PackageInfo) error { + pv, err := packages_model.GetVersionByNameAndVersion(ctx, pvi.Owner.ID, pvi.PackageType, pvi.Name, pvi.Version) + if err != nil { + return err + } + + return RemovePackageVersion(ctx, doer, pv) +} + +func RemovePackageVersion(ctx context.Context, doer *user_model.User, pv *packages_model.PackageVersion) error { + pd, err := packages_model.GetPackageDescriptor(ctx, pv) + if err != nil { + return err + } + switch pd.Package.Type { + case packages_model.TypeAlpine: + return alpine_service.RemovePackageVersion(ctx, doer, pv) + case packages_model.TypeCargo: + return cargo_service.RemovePackageVersion(ctx, doer, pv) + case packages_model.TypeDebian: + return debian_service.RemovePackageVersion(ctx, doer, pv) + case packages_model.TypeRpm: + return rpm_service.RemovePackageVersion(ctx, doer, pv) + default: + return packages_service.RemovePackageVersion(ctx, doer, pv) + } +} diff --git a/routers/web/admin/packages.go b/routers/web/admin/packages.go index 5122342259..9bd456d23b 100644 --- a/routers/web/admin/packages.go +++ b/routers/web/admin/packages.go @@ -13,8 +13,8 @@ import ( "code.gitea.io/gitea/modules/optional" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/templates" + "code.gitea.io/gitea/routers/common" "code.gitea.io/gitea/services/context" - packages_service "code.gitea.io/gitea/services/packages" packages_cleanup_service "code.gitea.io/gitea/services/packages/cleanup" ) @@ -91,7 +91,7 @@ func DeletePackageVersion(ctx *context.Context) { return } - if err := packages_service.RemovePackageVersion(ctx, ctx.Doer, pv); err != nil { + if err := common.RemovePackageVersion(ctx, ctx.Doer, pv); err != nil { ctx.ServerError("RemovePackageVersion", err) return } diff --git a/routers/web/user/package.go b/routers/web/user/package.go index 92af6d14ef..b5ab7e36ad 100644 --- a/routers/web/user/package.go +++ b/routers/web/user/package.go @@ -27,6 +27,7 @@ import ( "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/web" packages_helper "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/routers/common" shared_user "code.gitea.io/gitea/routers/web/shared/user" "code.gitea.io/gitea/services/context" "code.gitea.io/gitea/services/forms" @@ -457,7 +458,7 @@ func PackageSettingsPost(ctx *context.Context) { ctx.Redirect(ctx.Link) return case "delete": - err := packages_service.RemovePackageVersion(ctx, ctx.Doer, ctx.Package.Descriptor.Version) + err := common.RemovePackageVersion(ctx, ctx.Doer, ctx.Package.Descriptor.Version) if err != nil { log.Error("Error deleting package: %v", err) ctx.Flash.Error(ctx.Tr("packages.settings.delete.error")) diff --git a/services/packages/alpine/update.go b/services/packages/alpine/update.go new file mode 100644 index 0000000000..c9e628674b --- /dev/null +++ b/services/packages/alpine/update.go @@ -0,0 +1,37 @@ +// Copyright 2025 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package alpine + +import ( + "context" + "fmt" + + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + user_model "code.gitea.io/gitea/models/user" + notify_service "code.gitea.io/gitea/services/notify" + packages_service "code.gitea.io/gitea/services/packages" +) + +func RemovePackageVersion(ctx context.Context, doer *user_model.User, pv *packages_model.PackageVersion) error { + pd, err := packages_model.GetPackageDescriptor(ctx, pv) + if err != nil { + return err + } + + if err := db.WithTx(ctx, func(ctx context.Context) error { + if err := packages_service.DeletePackageVersionAndReferences(ctx, pv); err != nil { + return err + } + if err := BuildAllRepositoryFiles(ctx, pd.Owner.ID); err != nil { + return fmt.Errorf("alpine.BuildAllRepositoryFiles failed: %w", err) + } + return nil + }); err != nil { + return err + } + + notify_service.PackageDelete(ctx, doer, pd) + return nil +} diff --git a/services/packages/cargo/update.go b/services/packages/cargo/update.go new file mode 100644 index 0000000000..c47d229c48 --- /dev/null +++ b/services/packages/cargo/update.go @@ -0,0 +1,37 @@ +// Copyright 2025 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package cargo + +import ( + "context" + "fmt" + + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + user_model "code.gitea.io/gitea/models/user" + notify_service "code.gitea.io/gitea/services/notify" + packages_service "code.gitea.io/gitea/services/packages" +) + +func RemovePackageVersion(ctx context.Context, doer *user_model.User, pv *packages_model.PackageVersion) error { + pd, err := packages_model.GetPackageDescriptor(ctx, pv) + if err != nil { + return err + } + + if err := db.WithTx(ctx, func(ctx context.Context) error { + if err := packages_service.DeletePackageVersionAndReferences(ctx, pv); err != nil { + return err + } + if err := UpdatePackageIndexIfExists(ctx, doer, pd.Owner, pd.Package.ID); err != nil { + return fmt.Errorf("alpine.BuildAllRepositoryFiles failed: %w", err) + } + return nil + }); err != nil { + return err + } + + notify_service.PackageDelete(ctx, doer, pd) + return nil +} diff --git a/services/packages/debian/update.go b/services/packages/debian/update.go new file mode 100644 index 0000000000..0ef298b3a7 --- /dev/null +++ b/services/packages/debian/update.go @@ -0,0 +1,37 @@ +// Copyright 2025 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package debian + +import ( + "context" + "fmt" + + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + user_model "code.gitea.io/gitea/models/user" + notify_service "code.gitea.io/gitea/services/notify" + packages_service "code.gitea.io/gitea/services/packages" +) + +func RemovePackageVersion(ctx context.Context, doer *user_model.User, pv *packages_model.PackageVersion) error { + pd, err := packages_model.GetPackageDescriptor(ctx, pv) + if err != nil { + return err + } + + if err := db.WithTx(ctx, func(ctx context.Context) error { + if err := packages_service.DeletePackageVersionAndReferences(ctx, pv); err != nil { + return err + } + if err := BuildAllRepositoryFiles(ctx, pd.Owner.ID); err != nil { + return fmt.Errorf("alpine.BuildAllRepositoryFiles failed: %w", err) + } + return nil + }); err != nil { + return err + } + + notify_service.PackageDelete(ctx, doer, pd) + return nil +} diff --git a/services/packages/packages.go b/services/packages/packages.go index bd1d460fd3..db3533713b 100644 --- a/services/packages/packages.go +++ b/services/packages/packages.go @@ -456,16 +456,6 @@ func GetOrCreateInternalPackageVersion(ctx context.Context, ownerID int64, packa }) } -// RemovePackageVersionByNameAndVersion deletes a package version and all associated files -func RemovePackageVersionByNameAndVersion(ctx context.Context, doer *user_model.User, pvi *PackageInfo) error { - pv, err := packages_model.GetVersionByNameAndVersion(ctx, pvi.Owner.ID, pvi.PackageType, pvi.Name, pvi.Version) - if err != nil { - return err - } - - return RemovePackageVersion(ctx, doer, pv) -} - // RemovePackageVersion deletes the package version and all associated files func RemovePackageVersion(ctx context.Context, doer *user_model.User, pv *packages_model.PackageVersion) error { dbCtx, committer, err := db.TxContext(ctx) diff --git a/services/packages/rpm/update.go b/services/packages/rpm/update.go new file mode 100644 index 0000000000..417e2ad577 --- /dev/null +++ b/services/packages/rpm/update.go @@ -0,0 +1,37 @@ +// Copyright 2025 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package rpm + +import ( + "context" + "fmt" + + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + user_model "code.gitea.io/gitea/models/user" + notify_service "code.gitea.io/gitea/services/notify" + packages_service "code.gitea.io/gitea/services/packages" +) + +func RemovePackageVersion(ctx context.Context, doer *user_model.User, pv *packages_model.PackageVersion) error { + pd, err := packages_model.GetPackageDescriptor(ctx, pv) + if err != nil { + return err + } + + if err := db.WithTx(ctx, func(ctx context.Context) error { + if err := packages_service.DeletePackageVersionAndReferences(ctx, pv); err != nil { + return err + } + if err := BuildAllRepositoryFiles(ctx, pd.Owner.ID); err != nil { + return fmt.Errorf("alpine.BuildAllRepositoryFiles failed: %w", err) + } + return nil + }); err != nil { + return err + } + + notify_service.PackageDelete(ctx, doer, pd) + return nil +}