Skip to content
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
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 {
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
}