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 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 7 additions & 0 deletions routers/api/v1/packages/package.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@ import (

"code.gitea.io/gitea/models/packages"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/log"
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/services/convert"
packages_service "code.gitea.io/gitea/services/packages"
cleanup_service "code.gitea.io/gitea/services/packages/cleanup"
)

// ListPackages gets all packages of an owner
Expand Down Expand Up @@ -167,6 +169,11 @@ func DeletePackage(ctx *context.APIContext) {
ctx.Error(http.StatusInternalServerError, "RemovePackageVersion", err)
return
}

if err := cleanup_service.PostPackageRemoval(ctx, ctx.Package.Descriptor); err != nil {
log.Error("PostPackageRemoval failed: %v", err)
}

ctx.Status(http.StatusNoContent)
}

Expand Down
12 changes: 12 additions & 0 deletions routers/web/admin/packages.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,11 @@ import (
packages_model "code.gitea.io/gitea/models/packages"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
packages_service "code.gitea.io/gitea/services/packages"
cleanup_service "code.gitea.io/gitea/services/packages/cleanup"
)

const (
Expand Down Expand Up @@ -92,11 +94,21 @@ func DeletePackageVersion(ctx *context.Context) {
return
}

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

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

if err := cleanup_service.PostPackageRemoval(ctx, pd); err != nil {
log.Error("PostPackageRemoval failed: %v", err)
}

ctx.Flash.Success(ctx.Tr("packages.settings.delete.success"))
ctx.JSON(http.StatusOK, map[string]interface{}{
"redirect": setting.AppSubURL + "/admin/packages?page=" + url.QueryEscape(ctx.FormString("page")) + "&q=" + url.QueryEscape(ctx.FormString("q")) + "&type=" + url.QueryEscape(ctx.FormString("type")),
Expand Down
5 changes: 5 additions & 0 deletions routers/web/user/package.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,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"
cleanup_service "code.gitea.io/gitea/services/packages/cleanup"
)

const (
Expand Down Expand Up @@ -376,6 +377,10 @@ func PackageSettingsPost(ctx *context.Context) {
ctx.Flash.Success(ctx.Tr("packages.settings.delete.success"))
}

if err := cleanup_service.PostPackageRemoval(ctx, ctx.Package.Descriptor); err != nil {
KN4CK3R marked this conversation as resolved.
Show resolved Hide resolved
log.Error("PostPackageRemoval failed: %v", err)
}

ctx.Redirect(ctx.Package.Owner.HTMLURL() + "/-/packages")
return
}
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 @@ -113,6 +113,11 @@ func AddOrUpdatePackageIndex(ctx context.Context, doer, owner *user_model.User,

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 @@ -145,8 +150,11 @@ func addOrUpdatePackageIndex(ctx context.Context, t *files_service.TemporaryUplo
if err != nil {
return fmt.Errorf("SearchVersions[%s]: %w", p.Name, err)
}

path := BuildPackagePath(p.LowerName)

if len(pvs) == 0 {
return nil
return t.RemoveFilesFromIndex(path)
}

pds, err := packages_model.GetPackageDescriptors(ctx, pvs)
Expand Down Expand Up @@ -186,7 +194,7 @@ func addOrUpdatePackageIndex(ctx context.Context, t *files_service.TemporaryUplo
b.WriteString("\n")
}

return writeObjectToIndex(t, BuildPackagePath(pds[0].Package.LowerName), &b)
return writeObjectToIndex(t, path, &b)
}

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

return nil
}

// PostPackageRemoval performs actions 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 PostPackageRemoval(ctx context.Context, pd *packages_model.PackageDescriptor) error {
if pd.Package.Type == packages_model.TypeCargo {
if err := cargo_service.AddOrUpdatePackageIndex(ctx, pd.Owner, pd.Owner, pd.Package.ID); err != nil {
return fmt.Errorf("cargo.AddOrUpdatePackageIndex failed: %w", err)
}
}
return nil
}