5
5
"fmt"
6
6
"os"
7
7
"path/filepath"
8
+ "slices"
8
9
"sync"
9
10
10
11
"github.com/bazelbuild/bazel-gazelle/rule"
@@ -51,10 +52,20 @@ func GenerateBuildFilesHandler(handler images.HandlerFunc, layoutRoot string, pr
51
52
52
53
layoutBuild .Save (filepath .Join (layoutRoot , "BUILD.bazel" ))
53
54
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
+
54
60
return func (ctx context.Context , desc ocispec.Descriptor ) ([]ocispec.Descriptor , error ) {
55
61
writemx .Lock ()
56
62
defer writemx .Unlock ()
57
63
64
+ if slices .Contains (handledBlobs , desc .Digest .String ()) {
65
+ // We've already seen this blob; do nothing.
66
+ return handler (ctx , desc )
67
+ }
68
+
58
69
if ! blobExists (layoutRoot , desc .Digest ) {
59
70
return nil , images .ErrSkipDesc
60
71
}
@@ -78,15 +89,13 @@ func GenerateBuildFilesHandler(handler images.HandlerFunc, layoutRoot string, pr
78
89
}
79
90
80
91
imageManifestRule (desc , manifest ).Insert (f )
81
- break
82
92
case ocispec .MediaTypeImageIndex , images .MediaTypeDockerSchema2ManifestList :
83
93
index , err := ImageIndexFromProvider (ctx , provider , desc )
84
94
if err != nil {
85
95
return nil , err
86
96
}
87
97
88
98
imageIndexManifestRule (desc , index ).Insert (f )
89
- break
90
99
}
91
100
92
101
// Save all BUILD files
@@ -104,17 +113,14 @@ func GenerateBuildFilesHandler(handler images.HandlerFunc, layoutRoot string, pr
104
113
return nil , err
105
114
}
106
115
116
+ handledBlobs = append (handledBlobs , desc .Digest .String ())
107
117
return handler (ctx , desc )
108
118
}
109
119
}
110
120
111
121
func blobExists (layoutRoot string , dgst digest.Digest ) bool {
112
122
_ , err := os .Stat (descToFilePath (layoutRoot , dgst ))
113
- if os .IsNotExist (err ) {
114
- return false
115
- }
116
-
117
- return true
123
+ return ! os .IsNotExist (err )
118
124
}
119
125
120
126
func descToFilePath (root string , dgst digest.Digest ) string {
@@ -188,7 +194,3 @@ func imageIndexManifestRule(desc ocispec.Descriptor, manifest ocispec.Index) *ru
188
194
189
195
return r
190
196
}
191
-
192
- func blobPath (layoutRoot string , dgst digest.Digest ) string {
193
- return filepath .Join (layoutRoot , dgst .Algorithm ().String ())
194
- }
0 commit comments