@@ -62,6 +62,64 @@ def parse_cpe(cpe: str) -> tuple[str, str]:
62
62
raise ValueError ("unknown cpe format" )
63
63
64
64
65
+ def generate_components (value ) -> list [Component ]:
66
+ components = []
67
+
68
+ if not value ["srcinfo" ].values ():
69
+ return components
70
+
71
+ pkgver = ""
72
+ pkgbase = ""
73
+ for srcinfo in value ["srcinfo" ].values ():
74
+ base = parse_srcinfo (srcinfo )[0 ]
75
+ pkgver = extract_upstream_version (base ["pkgver" ][0 ])
76
+ pkgbase = base ["pkgbase" ][0 ]
77
+ break
78
+
79
+ purls : list [PackageURL ] = []
80
+ cpes : list [str ] = []
81
+ properties = [Property (name = "msys2:pkgbase" , value = pkgbase )]
82
+
83
+ if "extra" in value and "references" in value ["extra" ]:
84
+ pkgextra = extra_to_pkgextra_entry (value ["extra" ])
85
+ for extra_key , extra_values in pkgextra ["references" ].items ():
86
+ for extra_value in extra_values :
87
+ if extra_key == "pypi" :
88
+ purls .append (PackageURL ('pypi' , None , extra_value , pkgver ))
89
+ elif extra_key == "cpe" :
90
+ if extra_value .startswith ("cpe:" ):
91
+ extra_value = extra_value [4 :]
92
+ if extra_value .startswith ("2.3:" ):
93
+ cpe = f"cpe:{ extra_value } :*:*:*:*:*:*:*:*"
94
+ else :
95
+ cpe = f"cpe:{ extra_value } :"
96
+ cpes .append (cpe )
97
+ elif extra_key == "purl" :
98
+ purl = PackageURL .from_string (extra_value )
99
+ if purl .version is None :
100
+ purl = PackageURL (** {** purl .to_dict (), "version" : pkgver })
101
+ purls .append (purl )
102
+
103
+ for cpe in cpes :
104
+ name = parse_cpe (cpe )[1 ]
105
+ component = Component (name = name , version = pkgver , cpe = cpe , properties = properties )
106
+ components .append (component )
107
+
108
+ for purl in purls :
109
+ component = Component (name = purl .name , version = purl .version , purl = purl , properties = properties )
110
+ components .append (component )
111
+
112
+ if not cpes and not purls :
113
+ if pkgbase .startswith ("mingw-w64-" ):
114
+ name = pkgbase .split ("-" , 2 )[- 1 ]
115
+ else :
116
+ name = pkgbase
117
+ component = Component (name = name , version = pkgver , properties = properties )
118
+ components .append (component )
119
+
120
+ return components
121
+
122
+
65
123
def write_sbom (srcinfo_cache : str , sbom : str ) -> None :
66
124
bom = Bom ()
67
125
bom .metadata .component = root_component = Component (
@@ -74,55 +132,8 @@ def write_sbom(srcinfo_cache: str, sbom: str) -> None:
74
132
cache = json .loads (gzip .decompress (h .read ()))
75
133
76
134
for value in cache .values ():
77
- if not value ["srcinfo" ].values ():
78
- continue
79
-
80
- pkgver = ""
81
- pkgbase = ""
82
- for srcinfo in value ["srcinfo" ].values ():
83
- base = parse_srcinfo (srcinfo )[0 ]
84
- pkgver = extract_upstream_version (base ["pkgver" ][0 ])
85
- pkgbase = base ["pkgbase" ][0 ]
86
- break
87
-
88
- purls : list [PackageURL ] = []
89
- cpes : list [str ] = []
90
- properties = [Property (name = "msys2:pkgbase" , value = pkgbase )]
91
-
92
- if "extra" in value and "references" in value ["extra" ]:
93
- pkgextra = extra_to_pkgextra_entry (value ["extra" ])
94
- for extra_key , extra_values in pkgextra ["references" ].items ():
95
- for extra_value in extra_values :
96
- if extra_key == "pypi" :
97
- purls .append (PackageURL ('pypi' , None , extra_value , pkgver ))
98
- elif extra_key == "cpe" :
99
- if extra_value .startswith ("cpe:" ):
100
- extra_value = extra_value [4 :]
101
- if extra_value .startswith ("2.3:" ):
102
- cpe = f"cpe:{ extra_value } :*:*:*:*:*:*:*:*"
103
- else :
104
- cpe = f"cpe:{ extra_value } :"
105
- cpes .append (cpe )
106
- elif extra_key == "purl" :
107
- purls .append (PackageURL .from_string (extra_value + "@" + pkgver ))
108
-
109
- for cpe in cpes :
110
- name = parse_cpe (cpe )[1 ]
111
- component = Component (name = name , version = pkgver , cpe = cpe , properties = properties )
112
- bom .components .add (component )
113
- bom .register_dependency (root_component , [component ])
114
-
115
- for purl in purls :
116
- component = Component (name = purl .name , version = pkgver , purl = purl , properties = properties )
117
- bom .components .add (component )
118
- bom .register_dependency (root_component , [component ])
119
-
120
- if not cpes and not purls :
121
- if pkgbase .startswith ("mingw-w64-" ):
122
- name = pkgbase .split ("-" , 2 )[- 1 ]
123
- else :
124
- name = pkgbase
125
- component = Component (name = name , version = pkgver , properties = properties )
135
+ components = generate_components (value )
136
+ for component in components :
126
137
bom .components .add (component )
127
138
bom .register_dependency (root_component , [component ])
128
139
0 commit comments