1
1
//! Checks the licenses of third-party dependencies.
2
2
3
- use std:: collections:: HashSet ;
3
+ use std:: collections:: { HashMap , HashSet } ;
4
4
use std:: fs:: { File , read_dir} ;
5
5
use std:: io:: Write ;
6
6
use std:: path:: Path ;
7
7
8
8
use build_helper:: ci:: CiEnv ;
9
+ use cargo_metadata:: semver:: Version ;
9
10
use cargo_metadata:: { Metadata , Package , PackageId } ;
10
11
11
12
#[ path = "../../../bootstrap/src/utils/proc_macro_deps.rs" ]
@@ -446,7 +447,7 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[
446
447
"windows_x86_64_gnu" ,
447
448
"windows_x86_64_gnullvm" ,
448
449
"windows_x86_64_msvc" ,
449
- "wit-bindgen-rt" , // via wasi
450
+ "wit-bindgen-rt@0.33.0 " , // via wasi
450
451
"writeable" ,
451
452
"yoke" ,
452
453
"yoke-derive" ,
@@ -804,7 +805,17 @@ fn check_permitted_dependencies(
804
805
805
806
// Check that the PERMITTED_DEPENDENCIES does not have unused entries.
806
807
for permitted in permitted_dependencies {
807
- if !deps. iter ( ) . any ( |dep_id| & pkg_from_id ( metadata, dep_id) . name == permitted) {
808
+ fn compare ( pkg : & Package , permitted : & str ) -> bool {
809
+ if let Some ( ( name, version) ) = permitted. split_once ( "@" ) {
810
+ let Ok ( version) = Version :: parse ( version) else {
811
+ return false ;
812
+ } ;
813
+ pkg. name == name && pkg. version == version
814
+ } else {
815
+ pkg. name == permitted
816
+ }
817
+ }
818
+ if !deps. iter ( ) . any ( |dep_id| compare ( pkg_from_id ( metadata, dep_id) , permitted) ) {
808
819
tidy_error ! (
809
820
bad,
810
821
"could not find allowed package `{permitted}`\n \
@@ -815,14 +826,30 @@ fn check_permitted_dependencies(
815
826
}
816
827
817
828
// Get in a convenient form.
818
- let permitted_dependencies: HashSet < _ > = permitted_dependencies. iter ( ) . cloned ( ) . collect ( ) ;
829
+ let permitted_dependencies: HashMap < _ , _ > = permitted_dependencies
830
+ . iter ( )
831
+ . map ( |s| {
832
+ if let Some ( ( name, version) ) = s. split_once ( '@' ) {
833
+ ( name, Version :: parse ( version) . ok ( ) )
834
+ } else {
835
+ ( * s, None )
836
+ }
837
+ } )
838
+ . collect ( ) ;
819
839
820
840
for dep in deps {
821
841
let dep = pkg_from_id ( metadata, dep) ;
822
842
// If this path is in-tree, we don't require it to be explicitly permitted.
823
- if dep. source . is_some ( ) && !permitted_dependencies. contains ( dep. name . as_str ( ) ) {
824
- tidy_error ! ( bad, "Dependency for {descr} not explicitly permitted: {}" , dep. id) ;
825
- has_permitted_dep_error = true ;
843
+ if dep. source . is_some ( ) {
844
+ let is_eq = if let Some ( version) = permitted_dependencies. get ( dep. name . as_str ( ) ) {
845
+ if let Some ( version) = version { version == & dep. version } else { true }
846
+ } else {
847
+ false
848
+ } ;
849
+ if !is_eq {
850
+ tidy_error ! ( bad, "Dependency for {descr} not explicitly permitted: {}" , dep. id) ;
851
+ has_permitted_dep_error = true ;
852
+ }
826
853
}
827
854
}
828
855
0 commit comments