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" ]
@@ -445,6 +446,7 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[
445446 "windows_x86_64_gnu" ,
446447 "windows_x86_64_gnullvm" ,
447448 "windows_x86_64_msvc" ,
449+ "wit-bindgen-rt@0.33.0" , // via wasi
448450 "writeable" ,
449451 "yoke" ,
450452 "yoke-derive" ,
@@ -802,7 +804,17 @@ fn check_permitted_dependencies(
802804
803805 // Check that the PERMITTED_DEPENDENCIES does not have unused entries.
804806 for permitted in permitted_dependencies {
805- if !deps. iter ( ) . any ( |dep_id| & pkg_from_id ( metadata, dep_id) . name == permitted) {
807+ fn compare ( pkg : & Package , permitted : & str ) -> bool {
808+ if let Some ( ( name, version) ) = permitted. split_once ( "@" ) {
809+ let Ok ( version) = Version :: parse ( version) else {
810+ return false ;
811+ } ;
812+ pkg. name == name && pkg. version == version
813+ } else {
814+ pkg. name == permitted
815+ }
816+ }
817+ if !deps. iter ( ) . any ( |dep_id| compare ( pkg_from_id ( metadata, dep_id) , permitted) ) {
806818 tidy_error ! (
807819 bad,
808820 "could not find allowed package `{permitted}`\n \
@@ -813,14 +825,30 @@ fn check_permitted_dependencies(
813825 }
814826
815827 // Get in a convenient form.
816- let permitted_dependencies: HashSet < _ > = permitted_dependencies. iter ( ) . cloned ( ) . collect ( ) ;
828+ let permitted_dependencies: HashMap < _ , _ > = permitted_dependencies
829+ . iter ( )
830+ . map ( |s| {
831+ if let Some ( ( name, version) ) = s. split_once ( '@' ) {
832+ ( name, Version :: parse ( version) . ok ( ) )
833+ } else {
834+ ( * s, None )
835+ }
836+ } )
837+ . collect ( ) ;
817838
818839 for dep in deps {
819840 let dep = pkg_from_id ( metadata, dep) ;
820841 // If this path is in-tree, we don't require it to be explicitly permitted.
821- if dep. source . is_some ( ) && !permitted_dependencies. contains ( dep. name . as_str ( ) ) {
822- tidy_error ! ( bad, "Dependency for {descr} not explicitly permitted: {}" , dep. id) ;
823- has_permitted_dep_error = true ;
842+ if dep. source . is_some ( ) {
843+ let is_eq = if let Some ( version) = permitted_dependencies. get ( dep. name . as_str ( ) ) {
844+ if let Some ( version) = version { version == & dep. version } else { true }
845+ } else {
846+ false
847+ } ;
848+ if !is_eq {
849+ tidy_error ! ( bad, "Dependency for {descr} not explicitly permitted: {}" , dep. id) ;
850+ has_permitted_dep_error = true ;
851+ }
824852 }
825853 }
826854
0 commit comments