1
0
mirror of https://github.com/go-gitea/gitea.git synced 2025-04-18 00:47:48 -04:00

Merge b24177377c426f95d65ed6597851410fb3bff4b9 into dd0caf7e163bff3ecd951a045d9cea47efaa7ed5

This commit is contained in:
Lunny Xiao 2025-04-17 09:43:35 -03:00 committed by GitHub
commit c47b966f5f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 39 additions and 34 deletions

View File

@ -14,7 +14,6 @@ import (
access_model "code.gitea.io/gitea/models/perm/access" access_model "code.gitea.io/gitea/models/perm/access"
project_model "code.gitea.io/gitea/models/project" project_model "code.gitea.io/gitea/models/project"
repo_model "code.gitea.io/gitea/models/repo" repo_model "code.gitea.io/gitea/models/repo"
system_model "code.gitea.io/gitea/models/system"
"code.gitea.io/gitea/models/unit" "code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user" user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/git"
@ -816,37 +815,13 @@ func DeleteIssuesByRepoID(ctx context.Context, repoID int64) (attachmentPaths []
return attachmentPaths, err return attachmentPaths, err
} }
// DeleteOrphanedIssues delete issues without a repo func GetOrphanedIssueRepoIDs(ctx context.Context) ([]int64, error) {
func DeleteOrphanedIssues(ctx context.Context) error { var repoIDs []int64
var attachmentPaths []string if err := db.GetEngine(ctx).Table("issue").Distinct("issue.repo_id").
err := db.WithTx(ctx, func(ctx context.Context) error { Join("LEFT", "repository", "issue.repo_id=repository.id").
var ids []int64 Where(builder.IsNull{"repository.id"}).
Find(&repoIDs); err != nil {
if err := db.GetEngine(ctx).Table("issue").Distinct("issue.repo_id"). return nil, err
Join("LEFT", "repository", "issue.repo_id=repository.id").
Where(builder.IsNull{"repository.id"}).GroupBy("issue.repo_id").
Find(&ids); err != nil {
return err
}
for i := range ids {
paths, err := DeleteIssuesByRepoID(ctx, ids[i])
if err != nil {
return err
}
attachmentPaths = append(attachmentPaths, paths...)
}
return nil
})
if err != nil {
return err
} }
return repoIDs, nil
// Remove issue attachment files.
for i := range attachmentPaths {
// FIXME: it's not right, because the attachment might not be on local filesystem
system_model.RemoveAllWithNotice(ctx, "Delete issue attachment", attachmentPaths[i])
}
return nil
} }

View File

@ -15,6 +15,7 @@ import (
secret_model "code.gitea.io/gitea/models/secret" secret_model "code.gitea.io/gitea/models/secret"
"code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
issue_service "code.gitea.io/gitea/services/issue"
) )
type consistencyCheck struct { type consistencyCheck struct {
@ -93,7 +94,7 @@ func prepareDBConsistencyChecks() []consistencyCheck {
// find issues without existing repository // find issues without existing repository
Name: "Orphaned Issues without existing repository", Name: "Orphaned Issues without existing repository",
Counter: issues_model.CountOrphanedIssues, Counter: issues_model.CountOrphanedIssues,
Fixer: asFixer(issues_model.DeleteOrphanedIssues), Fixer: asFixer(issue_service.DeleteOrphanedIssues),
}, },
// find releases without existing repository // find releases without existing repository
genericOrphanCheck("Orphaned Releases without existing repository", genericOrphanCheck("Orphaned Releases without existing repository",

View File

@ -323,3 +323,32 @@ func deleteIssue(ctx context.Context, issue *issues_model.Issue) error {
return committer.Commit() return committer.Commit()
} }
// DeleteOrphanedIssues delete issues without a repo
func DeleteOrphanedIssues(ctx context.Context) error {
var attachmentPaths []string
err := db.WithTx(ctx, func(ctx context.Context) error {
repoIDs, err := issues_model.GetOrphanedIssueRepoIDs(ctx)
if err != nil {
return err
}
for i := range repoIDs {
paths, err := issues_model.DeleteIssuesByRepoID(ctx, repoIDs[i])
if err != nil {
return err
}
attachmentPaths = append(attachmentPaths, paths...)
}
return nil
})
if err != nil {
return err
}
// Remove issue attachment files.
for i := range attachmentPaths {
system_model.RemoveStorageWithNotice(ctx, storage.Attachments, "Delete issue attachment", attachmentPaths[i])
}
return nil
}