2021-03-19 13:25:14 +00:00
// Copyright 2021 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 migrations
import (
"xorm.io/xorm"
)
2021-03-24 18:27:22 +00:00
// removeInvalidLabels looks through the database to look for comments and issue_labels
// that refer to labels do not belong to the repository or organization that repository
// that the issue is in
2021-03-19 13:25:14 +00:00
func removeInvalidLabels ( x * xorm . Engine ) error {
type Comment struct {
ID int64 ` xorm:"pk autoincr" `
Type int ` xorm:"INDEX" `
IssueID int64 ` xorm:"INDEX" `
LabelID int64
}
type Issue struct {
ID int64 ` xorm:"pk autoincr" `
RepoID int64 ` xorm:"INDEX UNIQUE(repo_index)" `
Index int64 ` xorm:"UNIQUE(repo_index)" ` // Index in one repository.
}
type Repository struct {
ID int64 ` xorm:"pk autoincr" `
OwnerID int64 ` xorm:"UNIQUE(s) index" `
LowerName string ` xorm:"UNIQUE(s) INDEX NOT NULL" `
}
type Label struct {
ID int64 ` xorm:"pk autoincr" `
RepoID int64 ` xorm:"INDEX" `
OrgID int64 ` xorm:"INDEX" `
}
type IssueLabel struct {
ID int64 ` xorm:"pk autoincr" `
IssueID int64 ` xorm:"UNIQUE(s)" `
LabelID int64 ` xorm:"UNIQUE(s)" `
}
if err := x . Sync2 ( new ( Comment ) , new ( Issue ) , new ( Repository ) , new ( Label ) , new ( IssueLabel ) ) ; err != nil {
return err
}
if _ , err := x . Exec ( ` DELETE FROM issue_label WHERE issue_label . id IN (
SELECT il_too . id FROM (
SELECT il_too_too . id
FROM issue_label AS il_too_too
2021-03-22 18:26:38 +00:00
INNER JOIN label ON il_too_too . label_id = label . id
2021-03-19 13:25:14 +00:00
INNER JOIN issue on issue . id = il_too_too . issue_id
INNER JOIN repository on repository . id = issue . repo_id
WHERE
2021-03-23 23:10:19 +00:00
( label . org_id = 0 AND issue . repo_id != label . repo_id ) OR ( label . repo_id = 0 AND label . org_id != repository . owner_id )
2021-03-19 13:25:14 +00:00
) AS il_too ) ` ) ; err != nil {
return err
}
if _ , err := x . Exec ( ` DELETE FROM comment WHERE comment . id IN (
SELECT il_too . id FROM (
SELECT com . id
FROM comment AS com
INNER JOIN label ON com . label_id = label . id
INNER JOIN issue on issue . id = com . issue_id
INNER JOIN repository on repository . id = issue . repo_id
WHERE
2021-03-23 23:10:19 +00:00
com . type = ? AND ( ( label . org_id = 0 AND issue . repo_id != label . repo_id ) OR ( label . repo_id = 0 AND label . org_id != repository . owner_id ) )
2021-03-19 13:25:14 +00:00
) AS il_too ) ` , 7 ) ; err != nil {
return err
}
return nil
}