diff --git a/models/issues/pull.go b/models/issues/pull.go index 4c25b6f0c84..6d737076e5f 100644 --- a/models/issues/pull.go +++ b/models/issues/pull.go @@ -15,7 +15,6 @@ import ( "code.gitea.io/gitea/models/db" git_model "code.gitea.io/gitea/models/git" org_model "code.gitea.io/gitea/models/organization" - pull_model "code.gitea.io/gitea/models/pull" repo_model "code.gitea.io/gitea/models/repo" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/git" @@ -156,26 +155,6 @@ func init() { db.RegisterModel(new(PullRequest)) } -// DeletePullsByBaseRepoID deletes all pull requests by the base repository ID -func DeletePullsByBaseRepoID(ctx context.Context, repoID int64) error { - deleteCond := builder.Select("id").From("pull_request").Where(builder.Eq{"pull_request.base_repo_id": repoID}) - - // Delete scheduled auto merges - if _, err := db.GetEngine(ctx).In("pull_id", deleteCond). - Delete(&pull_model.AutoMerge{}); err != nil { - return err - } - - // Delete review states - if _, err := db.GetEngine(ctx).In("pull_id", deleteCond). - Delete(&pull_model.ReviewState{}); err != nil { - return err - } - - _, err := db.DeleteByBean(ctx, &PullRequest{BaseRepoID: repoID}) - return err -} - func (pr *PullRequest) String() string { if pr == nil { return "" diff --git a/services/issue/issue.go b/services/issue/issue.go index e40f6453ad6..70a395eb12c 100644 --- a/services/issue/issue.go +++ b/services/issue/issue.go @@ -12,6 +12,7 @@ import ( issues_model "code.gitea.io/gitea/models/issues" access_model "code.gitea.io/gitea/models/perm/access" project_model "code.gitea.io/gitea/models/project" + pull_model "code.gitea.io/gitea/models/pull" repo_model "code.gitea.io/gitea/models/repo" system_model "code.gitea.io/gitea/models/system" user_model "code.gitea.io/gitea/models/user" @@ -267,10 +268,6 @@ func deleteIssue(ctx context.Context, issue *issues_model.Issue) ([]string, erro } defer committer.Close() - if _, err := db.GetEngine(ctx).ID(issue.ID).NoAutoCondition().Delete(issue); err != nil { - return nil, err - } - // update the total issue numbers if err := repo_model.UpdateRepoIssueNumbers(ctx, issue.RepoID, issue.IsPull, false); err != nil { return nil, err @@ -302,6 +299,13 @@ func deleteIssue(ctx context.Context, issue *issues_model.Issue) ([]string, erro } // deference all review comments + if err := issue.LoadRepo(ctx); err != nil { + return nil, err + } + if err := issue.LoadPullRequest(ctx); err != nil { + return nil, err + } + if err := issue.LoadComments(ctx); err != nil { return nil, err } @@ -335,17 +339,8 @@ func deleteIssue(ctx context.Context, issue *issues_model.Issue) ([]string, erro } if comment.ReviewID > 0 { - if err := comment.LoadIssue(ctx); err != nil { - return nil, err - } - if err := comment.Issue.LoadRepo(ctx); err != nil { - return nil, err - } - if err := comment.Issue.LoadPullRequest(ctx); err != nil { - return nil, err - } - if err := git.RemoveRef(ctx, comment.Issue.Repo.RepoPath(), issues_model.GetCodeCommentRef(comment.Issue.PullRequest.Index, comment.ID)); err != nil { - log.Error("Unable to remove ref in base repository for PR[%d] Error: %v", comment.Issue.PullRequest.ID, err) + if err := git.RemoveRef(ctx, issue.Repo.RepoPath(), issues_model.GetCodeCommentRef(issue.PullRequest.Index, comment.ID)); err != nil { + log.Error("Unable to remove ref in base repository for PR[%d] Error: %v", issue.PullRequest.ID, err) // We should not return error here, because the comment has been removed from database. // users have to delete this ref manually or we should have a synchronize between // database comment table and git refs. @@ -364,6 +359,29 @@ func deleteIssue(ctx context.Context, issue *issues_model.Issue) ([]string, erro } } + // delete all pull request records + if issue.IsPull { + // Delete scheduled auto merges + if _, err := db.GetEngine(ctx).Where("pull_id=?", issue.PullRequest.ID). + Delete(&pull_model.AutoMerge{}); err != nil { + return nil, err + } + + // Delete review states + if _, err := db.GetEngine(ctx).Where("pull_id=?", issue.PullRequest.ID). + Delete(&pull_model.ReviewState{}); err != nil { + return nil, err + } + + if _, err := db.GetEngine(ctx).ID(issue.PullRequest.ID).Delete(&issues_model.PullRequest{}); err != nil { + return nil, err + } + } + + if _, err := db.GetEngine(ctx).ID(issue.ID).NoAutoCondition().Delete(issue); err != nil { + return nil, err + } + if err := committer.Commit(); err != nil { return nil, err } diff --git a/services/repository/delete.go b/services/repository/delete.go index c48d6e1d56e..a42c77c331f 100644 --- a/services/repository/delete.go +++ b/services/repository/delete.go @@ -97,10 +97,6 @@ func DeleteRepositoryDirectly(ctx context.Context, repoID int64, ignoreOrgTeams } needRewriteKeysFile := deleted > 0 - if err := deleteDBRepository(ctx, repoID); err != nil { - return err - } - if org != nil && org.IsOrganization() { teams, err := organization.FindOrgTeams(ctx, org.ID) if err != nil { @@ -187,11 +183,6 @@ func DeleteRepositoryDirectly(ctx context.Context, repoID int64, ignoreOrgTeams return err } - // Delete Pulls and related objects - if err := issues_model.DeletePullsByBaseRepoID(ctx, repoID); err != nil { - return err - } - // Delete Issues and related objects var attachmentPaths []string if attachmentPaths, err = issue_service.DeleteIssuesByRepoID(ctx, repoID); err != nil { @@ -291,6 +282,11 @@ func DeleteRepositoryDirectly(ctx context.Context, repoID int64, ignoreOrgTeams return err } + // delete all related database records first before deleting the repository record + if err := deleteDBRepository(ctx, repoID); err != nil { + return err + } + if err = committer.Commit(); err != nil { return err }