Skip to content

Conversation

@lunny
Copy link
Member

@lunny lunny commented Jun 12, 2025

Fix #32830

Inspired by #22810 and replace it.

When deleting alphe, cargo, debian, rpm packages, some extra actions should be taken which was missed. It will result in dirty data and inconsistent. This PR fix it. To avoid recycle dependencies, this is a quick patch. Like #22810 (comment) said, this might need a new design for such more packages types.

@GiteaBot GiteaBot added the lgtm/need 2 This PR needs two approvals by maintainers to be considered for merging. label Jun 12, 2025
@lunny lunny added type/bug backport/v1.24 This PR should be backported to Gitea 1.24 and removed lgtm/need 2 This PR needs two approvals by maintainers to be considered for merging. labels Jun 12, 2025
@github-actions github-actions bot added lgtm/need 2 This PR needs two approvals by maintainers to be considered for merging. modifies/api This PR adds API routes or modifies them modifies/go Pull requests that update Go code and removed type/bug backport/v1.24 This PR should be backported to Gitea 1.24 labels Jun 12, 2025
@lunny lunny added type/bug backport/v1.24 This PR should be backported to Gitea 1.24 labels Jun 12, 2025
@lunny lunny requested a review from KN4CK3R June 13, 2025 06:32
@KN4CK3R
Copy link
Member

KN4CK3R commented Jun 17, 2025

I don't think this is cleaner than my PR. With this change some package types must call the remove method from the router, other types must call the remove method from the service.

@lunny
Copy link
Member Author

lunny commented Jun 18, 2025

I don't think this is cleaner than my PR. With this change some package types must call the remove method from the router, other types must call the remove method from the service.

Your implementation will still have a chance to fail with dirty data. The alpine_service.BuildAllRepositoryFiles(ctx, pd.Owner.ID) should be invoked in the same transaction inside RemovePackageVersion and the notification should not be invoked before all cleanup succeed. Currently, only routers invoke these functions, a new service package could be introduced if it will be invoked from command or other packages. As a quick patch, I think it's enough.

// DeletePackage deletes the specific generic package.
func DeletePackage(ctx *context.Context) {
err := packages_service.RemovePackageVersionByNameAndVersion(
err := common.RemovePackageVersionByNameAndVersion(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why the common is in "routers" package but not "services"?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you need to resolve the dependency problem, it should be something like services/packagemanager to manage all packages.


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 {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It calls RemovePackageVersion mutiple times and "build" again and again. It doesn't seem right.

It should introduce a final step to rebuild when the removal finishes.

@wxiaoguang wxiaoguang removed the backport/v1.24 This PR should be backported to Gitea 1.24 label Jun 21, 2025
@wxiaoguang
Copy link
Contributor

Don't backport since the design still has problems and no test.

@lunny lunny marked this pull request as draft June 21, 2025 16:54
@ExplodingDragon
Copy link
Contributor

ExplodingDragon commented Aug 16, 2025

Simply removing packages by version may cause issues, as identical versions can contain files residing in different groups (refer to #26984), governed by PackageFile.CompositeKey (

CompositeKey string `xorm:"UNIQUE(s) INDEX"`
).

For instance, package example might be non-latest in Alice’s group while being the latest in Bob’s group. If configured with a "retain-only-latest-versions" policy, cleanup should exclusively target example in Alice’s group.

A real-world case: gitea 1.23.8 in alpine/3.22 and 1.22.4 in alpine/3.21—both are the latest versions within their respective groups. Consequently, older versions should not be indiscriminately purged.

BTW cleanup functionality is actually implemented twice in the codebase:

services/packages/cleanup/cleanup.go#executeCleanupOneRulePackage
routers/web/shared/packages/packages.go#SetRulePreviewContext

This duplication may cause discrepancies between the preview results and actual execution outcomes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lgtm/need 2 This PR needs two approvals by maintainers to be considered for merging. modifies/api This PR adds API routes or modifies them modifies/go Pull requests that update Go code type/bug

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Deleting a debian package does not remove it from the apt Packages list that clients see

5 participants