diff --git a/client/client.go b/client/client.go index 06cdf4b67a..17c397be79 100644 --- a/client/client.go +++ b/client/client.go @@ -463,13 +463,13 @@ func (r *NotaryRepository) GetTargetByName(name string, roles ...string) (*Targe } // GetAllTargetMetadataByName searches the entire delegation role tree to find the specified target by name for all -// roles, and returns a list of TargetWithRole structs for each time it finds the specified target. -func (r *NotaryRepository) GetAllTargetMetadataByName(name string) ([]*TargetWithRole, error) { +// roles, and returns a map of role strings to Target structs for each time it finds the specified target. +func (r *NotaryRepository) GetAllTargetMetadataByName(name string) (map[string]Target, error) { if err := r.Update(false); err != nil { return nil, err } - var targetInfo []*TargetWithRole + targetInfoMap := make(map[string]Target) // Define a visitor function to find the specified target getAllTargetInfoByNameVisitorFunc := func(tgt *data.SignedTargets, validRole data.DelegationRole) interface{} { @@ -479,7 +479,7 @@ func (r *NotaryRepository) GetAllTargetMetadataByName(name string) ([]*TargetWit // We found the target and validated path compatibility in our walk, // so add it to our list if resultMeta, foundTarget := tgt.Signed.Targets[name]; foundTarget { - targetInfo = append(targetInfo, &TargetWithRole{Target: Target{Name: name, Hashes: resultMeta.Hashes, Length: resultMeta.Length}, Role: validRole.Name}) + targetInfoMap[validRole.Name] = Target{Name: name, Hashes: resultMeta.Hashes, Length: resultMeta.Length} } // continue walking to all child roles return nil @@ -489,10 +489,10 @@ func (r *NotaryRepository) GetAllTargetMetadataByName(name string) ([]*TargetWit if err := r.tufRepo.WalkTargets(name, "", getAllTargetInfoByNameVisitorFunc); err != nil { return nil, err } - if len(targetInfo) == 0 { + if len(targetInfoMap) == 0 { return nil, fmt.Errorf("No trust data for %s", name) } - return targetInfo, nil + return targetInfoMap, nil } // GetChangelist returns the list of the repository's unpublished changes diff --git a/client/client_test.go b/client/client_test.go index 4c4401f1e9..e42e680678 100644 --- a/client/client_test.go +++ b/client/client_test.go @@ -3491,28 +3491,28 @@ func TestGetAllTargetInfo(t *testing.T) { require.NoError(t, err) require.NotNil(t, targetData) require.Len(t, targetData, 3) - require.Contains(t, targetData, &TargetWithRole{Target: *targetsCurrentTarget, Role: data.CanonicalTargetsRole}) - require.Contains(t, targetData, &TargetWithRole{Target: *level1CurrentTarget, Role: "targets/level1"}) - require.Contains(t, targetData, &TargetWithRole{Target: *level2CurrentTarget, Role: "targets/level2"}) + require.Equal(t, targetData[data.CanonicalTargetsRole], *targetsCurrentTarget) + require.Equal(t, targetData["targets/level1"], *level1CurrentTarget) + require.Equal(t, targetData["targets/level2"], *level2CurrentTarget) targetData, err = repo.GetAllTargetMetadataByName("other") require.NoError(t, err) require.NotNil(t, targetData) require.Len(t, targetData, 1) - require.Contains(t, targetData, &TargetWithRole{Target: *level1OtherTarget, Role: "targets/level1"}) + require.Equal(t, targetData["targets/level1"], *level1OtherTarget) targetData, err = repo.GetAllTargetMetadataByName("latest") require.NoError(t, err) require.NotNil(t, targetData) require.Len(t, targetData, 1) - require.Contains(t, targetData, &TargetWithRole{Target: *targetsLatestTarget, Role: data.CanonicalTargetsRole}) + require.Equal(t, targetData[data.CanonicalTargetsRole], *targetsLatestTarget) targetData, err = repo.GetAllTargetMetadataByName("level2") require.NoError(t, err) require.NotNil(t, targetData) require.Len(t, targetData, 2) - require.Contains(t, targetData, &TargetWithRole{Target: *level2Level2Target, Role: "targets/level2"}) - require.Contains(t, targetData, &TargetWithRole{Target: *level1Level2Level2Target, Role: "targets/level1/level2"}) + require.Equal(t, targetData["targets/level2"], *level2Level2Target) + require.Equal(t, targetData["targets/level1/level2"], *level1Level2Level2Target) // nonexistent targets targetData, err = repo.GetAllTargetMetadataByName("level23")