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" ]
@@ -445,6 +446,7 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[
445
446
"windows_x86_64_gnu" ,
446
447
"windows_x86_64_gnullvm" ,
447
448
"windows_x86_64_msvc" ,
449
+
448
450
"writeable" ,
449
451
"yoke" ,
450
452
"yoke-derive" ,
@@ -802,7 +804,17 @@ fn check_permitted_dependencies(
802
804
803
805
// Check that the PERMITTED_DEPENDENCIES does not have unused entries.
804
806
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) ) {
806
818
tidy_error ! (
807
819
bad,
808
820
"could not find allowed package `{permitted}`\n \
@@ -813,14 +825,30 @@ fn check_permitted_dependencies(
813
825
}
814
826
815
827
// 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 ( ) ;
817
838
818
839
for dep in deps {
819
840
let dep = pkg_from_id ( metadata, dep) ;
820
841
// 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
+ }
824
852
}
825
853
}
826
854
0 commit comments