Skip to content

Commit 66df74a

Browse files
committed
Support locking versions in permitted rustc deps
1 parent 972036b commit 66df74a

File tree

1 file changed

+34
-7
lines changed

1 file changed

+34
-7
lines changed

src/tools/tidy/src/deps.rs

+34-7
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
//! Checks the licenses of third-party dependencies.
22
3-
use std::collections::HashSet;
3+
use std::collections::{HashMap, HashSet};
44
use std::fs::{File, read_dir};
55
use std::io::Write;
66
use std::path::Path;
77

88
use build_helper::ci::CiEnv;
9+
use cargo_metadata::semver::Version;
910
use 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

Comments
 (0)