6767 MetaFile ,
6868 Root ,
6969 Snapshot ,
70+ SuccinctRoles ,
7071 TargetFile ,
7172 Targets ,
7273 Timestamp ,
@@ -334,12 +335,16 @@ def update_snapshot(self) -> None:
334335 self .snapshot .version += 1
335336 self .update_timestamp ()
336337
338+ def _get_delegator (self , delegator_name : str ) -> Targets :
339+ """Given a delegator name return, its corresponding Targets object."""
340+ if delegator_name == Targets .type :
341+ return self .targets
342+
343+ return self .md_delegates [delegator_name ].signed
344+
337345 def add_target (self , role : str , data : bytes , path : str ) -> None :
338346 """Create a target from data and add it to the target_files."""
339- if role == Targets .type :
340- targets = self .targets
341- else :
342- targets = self .md_delegates [role ].signed
347+ targets = self ._get_delegator (role )
343348
344349 target = TargetFile .from_data (path , data , ["sha256" ])
345350 targets .targets [path ] = target
@@ -349,10 +354,7 @@ def add_delegation(
349354 self , delegator_name : str , role : DelegatedRole , targets : Targets
350355 ) -> None :
351356 """Add delegated target role to the repository."""
352- if delegator_name == Targets .type :
353- delegator = self .targets
354- else :
355- delegator = self .md_delegates [delegator_name ].signed
357+ delegator = self ._get_delegator (delegator_name )
356358
357359 if (
358360 delegator .delegations is not None
@@ -377,6 +379,38 @@ def add_delegation(
377379 if role .name not in self .md_delegates :
378380 self .md_delegates [role .name ] = Metadata (targets , {})
379381
382+ def add_succinct_roles (
383+ self , delegator_name : str , bit_length : int , name_prefix : str
384+ ) -> None :
385+ """Add succinct roles info to a delegator with name "delegator_name".
386+
387+ Note that for each delegated role represented by succinct roles an empty
388+ Targets instance is created.
389+ """
390+ delegator = self ._get_delegator (delegator_name )
391+
392+ if (
393+ delegator .delegations is not None
394+ and delegator .delegations .roles is not None
395+ ):
396+ raise ValueError (
397+ "Can't add a succinct_roles when delegated roles are used"
398+ )
399+
400+ key , signer = self .create_key ()
401+ succinct_roles = SuccinctRoles ([], 1 , bit_length , name_prefix )
402+ delegator .delegations = Delegations ({}, None , succinct_roles )
403+
404+ # Add targets metadata for all bins.
405+ for delegated_name in succinct_roles .get_roles ():
406+ self .md_delegates [delegated_name ] = Metadata (
407+ Targets (expires = self .safe_expiry )
408+ )
409+
410+ self .add_signer (delegated_name , signer )
411+
412+ delegator .add_key (key )
413+
380414 def write (self ) -> None :
381415 """Dump current repository metadata to self.dump_dir
382416
0 commit comments