1
1
use anyhow:: { Context , Result } ;
2
- use spdx:: { Expression , LicenseItem , LicenseReq , ParseMode } ;
2
+ use spdx:: { Expression , LicenseReq , ParseMode } ;
3
3
4
- pub fn extract_license_ids ( expression : & Expression ) -> Vec < String > {
4
+ pub fn extract_license_texts ( expression : & Expression ) -> Vec < String > {
5
5
expression
6
6
. requirements ( )
7
- . map ( |req| match & req. req . license {
8
- LicenseItem :: Spdx { id, .. } => id. name . to_string ( ) ,
9
- LicenseItem :: Other { lic_ref, .. } => lic_ref. clone ( ) ,
10
- } )
7
+ . map ( |req| req. req . to_string ( ) )
11
8
. collect ( )
12
9
}
13
10
14
11
fn check_license_req_safety ( license_req : & LicenseReq , safe_licenses : & [ Expression ] ) -> bool {
15
- let safe_license_ids: Vec < String > =
16
- safe_licenses. iter ( ) . flat_map ( extract_license_ids) . collect ( ) ;
12
+ let safe_license_requirements: Vec < String > = safe_licenses
13
+ . iter ( )
14
+ . flat_map ( extract_license_texts)
15
+ . collect ( ) ;
17
16
18
- match & license_req. license {
19
- LicenseItem :: Spdx { id, .. } => safe_license_ids. contains ( & id. name . to_string ( ) ) ,
20
- LicenseItem :: Other { lic_ref, .. } => safe_license_ids. contains ( lic_ref) ,
21
- }
17
+ safe_license_requirements. contains ( & license_req. to_string ( ) )
22
18
}
23
19
24
20
pub fn check_expression_safety ( expression : & Expression , safe_licenses : & [ Expression ] ) -> bool {
@@ -43,12 +39,54 @@ mod tests {
43
39
44
40
use crate :: expression_utils:: parse_expression;
45
41
42
+ #[ test]
43
+ fn test_extract_license_texts ( ) {
44
+ let expression = parse_expression ( "MIT OR GPL-3.0-or-later" ) . unwrap ( ) ;
45
+ let license_texts = extract_license_texts ( & expression) ;
46
+
47
+ assert_eq ! (
48
+ license_texts,
49
+ vec![ "MIT" . to_string( ) , "GPL-3.0-or-later" . to_string( ) ]
50
+ ) ;
51
+ }
52
+
53
+ #[ test]
54
+ fn test_license_with_exception ( ) {
55
+ let expression = parse_expression ( "GPL-2.0-only" ) . unwrap ( ) ;
56
+ let safe_licenses = & [ Expression :: parse ( "GPL-2.0-only WITH GCC-exception-2.0" ) . unwrap ( ) ] ;
57
+
58
+ let license_allowed = check_expression_safety ( & expression, safe_licenses) ;
59
+
60
+ assert ! ( !license_allowed) ;
61
+
62
+ let expression = parse_expression ( "GPL-2.0-only WITH GCC-exception-2.0" ) . unwrap ( ) ;
63
+ let safe_licenses = & [ Expression :: parse ( "GPL-2.0-only" ) . unwrap ( ) ] ;
64
+ let license_allowed = check_expression_safety ( & expression, safe_licenses) ;
65
+
66
+ assert ! ( !license_allowed) ;
67
+
68
+ let expression = parse_expression ( "GPL-3.0-only WITH GCC-exception-3.1" ) . unwrap ( ) ;
69
+ let safe_licenses = & [ Expression :: parse ( "GPL-3.0-only" ) . unwrap ( ) ] ;
70
+ let license_allowed = check_expression_safety ( & expression, safe_licenses) ;
71
+
72
+ assert ! ( !license_allowed) ;
73
+
74
+ let expression = parse_expression ( "GPL-3.0-only" ) . unwrap ( ) ;
75
+ let safe_licenses = & [ Expression :: parse ( "GPL-3.0-only WITH GCC-exception-3.1" ) . unwrap ( ) ] ;
76
+ let license_allowed = check_expression_safety ( & expression, safe_licenses) ;
77
+
78
+ assert ! ( !license_allowed) ;
79
+ }
80
+
46
81
#[ test]
47
82
fn test_extract_license_ids ( ) {
48
83
let expression = parse_expression ( "MIT OR GPL-3.0-or-later" ) . unwrap ( ) ;
49
- let license_ids = super :: extract_license_ids ( & expression) ;
84
+ let license_ids = super :: extract_license_texts ( & expression) ;
50
85
51
- assert_eq ! ( license_ids, vec![ "MIT" . to_string( ) , "GPL-3.0" . to_string( ) ] ) ;
86
+ assert_eq ! (
87
+ license_ids,
88
+ vec![ "MIT" . to_string( ) , "GPL-3.0-or-later" . to_string( ) ]
89
+ ) ;
52
90
}
53
91
54
92
#[ test]
0 commit comments