Skip to content

Commit

Permalink
fix failed test
Browse files Browse the repository at this point in the history
Signed-off-by: Xiaoxuan Wang <xiaoxuanwang@microsoft.com>
  • Loading branch information
Xiaoxuan Wang committed Sep 11, 2024
1 parent cead51c commit 6fcb2f1
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 24 deletions.
28 changes: 10 additions & 18 deletions cmd/oras/root/manifest/index/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ func mergeIndexes(ctx context.Context, manifests []ocispec.Descriptor, target or

func removeManifestsFromIndex(ctx context.Context, manifests []ocispec.Descriptor, target oras.ReadOnlyTarget, opts updateOptions) ([]ocispec.Descriptor, error) {
// create a set of digests to speed up the remove
digestSet := make(map[digest.Digest]int)
digestSet := make(map[digest.Digest]bool)
for _, manifestRef := range opts.removeArguments {
printUpdateStatus(status.IndexPromptResolving, manifestRef, "", opts.Printer)
desc, err := oras.Resolve(ctx, target, manifestRef, oras.DefaultResolveOptions)
Expand All @@ -209,36 +209,28 @@ func removeManifestsFromIndex(ctx context.Context, manifests []ocispec.Descripto
return nil, fmt.Errorf("%s is not a manifest", manifestRef)
}
printUpdateStatus(status.IndexPromptResolved, manifestRef, string(desc.Digest), opts.Printer)
digestSet[desc.Digest] = 0
digestSet[desc.Digest] = true
}
return removeManifests(manifests, digestSet, opts.Printer, opts.Reference)
}

// removeManifests removes descriptors whose digests are in digestSet. The remove is
// done by moving the remaining items of the slice forward, overwriting the element
// and finally shrinking the slice.
func removeManifests(manifests []ocispec.Descriptor, digestSet map[digest.Digest]int, printer *output.Printer, indexRef string) ([]ocispec.Descriptor, error) {
end := len(manifests) - 1
for i := 0; i < end; i++ {
func removeManifests(manifests []ocispec.Descriptor, digestSet map[digest.Digest]bool, printer *output.Printer, indexRef string) ([]ocispec.Descriptor, error) {
newManifests := []ocispec.Descriptor{}
for i := 0; i < len(manifests); i++ {
if _, exists := digestSet[manifests[i].Digest]; exists {
digest := manifests[i].Digest
digestSet[digest]++
// overwrite the content of manifest[i] by moving the remaining items forward
for j := i; j < end; j++ {
manifests[j] = manifests[j+1]
}
end = end - 1
digestSet[digest] = true
printUpdateStatus(status.IndexPromptRemoved, string(digest), "", printer)
} else {
newManifests = append(newManifests, manifests[i])
}
}
// shrink the slice
manifests = manifests[:end+1]
for key, val := range digestSet {
if val == 0 {
if !val {
return nil, fmt.Errorf("%s does not exist in the index %s", key, indexRef)
}
}
return manifests, nil
return newManifests, nil
}

func printUpdateStatus(verb string, reference string, resolvedDigest string, printer *output.Printer) {
Expand Down
21 changes: 15 additions & 6 deletions cmd/oras/root/manifest/index/update_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ func Test_removeManifests(t *testing.T) {
tests := []struct {
name string
manifests []ocispec.Descriptor
digestSet map[digest.Digest]int
digestSet map[digest.Digest]bool
printer *output.Printer
indexRef string
want []ocispec.Descriptor
Expand All @@ -56,27 +56,36 @@ func Test_removeManifests(t *testing.T) {
{
name: "remove one matched item",
manifests: []ocispec.Descriptor{A, B, C},
digestSet: map[digest.Digest]int{B.Digest: 0},
digestSet: map[digest.Digest]bool{B.Digest: false},
printer: output.NewPrinter(os.Stdout, os.Stderr, false),
indexRef: "test01",
want: []ocispec.Descriptor{A, C},
wantErr: false,
},
{
name: "remove all matched items",
manifests: []ocispec.Descriptor{A, B, C},
digestSet: map[digest.Digest]int{A.Digest: 0},
manifests: []ocispec.Descriptor{A, B, A, C, A, A, A},
digestSet: map[digest.Digest]bool{A.Digest: false},
printer: output.NewPrinter(os.Stdout, os.Stderr, false),
indexRef: "test02",
want: []ocispec.Descriptor{B, C},
wantErr: false,
},
{
name: "remove correctly when there is only one item",
manifests: []ocispec.Descriptor{A},
digestSet: map[digest.Digest]bool{A.Digest: false},
printer: output.NewPrinter(os.Stdout, os.Stderr, false),
indexRef: "test03",
want: []ocispec.Descriptor{},
wantErr: false,
},
{
name: "return error when deleting a nonexistent item",
manifests: []ocispec.Descriptor{A, C},
digestSet: map[digest.Digest]int{B.Digest: 0},
digestSet: map[digest.Digest]bool{B.Digest: false},
printer: output.NewPrinter(os.Stdout, os.Stderr, false),
indexRef: "test03",
indexRef: "test04",
want: nil,
wantErr: true,
},
Expand Down

0 comments on commit 6fcb2f1

Please sign in to comment.