1414
1515from .srcinfo import parse_srcinfo
1616from .pkgextra import extra_to_pkgextra_entry
17- from .cpe import parse_cpe , build_cpe22 , normalize_cpe
17+ from .cpe import parse_cpe , build_cpe22
1818
1919
2020def extract_upstream_version (version : str ) -> str :
@@ -161,62 +161,6 @@ def include_unaffected_from_grype(grype_data: dict, target_bom: Bom) -> None:
161161 target .versions = target_versions
162162
163163
164- def handle_merge_command (args ) -> None :
165- """Merge component properties from the source SBOM into a target SBOM.
166-
167- Components are matched by name, version, purl, and CPE (normalized).
168- """
169-
170- logging .basicConfig (level = "INFO" )
171-
172- with open (args .src_sbom , "r" , encoding = "utf-8" ) as h :
173- src_bom : Bom = Bom .from_json (json .loads (h .read ()))
174-
175- properties = {}
176-
177- def get_component_key (component : Component ) -> str :
178- cpe_key = None
179- if component .cpe is not None :
180- cpe_key = normalize_cpe (component .cpe )
181- return (component .name , component .version , component .purl , cpe_key )
182-
183- for component in src_bom .components :
184- assert isinstance (component , Component )
185- key = get_component_key (component )
186- if key not in properties :
187- properties [key ] = component .properties
188- else :
189- properties [key ].update (component .properties )
190-
191- with open (args .target_sbom , "r" , encoding = "utf-8" ) as h :
192- target_bom : Bom = Bom .from_json (json .loads (h .read ()))
193-
194- if args .grype_json is not None :
195- with open (args .grype_json , "r" , encoding = "utf-8" ) as h :
196- grype_data = json .loads (h .read ())
197- include_unaffected_from_grype (grype_data , target_bom )
198-
199- done = set ()
200- for component in target_bom .components :
201- key = get_component_key (component )
202- if key in done :
203- continue
204- if key not in properties :
205- raise ValueError (f"Component not found in source SBOM: { key } " )
206- for src_prop in properties .get (key , []):
207- for prop in component .properties :
208- if prop .name == src_prop .name and prop .value == src_prop .value :
209- break
210- else :
211- component .properties .add (src_prop )
212- done .add (key )
213-
214- my_json_outputter : 'JsonOutputter' = JsonV1Dot5 (target_bom )
215- serialized_json = my_json_outputter .output_as_string (indent = 2 )
216- with open (args .target_sbom , 'w' , encoding = "utf-8" ) as file :
217- file .write (serialized_json )
218-
219-
220164def handle_fixup_command (args ) -> None :
221165 """Adjust the target SBOM by rewriting component properties and
222166 adding unaffected versions from a grype json file."""
@@ -252,22 +196,6 @@ def handle_fixup_command(args) -> None:
252196 file .write (serialized_json )
253197
254198
255- def add_merge_subcommand (subparsers ) -> None :
256- parser = subparsers .add_parser (
257- "merge" ,
258- description = "Merge component properties from the source SBOM into a target SBOM" ,
259- allow_abbrev = False
260- )
261- parser .add_argument ("src_sbom" , help = "The source SBOM" )
262- parser .add_argument ("target_sbom" , help = "The target SBOM" )
263- parser .add_argument (
264- "--grype-json" ,
265- help = "Include additional info from a grype json file, like fixed versions" ,
266- default = None
267- )
268- parser .set_defaults (func = handle_merge_command )
269-
270-
271199def add_fixup_subcommand (subparsers ) -> None :
272200 parser = subparsers .add_parser (
273201 "fixup" ,
@@ -289,7 +217,6 @@ def main(argv: list[str]) -> None:
289217 subparsers = parser .add_subparsers (dest = "command" , required = True )
290218
291219 add_create_subcommand (subparsers )
292- add_merge_subcommand (subparsers )
293220 add_fixup_subcommand (subparsers )
294221
295222 args = parser .parse_args (argv [1 :])
0 commit comments