Commit f657115
fix: propagate AmbiguousBranchError as a typed Effect error (#306)
* fix: propagate AmbiguousBranchError as a typed Effect error
Calling resolveBranchReference() directly inside Effect.gen caused
AmbiguousBranchError to escape as an unhandled Die (FiberFailure) instead
of a typed Effect error, crashing the TUI when a branch existed in
multiple remotes (e.g. origin and a fork).
- Add _tag discriminant to AmbiguousBranchError for pattern matching
- Add resolveBranchReferenceEffect() wrapping the sync helper in Effect.try
- Replace bare sync calls in createWorktreeEffect with yield* calls
- Update IWorktreeService and createWorktreeEffect signature to include
AmbiguousBranchError in the error union
- Handle AmbiguousBranchError via _tag check in App.tsx before falling
through to formatPreCreationHookError; remove string-parsing fallback
- Replace inline dynamic imports in IWorktreeService with top-level imports
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* test: add tests for resolveBranchReferenceEffect and AmbiguousBranchError propagation
- resolveBranchReferenceEffect: succeeds with remote ref when single remote has the branch
- resolveBranchReferenceEffect: fails with AmbiguousBranchError as Left (not Die) when multiple remotes have the branch
- createWorktreeEffect: returns Left with AmbiguousBranchError when branch exists in multiple remotes
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: skip branch re-resolution when baseBranch is already a remote ref
After the user selects a remote from the disambiguation UI,
handleRemoteBranchSelected passes the selected ref (e.g.
"origin/feature/feed-mention") as baseBranch. The previous code still
called resolveBranchReferenceEffect(branch) first, which triggered
AmbiguousBranchError again before baseBranch was ever consulted —
making it impossible to successfully create the worktree.
When baseBranch ends with "/{branch}", it is already the resolved
remote-tracking ref the user chose. Use it directly as startPoint and
skip re-resolution to break the loop.
Also tighten the catch handler in resolveBranchReferenceEffect to
re-throw unexpected non-AmbiguousBranchError errors as defects instead
of silently mislabeling them.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>1 parent c8c0a71 commit f657115
4 files changed
Lines changed: 231 additions & 73 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
32 | | - | |
33 | 32 | | |
34 | 33 | | |
35 | 34 | | |
| |||
380 | 379 | | |
381 | 380 | | |
382 | 381 | | |
383 | | - | |
384 | | - | |
385 | | - | |
386 | | - | |
387 | | - | |
388 | | - | |
389 | | - | |
390 | | - | |
391 | | - | |
392 | | - | |
393 | | - | |
394 | | - | |
395 | | - | |
396 | | - | |
397 | | - | |
398 | | - | |
399 | | - | |
400 | | - | |
401 | | - | |
402 | | - | |
403 | | - | |
404 | | - | |
405 | | - | |
406 | | - | |
407 | | - | |
408 | | - | |
409 | | - | |
410 | | - | |
411 | | - | |
412 | | - | |
413 | | - | |
414 | 382 | | |
415 | 383 | | |
416 | 384 | | |
| |||
451 | 419 | | |
452 | 420 | | |
453 | 421 | | |
454 | | - | |
455 | | - | |
456 | | - | |
457 | | - | |
458 | | - | |
459 | | - | |
460 | | - | |
461 | | - | |
462 | | - | |
463 | | - | |
464 | | - | |
465 | | - | |
466 | | - | |
467 | | - | |
468 | | - | |
| 422 | + | |
| 423 | + | |
469 | 424 | | |
470 | 425 | | |
471 | 426 | | |
| |||
643 | 598 | | |
644 | 599 | | |
645 | 600 | | |
646 | | - | |
647 | 601 | | |
648 | | - | |
| 602 | + | |
| 603 | + | |
| 604 | + | |
| 605 | + | |
| 606 | + | |
| 607 | + | |
| 608 | + | |
| 609 | + | |
| 610 | + | |
| 611 | + | |
| 612 | + | |
| 613 | + | |
| 614 | + | |
| 615 | + | |
| 616 | + | |
| 617 | + | |
| 618 | + | |
| 619 | + | |
| 620 | + | |
649 | 621 | | |
650 | 622 | | |
651 | 623 | | |
| |||
733 | 705 | | |
734 | 706 | | |
735 | 707 | | |
736 | | - | |
| 708 | + | |
| 709 | + | |
| 710 | + | |
| 711 | + | |
| 712 | + | |
| 713 | + | |
737 | 714 | | |
738 | 715 | | |
739 | 716 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| 8 | + | |
8 | 9 | | |
9 | 10 | | |
10 | 11 | | |
| |||
477 | 478 | | |
478 | 479 | | |
479 | 480 | | |
| 481 | + | |
| 482 | + | |
| 483 | + | |
| 484 | + | |
| 485 | + | |
| 486 | + | |
| 487 | + | |
| 488 | + | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
| 492 | + | |
| 493 | + | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + | |
| 504 | + | |
| 505 | + | |
| 506 | + | |
| 507 | + | |
| 508 | + | |
| 509 | + | |
| 510 | + | |
| 511 | + | |
| 512 | + | |
| 513 | + | |
| 514 | + | |
| 515 | + | |
| 516 | + | |
| 517 | + | |
| 518 | + | |
| 519 | + | |
| 520 | + | |
| 521 | + | |
| 522 | + | |
| 523 | + | |
| 524 | + | |
| 525 | + | |
| 526 | + | |
| 527 | + | |
| 528 | + | |
| 529 | + | |
| 530 | + | |
| 531 | + | |
| 532 | + | |
| 533 | + | |
| 534 | + | |
| 535 | + | |
| 536 | + | |
| 537 | + | |
| 538 | + | |
| 539 | + | |
| 540 | + | |
| 541 | + | |
| 542 | + | |
| 543 | + | |
| 544 | + | |
| 545 | + | |
| 546 | + | |
| 547 | + | |
| 548 | + | |
| 549 | + | |
| 550 | + | |
| 551 | + | |
| 552 | + | |
| 553 | + | |
| 554 | + | |
| 555 | + | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
| 564 | + | |
| 565 | + | |
| 566 | + | |
| 567 | + | |
480 | 568 | | |
481 | 569 | | |
482 | 570 | | |
| |||
876 | 964 | | |
877 | 965 | | |
878 | 966 | | |
| 967 | + | |
| 968 | + | |
| 969 | + | |
| 970 | + | |
| 971 | + | |
| 972 | + | |
| 973 | + | |
| 974 | + | |
| 975 | + | |
| 976 | + | |
| 977 | + | |
| 978 | + | |
| 979 | + | |
| 980 | + | |
| 981 | + | |
| 982 | + | |
| 983 | + | |
| 984 | + | |
| 985 | + | |
| 986 | + | |
| 987 | + | |
| 988 | + | |
| 989 | + | |
| 990 | + | |
| 991 | + | |
| 992 | + | |
| 993 | + | |
| 994 | + | |
| 995 | + | |
| 996 | + | |
| 997 | + | |
| 998 | + | |
| 999 | + | |
| 1000 | + | |
| 1001 | + | |
| 1002 | + | |
| 1003 | + | |
| 1004 | + | |
| 1005 | + | |
| 1006 | + | |
| 1007 | + | |
| 1008 | + | |
| 1009 | + | |
| 1010 | + | |
| 1011 | + | |
| 1012 | + | |
| 1013 | + | |
| 1014 | + | |
| 1015 | + | |
| 1016 | + | |
| 1017 | + | |
| 1018 | + | |
| 1019 | + | |
| 1020 | + | |
| 1021 | + | |
| 1022 | + | |
| 1023 | + | |
| 1024 | + | |
| 1025 | + | |
| 1026 | + | |
| 1027 | + | |
| 1028 | + | |
| 1029 | + | |
| 1030 | + | |
| 1031 | + | |
| 1032 | + | |
| 1033 | + | |
| 1034 | + | |
| 1035 | + | |
| 1036 | + | |
| 1037 | + | |
| 1038 | + | |
| 1039 | + | |
| 1040 | + | |
| 1041 | + | |
| 1042 | + | |
| 1043 | + | |
| 1044 | + | |
| 1045 | + | |
| 1046 | + | |
| 1047 | + | |
| 1048 | + | |
| 1049 | + | |
| 1050 | + | |
| 1051 | + | |
| 1052 | + | |
879 | 1053 | | |
880 | 1054 | | |
881 | 1055 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
185 | 185 | | |
186 | 186 | | |
187 | 187 | | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
188 | 202 | | |
189 | 203 | | |
190 | 204 | | |
| |||
895 | 909 | | |
896 | 910 | | |
897 | 911 | | |
898 | | - | |
| 912 | + | |
899 | 913 | | |
900 | 914 | | |
901 | 915 | | |
| |||
980 | 994 | | |
981 | 995 | | |
982 | 996 | | |
| 997 | + | |
| 998 | + | |
| 999 | + | |
| 1000 | + | |
| 1001 | + | |
983 | 1002 | | |
984 | | - | |
| 1003 | + | |
985 | 1004 | | |
986 | 1005 | | |
987 | 1006 | | |
988 | | - | |
| 1007 | + | |
989 | 1008 | | |
990 | 1009 | | |
991 | 1010 | | |
| |||
0 commit comments