@@ -74,22 +74,10 @@ func IndexImage(image string, cli command.Cli) (*types.Sbom, *v1.Image, error) {
7474}
7575
7676func 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
9381 }
9482
9583 err := cache .StoreImage ()
@@ -99,7 +87,6 @@ func indexImage(cache *registry.ImageCache, cli command.Cli) (*types.Sbom, *v1.I
9987 }
10088
10189 lm := createLayerMapping (* cache .Image )
102- skill .Log .Debugf ("Created layer mapping" )
10390
10491 s := internal .StartSpinner ("info" , "Indexing" , cli .Out ().IsTerminal ())
10592 defer s .Stop ()
@@ -173,12 +160,39 @@ func indexImage(cache *registry.ImageCache, cli command.Cli) (*types.Sbom, *v1.I
173160
174161 js , err := json .MarshalIndent (sbom , "" , " " )
175162 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+ }
177171 }
178172
179173 return & sbom , cache .Image , nil
180174}
181175
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+
182196func createLayerMapping (img v1.Image ) types.LayerMapping {
183197 lm := types.LayerMapping {
184198 ByDiffId : make (map [string ]string , 0 ),
@@ -203,5 +217,6 @@ func createLayerMapping(img v1.Image) types.LayerMapping {
203217 lm .DigestByOrdinal [i ] = layer .Digest .String ()
204218 }
205219
220+ skill .Log .Debugf ("Created layer mapping" )
206221 return lm
207222}
0 commit comments