@@ -820,7 +820,11 @@ def __add_file_content(
820820 # the meantime.
821821 session .rollback ()
822822
823- def __store_checker_identifiers (self , checkers : Set [Tuple [str , str ]]):
823+ def __store_checker_identifiers (
824+ self ,
825+ checkers : Set [Tuple [str , str ]],
826+ checker_severities : Optional [Dict [Tuple [str , str ], str ]] = None
827+ ):
824828 """
825829 Stores the identifiers "(analyzer, checker_name)" in the database into
826830 a look-up table where each unique checker is given a unique numeric
@@ -836,6 +840,10 @@ def __store_checker_identifiers(self, checkers: Set[Tuple[str, str]]):
836840 of a run to reduce contention if two parallel stores, especially across
837841 server instances (in a distributed/load-balanced environment) want to
838842 store the same identifier(s).
843+
844+ If `checker_severities` is provided, it maps (analyzer, checker) tuples
845+ to severity strings (e.g., "HIGH", "LOW"). This is used when severity
846+ information is available from the reports themselves (e.g., from SARIF).
839847 """
840848 max_tries , tries , wait_time = 3 , 0 , timedelta (seconds = 30 )
841849 # The "fake" checker is a temporary row that is needed intermittently
@@ -844,6 +852,8 @@ def __store_checker_identifiers(self, checkers: Set[Tuple[str, str]]):
844852 # 'metadata.json', or, in the worst case, there might simply not be
845853 # a 'metadata.json' at all in the to-be-stored structure.
846854 all_checkers = {FakeChecker , UnknownChecker } | checkers
855+ if checker_severities is None :
856+ checker_severities = {}
847857 while tries < max_tries :
848858 tries += 1
849859 try :
@@ -856,8 +866,12 @@ def __store_checker_identifiers(self, checkers: Set[Tuple[str, str]]):
856866 .all ()}
857867 for analyzer , checker in \
858868 sorted (all_checkers - known_checkers ):
859- s = self .__package_context .checker_labels \
860- .severity (checker )
869+ # Use severity from reports if available, otherwise
870+ # fall back to checker labels.
871+ s = checker_severities .get ((analyzer , checker ))
872+ if not s :
873+ s = self .__package_context .checker_labels \
874+ .severity (checker )
861875 s = ttypes .Severity ._NAMES_TO_VALUES [s ]
862876 session .add (Checker (analyzer , checker , s ))
863877 LOG .debug ("Acquiring ID for checker '%s/%s' "
@@ -1160,16 +1174,25 @@ def __add_report(
11601174 return db_report .id
11611175
11621176 def __get_faked_checkers (self ) \
1163- -> Set [Tuple [str , str ]]:
1177+ -> Tuple [ Set [Tuple [str , str ]], Dict [ Tuple [ str , str ] , str ]]:
11641178 """
11651179 Extracts the "real" checker identifiers from the
11661180 __reports_with_fake_checkers that might contain some yet not fully
11671181 handled reports by __add_report(). This function does NOT touch the
11681182 database!
1183+
1184+ Returns a tuple of (checkers, severities) where:
1185+ - checkers: set of (analyzer, checker_name) tuples
1186+ - severities: dict mapping (analyzer, checker_name) to severity string
11691187 """
1170- return set (checker_name_for_report (report )
1171- for report , _
1172- in self .__reports_with_fake_checkers .values ())
1188+ checkers = set ()
1189+ severities = {}
1190+ for report , _ in self .__reports_with_fake_checkers .values ():
1191+ checker = checker_name_for_report (report )
1192+ checkers .add (checker )
1193+ if report .severity and checker not in severities :
1194+ severities [checker ] = report .severity
1195+ return checkers , severities
11731196
11741197 def __load_report_ids_for_reports_with_fake_checkers (self , session ):
11751198 """
@@ -1674,11 +1697,12 @@ def store(self,
16741697 self ._name ,
16751698 "Get look-up IDs for checkers not present in "
16761699 "'metadata.json'" ):
1677- additional_checkers = self .__get_faked_checkers ()
1700+ additional_checkers , checker_severities = \
1701+ self .__get_faked_checkers ()
16781702 # __store_checker_identifiers() has its own
16791703 # TRANSACTION!
16801704 self .__store_checker_identifiers (
1681- additional_checkers )
1705+ additional_checkers , checker_severities )
16821706
16831707 with DBSession (self .__product .session_factory ) as session , \
16841708 RunLock (session , self ._name ):
0 commit comments