@@ -46,14 +46,35 @@ export async function syncRepos(options: {
4646 } ;
4747 }
4848
49- log ?.( `Starting sync: ${ reposToSync . length } repos, version=${ effectiveVersion } , force=${ force } ` , "info" ) ;
49+ // Generate synthetic repo configs from sparsePathOverrides
50+ const syntheticRepos : RepoConfig [ ] = [ ] ;
51+ for ( const repo of reposToSync ) {
52+ if ( repo . sparsePathOverrides ) {
53+ for ( const override of repo . sparsePathOverrides ) {
54+ syntheticRepos . push ( {
55+ name : `${ repo . name } -docs` ,
56+ url : repo . url ,
57+ branch : override . branch ,
58+ sparse : override . paths ,
59+ description : `${ repo . description } (docs from ${ override . branch } )` ,
60+ } ) ;
61+ }
62+ }
63+ }
64+
65+ // Include synthetic repos in total count
66+ const totalRepos = reposToSync . length + syntheticRepos . length ;
67+ log ?.( `Starting sync: ${ totalRepos } repos, version=${ effectiveVersion } , force=${ force } ` , "info" ) ;
5068
5169 const results : SyncResult [ "repos" ] = [ ] ;
52- let syncIndex = 0 ;
5370
54- async function syncRepo ( config : RepoConfig , statusTransform ?: ( s : string ) => string ) : Promise < void > {
55- syncIndex ++ ;
56- log ?.( `Syncing ${ syncIndex } /${ reposToSync . length } : ${ config . name } ` , "info" ) ;
71+ async function syncRepo (
72+ config : RepoConfig ,
73+ index : number ,
74+ total : number ,
75+ statusTransform ?: ( s : string ) => string ,
76+ ) : Promise < void > {
77+ log ?.( `Syncing ${ index } /${ total } : ${ config . name } ` , "info" ) ;
5778 try {
5879 const status = log ? await cloneRepo ( config , force , log ) : await cloneRepo ( config , force ) ;
5980 results . push ( { name : config . name , status : statusTransform ? statusTransform ( status ) : status } ) ;
@@ -66,16 +87,11 @@ export async function syncRepos(options: {
6687 }
6788 }
6889
69- // Sort repos so aztec-packages is cloned first (needed to determine Noir version)
90+ // Clone aztec-packages first (blocking - needed to determine Noir version)
7091 const aztecPackages = reposToSync . find ( ( r ) => r . name === "aztec-packages" ) ;
71- const noirRepos = reposToSync . filter ( ( r ) => r . url . includes ( "noir-lang" ) ) ;
72- const otherRepos = reposToSync . filter (
73- ( r ) => r . name !== "aztec-packages" && ! r . url . includes ( "noir-lang" )
74- ) ;
75-
76- // Clone aztec-packages first if present
92+ let nextIndex = 1 ;
7793 if ( aztecPackages ) {
78- await syncRepo ( aztecPackages ) ;
94+ await syncRepo ( aztecPackages , nextIndex ++ , totalRepos ) ;
7995 }
8096
8197 // Get the Noir commit from aztec-packages (if available)
@@ -84,24 +100,39 @@ export async function syncRepos(options: {
84100 log ?.( `Resolved Noir commit from aztec-packages: ${ noirCommit . substring ( 0 , 7 ) } ` , "info" ) ;
85101 }
86102
87- // Clone Noir repos with the commit from aztec-packages
103+ // Build list of all remaining repos to clone in parallel
104+ const parallelBatch : { config : RepoConfig ; index : number ; statusTransform ?: ( s : string ) => string } [ ] = [ ] ;
105+
106+ const noirRepos = reposToSync . filter ( ( r ) => r . url . includes ( "noir-lang" ) ) ;
107+ const otherRepos = reposToSync . filter (
108+ ( r ) => r . name !== "aztec-packages" && ! r . url . includes ( "noir-lang" )
109+ ) ;
110+
88111 for ( const config of noirRepos ) {
89112 const useAztecCommit = config . name === "noir" && noirCommit ;
90113 const noirConfig : RepoConfig = useAztecCommit
91114 ? { ...config , commit : noirCommit , branch : undefined }
92115 : config ;
93-
94- await syncRepo (
95- noirConfig ,
96- useAztecCommit ? ( s ) => s . replace ( "(commit" , "(commit from aztec-packages" ) : undefined
97- ) ;
116+ parallelBatch . push ( {
117+ config : noirConfig ,
118+ index : nextIndex ++ ,
119+ statusTransform : useAztecCommit ? ( s ) => s . replace ( "(commit" , "(commit from aztec-packages" ) : undefined ,
120+ } ) ;
98121 }
99122
100- // Clone other repos
101123 for ( const config of otherRepos ) {
102- await syncRepo ( config ) ;
124+ parallelBatch . push ( { config, index : nextIndex ++ } ) ;
103125 }
104126
127+ for ( const config of syntheticRepos ) {
128+ parallelBatch . push ( { config, index : nextIndex ++ } ) ;
129+ }
130+
131+ // Clone all remaining repos in parallel
132+ await Promise . all (
133+ parallelBatch . map ( ( item ) => syncRepo ( item . config , item . index , totalRepos , item . statusTransform ) )
134+ ) ;
135+
105136 const allSuccess = results . every (
106137 ( r ) => ! r . status . toLowerCase ( ) . includes ( "error" )
107138 ) ;
0 commit comments