Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Perform actions after a package was removed #22810

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions routers/api/v1/packages/package.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import (
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/routers/api/v1/utils"
"code.gitea.io/gitea/services/convert"
packages_service "code.gitea.io/gitea/services/packages"
packages_cleanup_service "code.gitea.io/gitea/services/packages/cleanup"
)

// ListPackages gets all packages of an owner
Expand Down Expand Up @@ -164,11 +164,12 @@ func DeletePackage(ctx *context.APIContext) {
// "404":
// "$ref": "#/responses/notFound"

err := packages_service.RemovePackageVersion(ctx, ctx.Doer, ctx.Package.Descriptor.Version)
err := packages_cleanup_service.RemovePackageVersionOutOfContext(ctx, ctx.Doer, ctx.Package.Descriptor)
if err != nil {
ctx.Error(http.StatusInternalServerError, "RemovePackageVersion", err)
ctx.Error(http.StatusInternalServerError, "RemovePackageVersionOutOfContext", err)
return
}

ctx.Status(http.StatusNoContent)
}

Expand Down
11 changes: 8 additions & 3 deletions routers/web/admin/packages.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import (
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
packages_service "code.gitea.io/gitea/services/packages"
packages_cleanup_service "code.gitea.io/gitea/services/packages/cleanup"
)

Expand Down Expand Up @@ -93,8 +92,14 @@ func DeletePackageVersion(ctx *context.Context) {
return
}

if err := packages_service.RemovePackageVersion(ctx, ctx.Doer, pv); err != nil {
ctx.ServerError("RemovePackageVersion", err)
pd, err := packages_model.GetPackageDescriptor(ctx, pv)
if err != nil {
ctx.ServerError("GetPackageDescriptor", err)
return
}

if err := packages_cleanup_service.RemovePackageVersionOutOfContext(ctx, ctx.Doer, pd); err != nil {
ctx.ServerError("RemovePackageVersionOutOfContext", err)
return
}

Expand Down
3 changes: 2 additions & 1 deletion routers/web/user/package.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import (
shared_user "code.gitea.io/gitea/routers/web/shared/user"
"code.gitea.io/gitea/services/forms"
packages_service "code.gitea.io/gitea/services/packages"
packages_cleanup_service "code.gitea.io/gitea/services/packages/cleanup"
)

const (
Expand Down Expand Up @@ -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 := packages_cleanup_service.RemovePackageVersionOutOfContext(ctx, ctx.Doer, ctx.Package.Descriptor)
if err != nil {
log.Error("Error deleting package: %v", err)
ctx.Flash.Error(ctx.Tr("packages.settings.delete.error"))
Expand Down
12 changes: 10 additions & 2 deletions services/packages/cargo/index.go
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,11 @@ func UpdatePackageIndexIfExists(ctx context.Context, doer, owner *user_model.Use

p, err := packages_model.GetPackageByID(ctx, packageID)
if err != nil {
if errors.Is(err, util.ErrNotExist) {
// Ignore the package if it does not exist.
// This may leave a dirty index which can be rebuild from user settings.
return nil
}
return fmt.Errorf("GetPackageByID[%d]: %w", packageID, err)
}

Expand Down Expand Up @@ -201,11 +206,14 @@ func addOrUpdatePackageIndex(ctx context.Context, t *files_service.TemporaryUplo
if err != nil {
return err
}

path := BuildPackagePath(p.LowerName)

if b == nil {
return nil
return t.RemoveFilesFromIndex(path)
}

return writeObjectToIndex(t, BuildPackagePath(p.LowerName), b)
return writeObjectToIndex(t, path, b)
}

func getOrCreateIndexRepository(ctx context.Context, doer, owner *user_model.User) (*repo_model.Repository, error) {
Expand Down
30 changes: 30 additions & 0 deletions services/packages/cleanup/cleanup.go
Original file line number Diff line number Diff line change
Expand Up @@ -191,3 +191,33 @@ func CleanupExpiredData(outerCtx context.Context, olderThan time.Duration) error

return nil
}

// RemovePackageVersionOutOfContext performs actions according to the package type after a package was deleted
// These actions are only needed if a package gets deleted outside of the defined
// package registry flow, for example when deleting a package from the UI or API.
func RemovePackageVersionOutOfContext(ctx context.Context, doer *user_model.User, pd *packages_model.PackageDescriptor) error {
if err := packages_service.RemovePackageVersion(ctx, doer, pd.Version); err != nil {
return err
}

switch pd.Package.Type {
case packages_model.TypeAlpine:
if err := alpine_service.BuildAllRepositoryFiles(ctx, pd.Owner.ID); err != nil {
return fmt.Errorf("alpine.BuildAllRepositoryFiles failed: %w", err)
}
case packages_model.TypeCargo:
if err := cargo_service.UpdatePackageIndexIfExists(ctx, doer, pd.Owner, pd.Package.ID); err != nil {
return fmt.Errorf("cargo.UpdatePackageIndexIfExists failed: %w", err)
}
case packages_model.TypeDebian:
if err := debian_service.BuildAllRepositoryFiles(ctx, pd.Owner.ID); err != nil {
return fmt.Errorf("debian.BuildAllRepositoryFiles failed: %w", err)
}
case packages_model.TypeRpm:
if err := rpm_service.BuildAllRepositoryFiles(ctx, pd.Owner.ID); err != nil {
return fmt.Errorf("rpm.BuildAllRepositoryFiles failed: %w", err)
}
}

return nil
}
Loading