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
This commit is contained in:
		
					parent
					
						
							
								1670109b91
							
						
					
				
			
			
				commit
				
					
						5bc73ca666
					
				
			
		
					 2 changed files with 78 additions and 2 deletions
				
			
		| 
						 | 
					@ -224,9 +224,16 @@ func FindUnreferencedPackages(ctx context.Context) ([]*Package, error) {
 | 
				
			||||||
		Find(&ps)
 | 
							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) {
 | 
					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
 | 
					// HasRepositoryPackages tests if a repository has packages
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										69
									
								
								models/packages/package_test.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								models/packages/package_test.go
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -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)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue