blob: e1d89fcd6854931376aee35d31edbd8ecc755a91 [file] [log] [blame]
const REPOS: &[&str] = &[
"https://github.com/EmbarkStudios/cargo-about",
"https://github.com/EmbarkStudios/physx-rs",
];
fn main() {
use std::process::Command;
let td = std::env::temp_dir().join("deny-repos");
// This kind of doesn't work on windows!
if td.exists() {
std::fs::remove_dir_all(&td).unwrap();
}
std::fs::create_dir_all(&td).unwrap();
// Fetch external sources once
if !Command::new("cargo")
.args(&["deny", "-L", "debug", "fetch", "all"])
.status()
.expect("failed to run cargo deny fetch")
.success()
{
panic!("failed to run cargo deny fetch");
}
let (tx, rx) = std::sync::mpsc::channel();
for repo in REPOS {
let tx = tx.clone();
let td = td.clone();
std::thread::spawn(move || {
let repo_name = &repo[repo.rfind('/').unwrap() + 1..];
let repo_dir = td.join(repo_name);
println!("cloning {}", repo);
match Command::new("git")
.arg("clone")
.arg(repo)
.arg(&repo_dir)
.output()
{
Ok(out) => {
if !out.status.success() {
let err_str = String::from_utf8(out.stderr)
.unwrap_or_else(|e| format!("git err output has bad utf8: {}", e));
tx.send(Some((repo, err_str))).unwrap();
return;
}
}
Err(e) => {
tx.send(Some((repo, format!("failed to spawn git clone: {}", e))))
.unwrap();
return;
}
};
println!("checking {}", repo);
match Command::new("cargo")
.args(&[
"deny",
"--all-features",
"-L",
"info",
"check",
"--disable-fetch",
])
.current_dir(repo_dir)
.output()
{
Ok(out) => {
if !out.status.success() {
let err_str = String::from_utf8(out.stderr)
.unwrap_or_else(|e| format!("deny err output has bad utf8: {}", e));
tx.send(Some((repo, err_str))).unwrap();
}
}
Err(e) => {
tx.send(Some((repo, format!("failed to spawn cargo deny: {}", e))))
.unwrap();
}
}
});
}
drop(tx);
let mut code = 0;
while let Ok(bad) = rx.recv() {
if let Some((repo, output)) = bad {
code = 1;
eprintln!("failed {}:\n{}", repo, output);
}
}
std::process::exit(code);
}