aboutsummaryrefslogtreecommitdiffstats
path: root/models/packages
diff options
context:
space:
mode:
authorKN4CK3R <admin@oldschoolhack.me>2022-09-03 18:01:00 +0200
committerGitHub <noreply@github.com>2022-09-03 17:01:00 +0100
commit5bc73ca666588ac26cc7cea219866b79c5263527 (patch)
tree85fed3af6d25077b3d4b854e86520c6c92155396 /models/packages
parent1670109b91a6d5cfb4da0225d7a52c423031322d (diff)
downloadgitea-5bc73ca666588ac26cc7cea219866b79c5263527.tar.gz
gitea-5bc73ca666588ac26cc7cea219866b79c5263527.zip
Delete unreferenced packages when deleting a package version (#20977)
Delete a package if its last version got deleted. Otherwise removing the owner works only after the clean up job ran. Fix #20969
Diffstat (limited to 'models/packages')
-rw-r--r--models/packages/package.go11
-rw-r--r--models/packages/package_test.go69
2 files changed, 78 insertions, 2 deletions
diff --git a/models/packages/package.go b/models/packages/package.go
index c203901a2d..e39a7c4e41 100644
--- a/models/packages/package.go
+++ b/models/packages/package.go
@@ -224,9 +224,16 @@ func FindUnreferencedPackages(ctx context.Context) ([]*Package, error) {
Find(&ps)
}
-// HasOwnerPackages tests if a user/org has packages
+// HasOwnerPackages tests if a user/org has accessible packages
func HasOwnerPackages(ctx context.Context, ownerID int64) (bool, error) {
- return db.GetEngine(ctx).Where("owner_id = ?", ownerID).Exist(&Package{})
+ return db.GetEngine(ctx).
+ Table("package_version").
+ Join("INNER", "package", "package.id = package_version.package_id").
+ Where(builder.Eq{
+ "package_version.is_internal": false,
+ "package.owner_id": ownerID,
+ }).
+ Exist(&PackageVersion{})
}
// HasRepositoryPackages tests if a repository has packages
diff --git a/models/packages/package_test.go b/models/packages/package_test.go
new file mode 100644
index 0000000000..3d3a2333ba
--- /dev/null
+++ b/models/packages/package_test.go
@@ -0,0 +1,69 @@
+// Copyright 2022 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package packages_test
+
+import (
+ "path/filepath"
+ "testing"
+
+ "code.gitea.io/gitea/models/db"
+ packages_model "code.gitea.io/gitea/models/packages"
+ "code.gitea.io/gitea/models/unittest"
+ user_model "code.gitea.io/gitea/models/user"
+
+ _ "code.gitea.io/gitea/models"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestMain(m *testing.M) {
+ unittest.MainTest(m, &unittest.TestOptions{
+ GiteaRootPath: filepath.Join("..", ".."),
+ })
+}
+
+func TestHasOwnerPackages(t *testing.T) {
+ assert.NoError(t, unittest.PrepareTestDatabase())
+
+ owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
+
+ p, err := packages_model.TryInsertPackage(db.DefaultContext, &packages_model.Package{
+ OwnerID: owner.ID,
+ LowerName: "package",
+ })
+ assert.NotNil(t, p)
+ assert.NoError(t, err)
+
+ // A package without package versions gets automatically cleaned up and should return false
+ has, err := packages_model.HasOwnerPackages(db.DefaultContext, owner.ID)
+ assert.False(t, has)
+ assert.NoError(t, err)
+
+ pv, err := packages_model.GetOrInsertVersion(db.DefaultContext, &packages_model.PackageVersion{
+ PackageID: p.ID,
+ LowerVersion: "internal",
+ IsInternal: true,
+ })
+ assert.NotNil(t, pv)
+ assert.NoError(t, err)
+
+ // A package with an internal package version gets automaticaly cleaned up and should return false
+ has, err = packages_model.HasOwnerPackages(db.DefaultContext, owner.ID)
+ assert.False(t, has)
+ assert.NoError(t, err)
+
+ pv, err = packages_model.GetOrInsertVersion(db.DefaultContext, &packages_model.PackageVersion{
+ PackageID: p.ID,
+ LowerVersion: "normal",
+ IsInternal: false,
+ })
+ assert.NotNil(t, pv)
+ assert.NoError(t, err)
+
+ // A package with a normal package version should return true
+ has, err = packages_model.HasOwnerPackages(db.DefaultContext, owner.ID)
+ assert.True(t, has)
+ assert.NoError(t, err)
+}