22
33// import fs from "fs"; 
44
5+ import  Git  from  "nodegit" ; 
6+ 
57import  {  getWantedCommitsWithBranchBoundariesOurCustomImpl  }  from  "./git-stacked-rebase" ; 
68import  { 
79	branchSequencer ,  // 
@@ -10,6 +12,8 @@ import {
1012	// getBackupPathOfPreviousStackedRebase, 
1113}  from  "./branchSequencer" ; 
1214
15+ import  {  createQuestion  }  from  "./util/createQuestion" ; 
16+ 
1317export  const  forcePush : BranchSequencerBase  =  ( argsBase )  => 
1418	// /** 
1519	//  * TODO TESTS we __really__ need to make sure we test this one lmao 
@@ -36,8 +40,57 @@ export const forcePush: BranchSequencerBase = (argsBase) =>
3640	branchSequencer ( { 
3741		...argsBase , 
3842		// pathToStackedRebaseDirInsideDotGit, 
39- 		actionInsideEachCheckedOutBranch : ( {  execSyncInRepo } )  =>  { 
40- 			execSyncInRepo ( `${ argsBase . gitCmd }   push --force` ) ; 
43+ 		actionInsideEachCheckedOutBranch : async  ( {  execSyncInRepo,  repo } )  =>  { 
44+ 			const  branch : Git . Reference  =  await  repo . getCurrentBranch ( ) ; 
45+ 			const  upstreamBranch : Git . Reference  |  null  =  await  Git . Branch . upstream ( branch ) . catch ( ( )  =>  null ) ; 
46+ 
47+ 			if  ( ! upstreamBranch )  { 
48+ 				const  remotes : string [ ]  =  await  repo . getRemoteNames ( ) ; 
49+ 
50+ 				if  ( remotes . length  ===  0 )  { 
51+ 					throw  new  Error ( "0 remotes found, cannot push a new branch into a remote." ) ; 
52+ 				} 
53+ 
54+ 				let  remote : string ; 
55+ 
56+ 				if  ( remotes . length  ===  1 )  { 
57+ 					remote  =  remotes [ 0 ] ; 
58+ 				}  else  { 
59+ 					const  indices : string [ ]  =  remotes . map ( ( _ ,  i )  =>  i  +  1 ) . map ( ( x )  =>  x . toString ( ) ) ; 
60+ 
61+ 					const  question  =  createQuestion ( ) ; 
62+ 
63+ 					let  answer : string  =  "" ; 
64+ 
65+ 					let  first  =  true ; 
66+ 					while  ( ! remotes . includes ( answer ) )  { 
67+ 						answer  =  ( 
68+ 							await  question ( 
69+ 								( first  ? "\n"  : "" )  + 
70+ 									"multiple remotes detected, please choose one for new branch:"  + 
71+ 									remotes . map ( ( r ,  i )  =>  `\n  ${ i  +  1 }   ${ r }  ` ) . join ( "" )  + 
72+ 									"\n> " 
73+ 							) 
74+ 						) 
75+ 							. trim ( ) 
76+ 							. toLowerCase ( ) ; 
77+ 
78+ 						if  ( indices . includes ( answer ) )  { 
79+ 							answer  =  remotes [ Number ( answer )  -  1 ] ; 
80+ 						} 
81+ 
82+ 						first  =  false ; 
83+ 					} 
84+ 
85+ 					remote  =  answer ; 
86+ 				} 
87+ 
88+ 				const  cmd  =  `push -u ${ remote }   ${ branch . name ( ) }   --force` ; 
89+ 				console . log ( `running ${ cmd }  ` ) ; 
90+ 				execSyncInRepo ( `${ argsBase . gitCmd }   ${ cmd }  ` ) ; 
91+ 			}  else  { 
92+ 				execSyncInRepo ( `${ argsBase . gitCmd }   push --force` ) ; 
93+ 			} 
4194		} , 
4295		delayMsBetweenCheckouts : 0 , 
4396		getBoundariesInclInitial : ( )  => 
0 commit comments