Skip to content

Commit 58761b6

Browse files
skarimCopilot
andcommitted
Optimize view/modify TUI load time with parallel fetching
- Deduplicate API calls: syncStackPRs now returns PRDetails for LoadBranchNodes to reuse, eliminating redundant FindPRDetailsForBranch calls - Parallelize API calls in syncStackPRs (capped at 6 concurrent requests) - Parallelize git operations in LoadBranchNodes (capped at 4 concurrent) - Show "Loading stack..." indicator for interactive sessions Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 1ae4c46 commit 58761b6

12 files changed

Lines changed: 344 additions & 139 deletions

File tree

cmd/init.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ func runInit(cfg *config.Config, opts *initOptions) error {
320320
}
321321
}
322322
} else {
323-
syncStackPRs(cfg, latestStack)
323+
_ = syncStackPRs(cfg, latestStack)
324324
}
325325

326326
if err := stack.Save(gitDir, sf); err != nil {

cmd/merge.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func runMerge(cfg *config.Config, target string) error {
4141
currentBranch := result.CurrentBranch
4242

4343
// Sync PR state from GitHub so merge status is up to date.
44-
syncStackPRs(cfg, s)
44+
_ = syncStackPRs(cfg, s)
4545

4646
// Persist the refreshed PR state.
4747
stack.SaveNonBlocking(result.GitDir, result.StackFile)

cmd/modify.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ func runModify(cfg *config.Config) error {
6464
currentBranch := result.CurrentBranch
6565

6666
// Load branch data for the TUI
67-
viewNodes := stackview.LoadBranchNodes(cfg, s, currentBranch)
67+
viewNodes := stackview.LoadBranchNodes(cfg, s, currentBranch, result.PRDetails)
6868

6969
// Reverse so index 0 = top of stack (matching visual order)
7070
reversed := make([]stackview.BranchNode, len(viewNodes))
@@ -283,8 +283,15 @@ func checkModifyPreconditions(cfg *config.Config) (*loadStackResult, error) {
283283
return nil, ErrSilent
284284
}
285285

286+
// Show loading indicator while syncing PRs
287+
fmt.Fprintf(cfg.Err, "Loading stack...")
288+
286289
// Sync PR state and check merge queue
287-
syncStackPRs(cfg, s)
290+
prDetails := syncStackPRs(cfg, s)
291+
result.PRDetails = prDetails
292+
293+
fmt.Fprintf(cfg.Err, "\r\033[2K")
294+
288295
if err := modify.CheckNoMergeQueuePRs(cfg, s); err != nil {
289296
return nil, ErrSilent
290297
}

cmd/push.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func runPush(cfg *config.Config, opts *pushOptions) error {
7878
return ErrSilent
7979
}
8080
// Sync PR state to detect merged/queued PRs before pushing.
81-
syncStackPRs(cfg, s)
81+
_ = syncStackPRs(cfg, s)
8282

8383
merged := s.MergedBranches()
8484
if len(merged) > 0 {

cmd/rebase.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ func runRebase(cfg *config.Config, opts *rebaseOptions) error {
176176
branchesToRebase[0].Branch, branchesToRebase[len(branchesToRebase)-1].Branch)
177177

178178
// Sync PR state before rebase so we can detect merged PRs.
179-
syncStackPRs(cfg, s)
179+
_ = syncStackPRs(cfg, s)
180180

181181
branchNames := make([]string, 0, len(s.Branches))
182182
for _, b := range s.Branches {
@@ -349,7 +349,7 @@ func runRebase(cfg *config.Config, opts *rebaseOptions) error {
349349

350350
updateBaseSHAs(s)
351351

352-
syncStackPRs(cfg, s)
352+
_ = syncStackPRs(cfg, s)
353353

354354
stack.SaveNonBlocking(gitDir, sf)
355355

@@ -540,7 +540,7 @@ func continueRebase(cfg *config.Config, gitDir string) error {
540540

541541
updateBaseSHAs(s)
542542

543-
syncStackPRs(cfg, s)
543+
_ = syncStackPRs(cfg, s)
544544

545545
stack.SaveNonBlocking(gitDir, sf)
546546

cmd/submit.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ func runSubmit(cfg *config.Config, opts *submitOptions) error {
108108
}
109109

110110
// Sync PR state to detect merged/queued PRs before pushing.
111-
syncStackPRs(cfg, s)
111+
_ = syncStackPRs(cfg, s)
112112

113113
// Resolve remote for pushing
114114
remote, err := pickRemote(cfg, currentBranch, opts.remote)
@@ -189,7 +189,7 @@ func runSubmit(cfg *config.Config, opts *submitOptions) error {
189189

190190
// Update base commit hashes and sync PR state
191191
updateBaseSHAs(s)
192-
syncStackPRs(cfg, s)
192+
_ = syncStackPRs(cfg, s)
193193

194194
if err := stack.Save(gitDir, sf); err != nil {
195195
return handleSaveError(cfg, err)

cmd/sync.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ func runSync(cfg *config.Config, opts *syncOptions) error {
134134
cfg.Printf("Rebasing stack ...")
135135

136136
// Sync PR state to detect merged PRs before rebasing.
137-
syncStackPRs(cfg, s)
137+
_ = syncStackPRs(cfg, s)
138138

139139
// Save original refs so we can restore on conflict.
140140
// Merged branches that no longer exist locally have no ref to
@@ -311,7 +311,7 @@ func runSync(cfg *config.Config, opts *syncOptions) error {
311311
// --- Step 5: Sync PR state ---
312312
cfg.Printf("")
313313
cfg.Printf("Syncing PRs ...")
314-
syncStackPRs(cfg, s)
314+
_ = syncStackPRs(cfg, s)
315315

316316
// Report PR status for each branch
317317
for _, b := range s.Branches {

0 commit comments

Comments
 (0)