Skip to content

Commit dc34711

Browse files
Skip over already-seen blobs when generating Bazel targets. (#66)
When using the -shallow flag, multiple targets with the same name were being generated, which Bazel does not like. This commit ensures we only generate one Bazel rule per blob.
1 parent 14fd546 commit dc34711

File tree

1 file changed

+13
-11
lines changed

1 file changed

+13
-11
lines changed

go/pkg/ociutil/bazel.go

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"os"
77
"path/filepath"
8+
"slices"
89
"sync"
910

1011
"github.com/bazelbuild/bazel-gazelle/rule"
@@ -51,10 +52,20 @@ func GenerateBuildFilesHandler(handler images.HandlerFunc, layoutRoot string, pr
5152

5253
layoutBuild.Save(filepath.Join(layoutRoot, "BUILD.bazel"))
5354

55+
// It's possible to encounter the same blob multiple times. We record the
56+
// ones we've already encountered so we don't process them twice.
57+
// Duplicate rules make bazel sad.
58+
handledBlobs := make([]string, 0)
59+
5460
return func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
5561
writemx.Lock()
5662
defer writemx.Unlock()
5763

64+
if slices.Contains(handledBlobs, desc.Digest.String()) {
65+
// We've already seen this blob; do nothing.
66+
return handler(ctx, desc)
67+
}
68+
5869
if !blobExists(layoutRoot, desc.Digest) {
5970
return nil, images.ErrSkipDesc
6071
}
@@ -78,15 +89,13 @@ func GenerateBuildFilesHandler(handler images.HandlerFunc, layoutRoot string, pr
7889
}
7990

8091
imageManifestRule(desc, manifest).Insert(f)
81-
break
8292
case ocispec.MediaTypeImageIndex, images.MediaTypeDockerSchema2ManifestList:
8393
index, err := ImageIndexFromProvider(ctx, provider, desc)
8494
if err != nil {
8595
return nil, err
8696
}
8797

8898
imageIndexManifestRule(desc, index).Insert(f)
89-
break
9099
}
91100

92101
// Save all BUILD files
@@ -104,17 +113,14 @@ func GenerateBuildFilesHandler(handler images.HandlerFunc, layoutRoot string, pr
104113
return nil, err
105114
}
106115

116+
handledBlobs = append(handledBlobs, desc.Digest.String())
107117
return handler(ctx, desc)
108118
}
109119
}
110120

111121
func blobExists(layoutRoot string, dgst digest.Digest) bool {
112122
_, err := os.Stat(descToFilePath(layoutRoot, dgst))
113-
if os.IsNotExist(err) {
114-
return false
115-
}
116-
117-
return true
123+
return !os.IsNotExist(err)
118124
}
119125

120126
func descToFilePath(root string, dgst digest.Digest) string {
@@ -188,7 +194,3 @@ func imageIndexManifestRule(desc ocispec.Descriptor, manifest ocispec.Index) *ru
188194

189195
return r
190196
}
191-
192-
func blobPath(layoutRoot string, dgst digest.Digest) string {
193-
return filepath.Join(layoutRoot, dgst.Algorithm().String())
194-
}

0 commit comments

Comments
 (0)