mirror of
https://codeberg.org/secana/Forji.git
synced 2026-06-16 05:13:55 -07:00
fix: don't open a duplicate PR when the reviewer request fails
createPullRequest created the PR and then requested reviewers in the same submit. If the reviewer request threw, the sheet stayed open with no record that the PR already existed, so tapping Create again ran the whole flow and opened a second PR. Track the created PR number and skip re-creation on retry, only re-requesting reviewers. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
b0f50eca38
commit
7c50d6371d
1 changed files with 23 additions and 13 deletions
|
|
@ -20,6 +20,7 @@ struct PullRequestCreateView: View {
|
|||
@State private var selectedMilestoneID: Int?
|
||||
@State private var selectedAssigneeLogins: Set<String> = []
|
||||
@State private var selectedReviewerLogins: Set<String> = []
|
||||
@State private var createdPRNumber: Int?
|
||||
@Environment(\.dismiss) private var dismiss
|
||||
|
||||
private let prService: PullRequestService?
|
||||
|
|
@ -175,24 +176,33 @@ struct PullRequestCreateView: View {
|
|||
guard let prService else { return }
|
||||
isSubmitting = true
|
||||
do {
|
||||
let trimmedBody = bodyText.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||
let createdPR = try await prService.createPullRequest(
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
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),
|
||||
)
|
||||
// Reuse the already-created PR on retry so a failed reviewer request
|
||||
// doesn't open a duplicate PR when the user taps Create again.
|
||||
let prNumber: Int
|
||||
if let existingNumber = createdPRNumber {
|
||||
prNumber = existingNumber
|
||||
} else {
|
||||
let trimmedBody = bodyText.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||
let createdPR = try await prService.createPullRequest(
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
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 {
|
||||
do {
|
||||
try await prService.requestReviewers(
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
index: createdPR.number,
|
||||
index: prNumber,
|
||||
reviewers: Array(selectedReviewerLogins),
|
||||
)
|
||||
} catch {
|
||||
|
|
|
|||
Loading…
Reference in a new issue