mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 00:20:25 +08:00 
			
		
		
		
	* Doctor: find IssueLabels without existing label * Repo Delete: delete labels & issue_labels too
This commit is contained in:
		@@ -606,6 +606,22 @@ func runDoctorCheckDBConsistency(ctx *cli.Context) ([]string, error) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// find IssueLabels without existing label
 | 
				
			||||||
 | 
						count, err = models.CountOrphanedIssueLabels()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if count > 0 {
 | 
				
			||||||
 | 
							if ctx.Bool("fix") {
 | 
				
			||||||
 | 
								if err = models.DeleteOrphanedIssueLabels(); err != nil {
 | 
				
			||||||
 | 
									return nil, err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								results = append(results, fmt.Sprintf("%d issue_labels without existing label deleted", count))
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								results = append(results, fmt.Sprintf("%d issue_labels without existing label", count))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//find issues without existing repository
 | 
						//find issues without existing repository
 | 
				
			||||||
	count, err = models.CountOrphanedIssues()
 | 
						count, err = models.CountOrphanedIssues()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -224,6 +224,24 @@ func DeleteOrphanedLabels() error {
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CountOrphanedIssueLabels return count of IssueLabels witch have no label behind anymore
 | 
				
			||||||
 | 
					func CountOrphanedIssueLabels() (int64, error) {
 | 
				
			||||||
 | 
						return x.Table("issue_label").
 | 
				
			||||||
 | 
							Join("LEFT", "label", "issue_label.label_id = label.id").
 | 
				
			||||||
 | 
							Where(builder.IsNull{"label.id"}).Count()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// DeleteOrphanedIssueLabels delete IssueLabels witch have no label behind anymore
 | 
				
			||||||
 | 
					func DeleteOrphanedIssueLabels() error {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, err := x.In("id", builder.Select("issue_label.id").From("issue_label").
 | 
				
			||||||
 | 
							Join("LEFT", "label", "issue_label.label_id = label.id").
 | 
				
			||||||
 | 
							Where(builder.IsNull{"label.id"})).
 | 
				
			||||||
 | 
							Delete(IssueLabel{})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CountOrphanedIssues count issues without a repo
 | 
					// CountOrphanedIssues count issues without a repo
 | 
				
			||||||
func CountOrphanedIssues() (int64, error) {
 | 
					func CountOrphanedIssues() (int64, error) {
 | 
				
			||||||
	return x.Table("issue").
 | 
						return x.Table("issue").
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -764,3 +764,15 @@ func DeleteIssueLabel(issue *Issue, label *Label, doer *User) (err error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return sess.Commit()
 | 
						return sess.Commit()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func deleteLabelsByRepoID(sess Engine, repoID int64) error {
 | 
				
			||||||
 | 
						deleteCond := builder.Select("id").From("label").Where(builder.Eq{"label.repo_id": repoID})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if _, err := sess.In("label_id", deleteCond).
 | 
				
			||||||
 | 
							Delete(&IssueLabel{}); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, err := sess.Delete(&Label{RepoID: repoID})
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1729,6 +1729,10 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
 | 
				
			|||||||
		return fmt.Errorf("deleteBeans: %v", err)
 | 
							return fmt.Errorf("deleteBeans: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := deleteLabelsByRepoID(sess, repoID); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Delete Issues and related objects
 | 
						// Delete Issues and related objects
 | 
				
			||||||
	var attachmentPaths []string
 | 
						var attachmentPaths []string
 | 
				
			||||||
	if attachmentPaths, err = deleteIssuesByRepoID(sess, repoID); err != nil {
 | 
						if attachmentPaths, err = deleteIssuesByRepoID(sess, repoID); err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user