@@ -74,22 +74,10 @@ func IndexImage(image string, cli command.Cli) (*types.Sbom, *v1.Image, error) {
74
74
}
75
75
76
76
func indexImage (cache * registry.ImageCache , cli command.Cli ) (* types.Sbom , * v1.Image , error ) {
77
- // see if we can re-use an existing sbom
78
- sbomPath := filepath .Join (cache .Path , "sbom.json" )
79
- if _ , ok := os .LookupEnv ("ATOMIST_NO_CACHE" ); ! ok {
80
- if _ , err := os .Stat (sbomPath ); ! os .IsNotExist (err ) {
81
- var sbom types.Sbom
82
- b , err := os .ReadFile (sbomPath )
83
- if err == nil {
84
- err := json .Unmarshal (b , & sbom )
85
- if err == nil {
86
- if sbom .Descriptor .SbomVersion == internal .FromBuild ().SbomVersion && sbom .Descriptor .Version == internal .FromBuild ().Version {
87
- skill .Log .Infof (`Indexed %d packages` , len (sbom .Artifacts ))
88
- return & sbom , cache .Image , nil
89
- }
90
- }
91
- }
92
- }
77
+ configFilePath := cli .ConfigFile ().Filename
78
+ sbomFilePath := filepath .Join (filepath .Dir (configFilePath ), "sbom" , "sha256" , cache .Digest [7 :], "sbom.json" )
79
+ if sbom := cachedSbom (cache , sbomFilePath ); sbom != nil {
80
+ return sbom , cache .Image , nil
93
81
}
94
82
95
83
err := cache .StoreImage ()
@@ -99,7 +87,6 @@ func indexImage(cache *registry.ImageCache, cli command.Cli) (*types.Sbom, *v1.I
99
87
}
100
88
101
89
lm := createLayerMapping (* cache .Image )
102
- skill .Log .Debugf ("Created layer mapping" )
103
90
104
91
s := internal .StartSpinner ("info" , "Indexing" , cli .Out ().IsTerminal ())
105
92
defer s .Stop ()
@@ -173,12 +160,39 @@ func indexImage(cache *registry.ImageCache, cli command.Cli) (*types.Sbom, *v1.I
173
160
174
161
js , err := json .MarshalIndent (sbom , "" , " " )
175
162
if err == nil {
176
- _ = os .WriteFile (sbomPath , js , 0644 )
163
+ err = os .MkdirAll (filepath .Dir (sbomFilePath ), os .ModePerm )
164
+ if err != nil {
165
+ return nil , nil , errors .Wrapf (err , "failed create to sbom folder" )
166
+ }
167
+ err = os .WriteFile (sbomFilePath , js , 0644 )
168
+ if err != nil {
169
+ return nil , nil , errors .Wrapf (err , "failed to write sbom" )
170
+ }
177
171
}
178
172
179
173
return & sbom , cache .Image , nil
180
174
}
181
175
176
+ func cachedSbom (cache * registry.ImageCache , sbomFilePath string ) * types.Sbom {
177
+ // see if we can re-use an existing sbom
178
+ if _ , ok := os .LookupEnv ("ATOMIST_NO_CACHE" ); ! ok {
179
+ if _ , err := os .Stat (sbomFilePath ); ! os .IsNotExist (err ) {
180
+ var sbom types.Sbom
181
+ b , err := os .ReadFile (sbomFilePath )
182
+ if err == nil {
183
+ err := json .Unmarshal (b , & sbom )
184
+ if err == nil {
185
+ if sbom .Descriptor .SbomVersion == internal .FromBuild ().SbomVersion && sbom .Descriptor .Version == internal .FromBuild ().Version {
186
+ skill .Log .Infof (`Indexed %d packages` , len (sbom .Artifacts ))
187
+ return & sbom
188
+ }
189
+ }
190
+ }
191
+ }
192
+ }
193
+ return nil
194
+ }
195
+
182
196
func createLayerMapping (img v1.Image ) types.LayerMapping {
183
197
lm := types.LayerMapping {
184
198
ByDiffId : make (map [string ]string , 0 ),
@@ -203,5 +217,6 @@ func createLayerMapping(img v1.Image) types.LayerMapping {
203
217
lm .DigestByOrdinal [i ] = layer .Digest .String ()
204
218
}
205
219
220
+ skill .Log .Debugf ("Created layer mapping" )
206
221
return lm
207
222
}
0 commit comments