11//! Checks the licenses of third-party dependencies.
22
3- use std:: collections:: HashSet ;
3+ use std:: collections:: { HashSet , HashMap } ;
44use std:: fs:: { File , read_dir} ;
55use std:: io:: Write ;
66use std:: path:: Path ;
77
88use build_helper:: ci:: CiEnv ;
9+ use cargo_metadata:: semver:: Version ;
910use cargo_metadata:: { Metadata , Package , PackageId } ;
1011
1112#[ path = "../../../bootstrap/src/utils/proc_macro_deps.rs" ]
@@ -447,7 +448,7 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[
447448 "windows_x86_64_gnu" ,
448449 "windows_x86_64_gnullvm" ,
449450 "windows_x86_64_msvc" ,
450- "wit-bindgen-rt" , // via wasi
451+ "wit-bindgen-rt@0.33.0 " , // via wasi
451452 "writeable" ,
452453 "yoke" ,
453454 "yoke-derive" ,
@@ -805,7 +806,17 @@ fn check_permitted_dependencies(
805806
806807 // Check that the PERMITTED_DEPENDENCIES does not have unused entries.
807808 for permitted in permitted_dependencies {
808- if !deps. iter ( ) . any ( |dep_id| & pkg_from_id ( metadata, dep_id) . name == permitted) {
809+ fn compare ( pkg : & Package , permitted : & str ) -> bool {
810+ if let Some ( ( name, version) ) = permitted. split_once ( "@" ) {
811+ let Ok ( version) = Version :: parse ( version) else {
812+ return false ;
813+ } ;
814+ pkg. name == name && pkg. version == version
815+ } else {
816+ pkg. name == permitted
817+ }
818+ }
819+ if !deps. iter ( ) . any ( |dep_id| compare ( pkg_from_id ( metadata, dep_id) , permitted) ) {
809820 tidy_error ! (
810821 bad,
811822 "could not find allowed package `{permitted}`\n \
@@ -816,14 +827,23 @@ fn check_permitted_dependencies(
816827 }
817828
818829 // Get in a convenient form.
819- let permitted_dependencies: HashSet < _ > = permitted_dependencies. iter ( ) . cloned ( ) . collect ( ) ;
830+ let permitted_dependencies: HashMap < _ , _ > = permitted_dependencies. iter ( ) . map ( |s| {
831+ if let Some ( ( name, version) ) = s. split_once ( '@' ) {
832+ ( name, Version :: parse ( version) . ok ( ) )
833+ } else {
834+ ( * s, None )
835+ }
836+ } ) . collect ( ) ;
820837
821838 for dep in deps {
822839 let dep = pkg_from_id ( metadata, dep) ;
823840 // If this path is in-tree, we don't require it to be explicitly permitted.
824- if dep. source . is_some ( ) && !permitted_dependencies. contains ( dep. name . as_str ( ) ) {
825- tidy_error ! ( bad, "Dependency for {descr} not explicitly permitted: {}" , dep. id) ;
826- has_permitted_dep_error = true ;
841+ if dep. source . is_some ( ) {
842+ let permitted = permitted_dependencies. get ( dep. name ) ;
843+ if permitted. is_none ( ) || ( let Some ( permitted) = permitted && dep. version == permitted) {
844+ tidy_error ! ( bad, "Dependency for {descr} not explicitly permitted: {}" , dep. id) ;
845+ has_permitted_dep_error = true ;
846+ }
827847 }
828848 }
829849
0 commit comments