fix: don't open a duplicate PR when the reviewer request fails (#53)

This commit is contained in:
systemBlue 2026-06-04 13:00:44 +02:00 committed by secana
parent 4f6803cc03
commit e9b6be91f5

View file

@ -20,6 +20,7 @@ struct PullRequestCreateView: View {
@State private var selectedMilestoneID: Int? @State private var selectedMilestoneID: Int?
@State private var selectedAssigneeLogins: Set<String> = [] @State private var selectedAssigneeLogins: Set<String> = []
@State private var selectedReviewerLogins: Set<String> = [] @State private var selectedReviewerLogins: Set<String> = []
@State private var createdPRNumber: Int?
@Environment(\.dismiss) private var dismiss @Environment(\.dismiss) private var dismiss
private let prService: PullRequestService? private let prService: PullRequestService?
@ -175,24 +176,33 @@ struct PullRequestCreateView: View {
guard let prService else { return } guard let prService else { return }
isSubmitting = true isSubmitting = true
do { do {
let trimmedBody = bodyText.trimmingCharacters(in: .whitespacesAndNewlines) // Reuse the already-created PR on retry so a failed reviewer request
let createdPR = try await prService.createPullRequest( // doesn't open a duplicate PR when the user taps Create again.
owner: owner, let prNumber: Int
repo: repo, if let existingNumber = createdPRNumber {
title: title.trimmingCharacters(in: .whitespacesAndNewlines), prNumber = existingNumber
head: headBranch, } else {
base: baseBranch, let trimmedBody = bodyText.trimmingCharacters(in: .whitespacesAndNewlines)
body: trimmedBody.isEmpty ? nil : trimmedBody, let createdPR = try await prService.createPullRequest(
labels: selectedLabelIDs.isEmpty ? nil : Array(selectedLabelIDs), owner: owner,
milestone: selectedMilestoneID, repo: repo,
assignees: selectedAssigneeLogins.isEmpty ? nil : Array(selectedAssigneeLogins), title: title.trimmingCharacters(in: .whitespacesAndNewlines),
) head: headBranch,
base: baseBranch,
body: trimmedBody.isEmpty ? nil : trimmedBody,
labels: selectedLabelIDs.isEmpty ? nil : Array(selectedLabelIDs),
milestone: selectedMilestoneID,
assignees: selectedAssigneeLogins.isEmpty ? nil : Array(selectedAssigneeLogins),
)
createdPRNumber = createdPR.number
prNumber = createdPR.number
}
if !selectedReviewerLogins.isEmpty { if !selectedReviewerLogins.isEmpty {
do { do {
try await prService.requestReviewers( try await prService.requestReviewers(
owner: owner, owner: owner,
repo: repo, repo: repo,
index: createdPR.number, index: prNumber,
reviewers: Array(selectedReviewerLogins), reviewers: Array(selectedReviewerLogins),
) )
} catch { } catch {