@@ -248,6 +248,31 @@ fn resolve_home_branch_sync_target(
248248 } )
249249}
250250
251+ fn origin_fetch_branches_for_jj_sync (
252+ current_branch : & str ,
253+ origin_default_branch : Option < & str > ,
254+ home_branch_sync_target : Option < & HomeBranchSyncTarget > ,
255+ ) -> Vec < String > {
256+ let mut branches = Vec :: new ( ) ;
257+
258+ if home_branch_sync_target. is_none ( ) {
259+ let current_branch = current_branch. trim ( ) ;
260+ if !current_branch. is_empty ( ) {
261+ branches. push ( current_branch. to_string ( ) ) ;
262+ }
263+ }
264+
265+ if let Some ( default_branch) = origin_default_branch
266+ . map ( str:: trim)
267+ . filter ( |branch| !branch. is_empty ( ) )
268+ && !branches. iter ( ) . any ( |branch| branch == default_branch)
269+ {
270+ branches. push ( default_branch. to_string ( ) ) ;
271+ }
272+
273+ branches
274+ }
275+
251276fn select_jj_sync_branch (
252277 git_head_ref : & str ,
253278 current_bookmarks : & [ String ] ,
@@ -2629,46 +2654,23 @@ fn run_jj_sync(
26292654 let mut failures: Vec < String > = Vec :: new ( ) ;
26302655
26312656 if has_origin && origin_reachable {
2632- track_remote_ref ( & mut tracked_refs, repo_root, "origin" , & current_branch) ;
2633- recorder. record (
2634- "jj" ,
2635- format ! ( "jj git fetch --remote origin --branch {}" , current_branch) ,
2636- ) ;
2637- if let Err ( err) = jj_run_in (
2638- repo_root,
2639- & [
2640- "--quiet" ,
2641- "git" ,
2642- "fetch" ,
2643- "--remote" ,
2644- "origin" ,
2645- "--branch" ,
2646- & current_branch,
2647- ] ,
2657+ for branch in origin_fetch_branches_for_jj_sync (
2658+ & current_branch,
2659+ origin_default_branch. as_deref ( ) ,
2660+ home_branch_sync_target. as_ref ( ) ,
26482661 ) {
2649- failures. push ( format ! ( "origin: {}" , err) ) ;
2650- } else {
2651- fetched_any = true ;
2652- }
2653- if let Some ( default_branch) = origin_default_branch. as_deref ( ) {
2654- track_remote_ref ( & mut tracked_refs, repo_root, "origin" , default_branch) ;
2662+ track_remote_ref ( & mut tracked_refs, repo_root, "origin" , & branch) ;
26552663 recorder. record (
26562664 "jj" ,
2657- format ! ( "jj git fetch --remote origin --branch {}" , default_branch ) ,
2665+ format ! ( "jj git fetch --remote origin --branch {}" , branch ) ,
26582666 ) ;
26592667 if let Err ( err) = jj_run_in (
26602668 repo_root,
26612669 & [
2662- "--quiet" ,
2663- "git" ,
2664- "fetch" ,
2665- "--remote" ,
2666- "origin" ,
2667- "--branch" ,
2668- default_branch,
2670+ "--quiet" , "git" , "fetch" , "--remote" , "origin" , "--branch" , & branch,
26692671 ] ,
26702672 ) {
2671- failures. push ( format ! ( "origin default {}: {}" , default_branch , err) ) ;
2673+ failures. push ( format ! ( "origin {}: {}" , branch , err) ) ;
26722674 } else {
26732675 fetched_any = true ;
26742676 }
@@ -5034,6 +5036,31 @@ mod tests {
50345036 assert ! ( !home_branch_mode_active( "nikiv" , None ) ) ;
50355037 }
50365038
5039+ #[ test]
5040+ fn origin_fetch_branches_for_home_branch_mode_skips_local_home_branch ( ) {
5041+ let home_target = HomeBranchSyncTarget {
5042+ home_branch : "nikiv" . to_string ( ) ,
5043+ origin_default_branch : "main" . to_string ( ) ,
5044+ } ;
5045+
5046+ assert_eq ! (
5047+ origin_fetch_branches_for_jj_sync( "nikiv" , Some ( "main" ) , Some ( & home_target) ) ,
5048+ vec![ "main" . to_string( ) ]
5049+ ) ;
5050+ }
5051+
5052+ #[ test]
5053+ fn origin_fetch_branches_for_regular_sync_dedupes_branches ( ) {
5054+ assert_eq ! (
5055+ origin_fetch_branches_for_jj_sync( "feature/demo" , Some ( "main" ) , None ) ,
5056+ vec![ "feature/demo" . to_string( ) , "main" . to_string( ) ]
5057+ ) ;
5058+ assert_eq ! (
5059+ origin_fetch_branches_for_jj_sync( "main" , Some ( "main" ) , None ) ,
5060+ vec![ "main" . to_string( ) ]
5061+ ) ;
5062+ }
5063+
50375064 #[ test]
50385065 fn resolve_home_branch_sync_target_uses_origin_default_for_home_branch ( ) {
50395066 let dir = tempdir ( ) . expect ( "tempdir" ) ;
0 commit comments