11//! Checks the licenses of third-party dependencies.
22
3- use std:: collections:: HashSet ;
3+ use std:: collections:: { HashMap , HashSet } ;
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" ]
@@ -446,7 +447,7 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[
446447 "windows_x86_64_gnu" ,
447448 "windows_x86_64_gnullvm" ,
448449 "windows_x86_64_msvc" ,
449- "wit-bindgen-rt" , // via wasi
450+ "wit-bindgen-rt@0.33.0 " , // via wasi
450451 "writeable" ,
451452 "yoke" ,
452453 "yoke-derive" ,
@@ -804,7 +805,17 @@ fn check_permitted_dependencies(
804805
805806 // Check that the PERMITTED_DEPENDENCIES does not have unused entries.
806807 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) ) {
808819 tidy_error ! (
809820 bad,
810821 "could not find allowed package `{permitted}`\n \
@@ -815,14 +826,30 @@ fn check_permitted_dependencies(
815826 }
816827
817828 // 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 ( ) ;
819839
820840 for dep in deps {
821841 let dep = pkg_from_id ( metadata, dep) ;
822842 // 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+ }
826853 }
827854 }
828855
0 commit comments