@@ -321,6 +321,35 @@ def _create_observations( # pylint: disable=too-many-locals
321321 component , recommendation
322322 )
323323
324+ upgrade_impact_score = 0
325+ if patched_versions :
326+
327+ def parse_version (version : str ):
328+ version = version .split ("-" )[0 ]
329+ # Remove everything that is not a number or a dot
330+ version = "" .join (
331+ [c for c in version if c .isdigit () or c == "." ]
332+ )
333+ rettuple = tuple (map (int , version .split ("." )[:3 ]))
334+ for _ in range (3 - len (rettuple )):
335+ rettuple += (0 ,)
336+ return rettuple
337+
338+ v1 = parse_version (component .version )
339+ lowest_impact_score = 9999999
340+ patched_versions_split = patched_versions .split ("," )
341+ for patched_version in patched_versions_split :
342+ v2 = parse_version (patched_version )
343+ major_diff = abs (v2 [0 ] - v1 [0 ])
344+ minor_diff = abs (v2 [1 ] - v1 [1 ])
345+ patch_diff = abs (v2 [2 ] - v1 [2 ])
346+ upgrade_impact_score = (
347+ major_diff * 100 + minor_diff * 10 + patch_diff
348+ )
349+ if upgrade_impact_score < lowest_impact_score :
350+ lowest_impact_score = upgrade_impact_score
351+ upgrade_impact_score = lowest_impact_score
352+
324353 observation = Observation (
325354 title = title ,
326355 description = description ,
@@ -342,6 +371,7 @@ def _create_observations( # pylint: disable=too-many-locals
342371 origin_source_file = self .metadata .file ,
343372 origin_component_location = component_location ,
344373 patched_in_versions = patched_versions ,
374+ upgrade_impact_score = upgrade_impact_score ,
345375 patch_available = bool (patched_versions ),
346376 )
347377
@@ -484,12 +514,15 @@ def _get_component_location(self, component_json: dict[str, str]) -> str:
484514 def _get_patched_versions (self , component : Component , recommendation : str ) -> str :
485515 if not recommendation :
486516 return ""
517+ component_name = re .sub (r":\d+" , "" , component .name )
487518
488519 group = re .search (
489- r"Upgrade (\S+:)?" + component .name + r" to version ([a-z0-9\.\-_\s,]+)" ,
520+ r"Upgrade (\S+:)?"
521+ + component_name
522+ + r" to version (\d+:)?([a-z0-9\.\-_\s,]+)" ,
490523 recommendation ,
491524 )
492525 if group :
493- return group .group (2 )
526+ return group .group (3 )
494527
495528 return ""
0 commit comments