@@ -333,6 +333,25 @@ def identifier_with_expression(self):
333333 id_safe_expression = python_safe_name (s = str (self .license_expression ))
334334 return "{}-{}" .format (id_safe_expression , self ._identifier )
335335
336+ @property
337+ def is_unknown (self ):
338+ """
339+ Return True if there are unknown license keys in the license expression
340+ for this detection, return False otherwise.
341+ """
342+ unknown_license_keys = [
343+ "unknown-license-reference" ,
344+ "unknown-spdx" ,
345+ "unknown" ,
346+ "free-unknown"
347+ ]
348+
349+ for license_key in unknown_license_keys :
350+ if license_key in self .license_expression :
351+ return True
352+
353+ return False
354+
336355 def get_start_end_line (self ):
337356 """
338357 Return start and end line for a license detection issue, from the
@@ -1355,6 +1374,58 @@ def has_references_to_local_files(license_matches):
13551374 )
13561375
13571376
1377+ def use_referenced_license_expression (referenced_license_expression , license_detection , licensing = Licensing ()):
1378+ """
1379+ """
1380+ if license_detection .is_unknown :
1381+ return True
1382+
1383+ if referenced_license_expression == license_detection .license_expression :
1384+ return True
1385+
1386+ dependent_license_keys = {
1387+ "lgpl" : "gpl" ,
1388+ }
1389+
1390+ license_keys_with_or_later = [
1391+ "gpl" , "lgpl" , "agpl"
1392+ ]
1393+
1394+ license_keys = set (
1395+ licensing .license_keys (expression = license_detection .license_expression )
1396+ )
1397+ referenced_license_keys = set (
1398+ licensing .license_keys (expression = referenced_license_expression )
1399+ )
1400+ same_expression = referenced_license_expression == license_detection .license_expression
1401+ same_license_keys = license_keys == referenced_license_keys
1402+
1403+ if same_license_keys and not same_expression :
1404+ return False
1405+
1406+ for primary_key , dependent_key in dependent_license_keys .items ():
1407+ dependent_key_only_in_referenced = dependent_key in referenced_license_keys and dependent_key not in license_keys
1408+ if primary_key in license_keys and dependent_key_only_in_referenced :
1409+ return False
1410+
1411+ all_license_keys_special = [
1412+ key in license_keys_with_or_later
1413+ for key in license_keys
1414+ ]
1415+ all_referenced_license_keys_special = [
1416+ key in license_keys_with_or_later
1417+ for key in referenced_license_keys
1418+ ]
1419+
1420+ if all_license_keys_special and all_referenced_license_keys_special and not same_license_keys :
1421+ True
1422+
1423+ if len (referenced_license_keys ) > 5 :
1424+ return False
1425+
1426+ return True
1427+
1428+
13581429def get_detected_license_expression (
13591430 analysis ,
13601431 license_matches = None ,
0 commit comments