@@ -20,7 +20,8 @@ use std::process::ExitCode;
2020use aws_lc_rs:: digest;
2121use tracing:: { debug, info} ;
2222
23- use super :: { Error , Filter , Manifest } ;
23+ use super :: index:: INDEX_BIN ;
24+ use super :: { Error , Filter , Index , Manifest } ;
2425use crate :: Config ;
2526
2627/// Update the local revocation cache by fetching updates over the network.
@@ -157,6 +158,11 @@ impl Plan {
157158 steps. push ( PlanStep :: download ( filter, remote_url, local) ) ;
158159 }
159160
161+ steps. push ( PlanStep :: SaveIndex {
162+ manifest : manifest. clone ( ) ,
163+ local_dir : local. to_owned ( ) ,
164+ } ) ;
165+
160166 steps. push ( PlanStep :: SaveManifest {
161167 manifest : manifest. clone ( ) ,
162168 local_dir : local. to_owned ( ) ,
@@ -197,6 +203,12 @@ enum PlanStep {
197203 /// Delete the given single local file.
198204 Delete ( PathBuf ) ,
199205
206+ /// Build and save the index from filter universe metadata.
207+ SaveIndex {
208+ manifest : Manifest ,
209+ local_dir : PathBuf ,
210+ } ,
211+
200212 /// Save the manifest structure
201213 SaveManifest {
202214 manifest : Manifest ,
@@ -264,6 +276,46 @@ impl PlanStep {
264276 path : target,
265277 } ) ?;
266278 }
279+ Self :: SaveIndex {
280+ manifest,
281+ local_dir,
282+ } => {
283+ debug ! ( "building index" ) ;
284+ let Some ( buf) = Index :: write ( & manifest, & local_dir) else {
285+ return Ok ( ( ) ) ;
286+ } ;
287+
288+ #[ cfg( target_family = "unix" ) ]
289+ let temp = tempfile:: Builder :: new ( )
290+ . permissions ( Permissions :: from_mode ( 0o644 ) )
291+ . suffix ( ".new" )
292+ . tempfile_in ( & local_dir) ;
293+ #[ cfg( not( target_family = "unix" ) ) ]
294+ let temp = tempfile:: Builder :: new ( )
295+ . suffix ( ".new" )
296+ . tempfile_in ( & local_dir) ;
297+
298+ let mut local_temp = temp. map_err ( |error| Error :: FileWrite {
299+ error,
300+ path : local_dir. clone ( ) ,
301+ } ) ?;
302+
303+ local_temp
304+ . as_file_mut ( )
305+ . write_all ( & buf)
306+ . map_err ( |error| Error :: FileWrite {
307+ error,
308+ path : local_temp. path ( ) . to_owned ( ) ,
309+ } ) ?;
310+
311+ let path = local_dir. join ( INDEX_BIN ) ;
312+ local_temp
313+ . persist ( & path)
314+ . map_err ( |error| Error :: FileWrite {
315+ error : error. error ,
316+ path,
317+ } ) ?;
318+ }
267319 Self :: SaveManifest {
268320 manifest,
269321 local_dir,
@@ -305,6 +357,9 @@ impl fmt::Display for PlanStep {
305357 filter. size
306358 ) ,
307359 Self :: Delete ( path) => write ! ( f, "delete stale file {path:?}" ) ,
360+ Self :: SaveIndex { local_dir, .. } => {
361+ write ! ( f, "build index from filters into {local_dir:?}" )
362+ }
308363 Self :: SaveManifest { local_dir, .. } => {
309364 write ! ( f, "save new manifest into {local_dir:?}" )
310365 }
0 commit comments