@@ -126,11 +126,12 @@ def __init__(
126
126
# if no root was provided, use the cached non-versioned root.json
127
127
bootstrap = self ._load_local_metadata (Root .type )
128
128
129
- # Load the initial root, make sure it's cached in root_history/
129
+ # Load the initial root, make sure it's cached
130
130
self ._trusted_set = TrustedMetadataSet (
131
131
bootstrap , self .config .envelope_type
132
132
)
133
133
self ._persist_root (self ._trusted_set .root .version , bootstrap )
134
+ self ._update_root_symlink ()
134
135
135
136
def refresh (self ) -> None :
136
137
"""Refresh top-level metadata.
@@ -320,7 +321,8 @@ def _persist_metadata(self, rolename: str, data: bytes) -> None:
320
321
def _persist_root (self , version : int , data : bytes ) -> None :
321
322
"""Write root metadata to disk atomically to avoid data loss.
322
323
323
- Use a filename prefixed with version (e.g. "1.root.json").
324
+ The metadata is stored with version prefix (e.g.
325
+ "root_history/1.root.json").
324
326
"""
325
327
rootdir = os .path .join (self ._dir , "root_history" )
326
328
with contextlib .suppress (FileExistsError ):
@@ -346,6 +348,15 @@ def _persist_file(self, filename: str, data: bytes) -> None:
346
348
os .remove (temp_file_name )
347
349
raise e
348
350
351
+ def _update_root_symlink (self ) -> None :
352
+ """Symlink root.json to current trusted root version in root_history/"""
353
+ linkname = os .path .join (self ._dir , "root.json" )
354
+ version = self ._trusted_set .root .version
355
+ current = os .path .join ("root_history" , f"{ version } .root.json" )
356
+ with contextlib .suppress (FileNotFoundError ):
357
+ os .remove (linkname )
358
+ os .symlink (current , linkname )
359
+
349
360
def _load_root (self ) -> None :
350
361
"""Load root metadata.
351
362
@@ -390,12 +401,7 @@ def _load_root(self) -> None:
390
401
break
391
402
finally :
392
403
# Make sure the non-versioned root.json links to current version
393
- linkname = os .path .join (self ._dir , "root.json" )
394
- version = self ._trusted_set .root .version
395
- current = os .path .join ("root_history" , f"{ version } .root.json" )
396
- with contextlib .suppress (FileNotFoundError ):
397
- os .remove (linkname )
398
- os .symlink (current , linkname )
404
+ self ._update_root_symlink ()
399
405
400
406
def _load_timestamp (self ) -> None :
401
407
"""Load local and remote timestamp metadata."""
0 commit comments