()
| 233 | }; |
| 234 | |
| 235 | const startCreatingPRs = async () => { |
| 236 | if (!selectedRepo) return; |
| 237 | const vError = validatePRConfig(prTemplates); if (vError) { setError(vError); return; } |
| 238 | setStep(3); setIsCreating(true); |
| 239 | const items: CreatedItem[] = prTemplates.map(p => ({ id: p.id, title: p.title, type: 'prs', status: 'pending', branchName: p.branchName })); |
| 240 | setCreatedItems(items); |
| 241 | const owner = selectedRepo.owner.login; const repo = selectedRepo.name; const base = selectedRepo.default_branch; |
| 242 | try { |
| 243 | let baseSHA = await getDefaultBranchSHA(token, owner, repo, base); |
| 244 | for (let i = 0; i < prTemplates.length; i++) { |
| 245 | if (cancelRef.current) break; |
| 246 | const pr = prTemplates[i]; |
| 247 | try { |
| 248 | setCreatedItems(prev => prev.map((ci, idx) => idx === i ? { ...ci, status: 'creating', substatus: 'Creating branch...' } : ci)); |
| 249 | await createBranch(token, owner, repo, pr.branchName, baseSHA); |
| 250 | await createFileOnBranch(token, owner, repo, pr.branchName, pr.filePath, pr.fileContent, `Add ${pr.filePath}`); |
| 251 | const result = await createPullRequest(token, owner, repo, pr.title, pr.body, pr.branchName, base); |
| 252 | if (autoMerge) { |
| 253 | setCreatedItems(prev => prev.map((ci, idx) => idx === i ? { ...ci, status: 'merging', substatus: 'Merging...', url: result.html_url, number: result.number } : ci)); |
| 254 | await waitForMergeable(token, owner, repo, result.number, 15, 1000); |
| 255 | await mergePullRequest(token, owner, repo, result.number, mergeMethod, 3); |
| 256 | if (deleteBranchAfterMerge) try { await deleteBranch(token, owner, repo, pr.branchName); } catch {} |
| 257 | setCreatedItems(prev => prev.map((ci, idx) => idx === i ? { ...ci, status: 'merged', merged: true, substatus: undefined, url: result.html_url, number: result.number } : ci)); |
| 258 | try { await delay(500); baseSHA = await getDefaultBranchSHAWithRetry(token, owner, repo, base, baseSHA, 3, 1000); } catch {} |
| 259 | } else { |
| 260 | setCreatedItems(prev => prev.map((ci, idx) => idx === i ? { ...ci, status: 'success', url: result.html_url, number: result.number, substatus: undefined } : ci)); |
| 261 | } |
| 262 | } catch (e: any) { |
| 263 | setCreatedItems(prev => prev.map((ci, idx) => idx === i ? { ...ci, status: 'error', error: e.message } : ci)); |
| 264 | } |
| 265 | await delay(delayMs); |
| 266 | } |
| 267 | } catch (err: any) { setError(err.message); } |
| 268 | setIsCreating(false); setStep(4); |
| 269 | }; |
| 270 | |
| 271 | const startCreatingPairs = async () => { |
| 272 | if (!selectedRepo) return; |
no test coverage detected