mirror of
https://github.com/rust-lang/cargo
synced 2024-10-01 05:23:56 +00:00
xtask-stale-label: check stale paths in autolabel defintions
This commit is contained in:
parent
a285008c8e
commit
981282891f
|
@ -1,2 +1,3 @@
|
|||
[alias]
|
||||
unpublished = "run --package xtask-unpublished --"
|
||||
stale-label = "run --package xtask-stale-label --"
|
||||
|
|
7
Cargo.lock
generated
7
Cargo.lock
generated
|
@ -3712,6 +3712,13 @@ dependencies = [
|
|||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "xtask-stale-label"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"toml_edit",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "xtask-unpublished"
|
||||
version = "0.0.0"
|
||||
|
|
8
crates/xtask-stale-label/Cargo.toml
Normal file
8
crates/xtask-stale-label/Cargo.toml
Normal file
|
@ -0,0 +1,8 @@
|
|||
[package]
|
||||
name = "xtask-stale-label"
|
||||
version = "0.0.0"
|
||||
edition = "2021"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
toml_edit = "0.19"
|
89
crates/xtask-stale-label/src/main.rs
Normal file
89
crates/xtask-stale-label/src/main.rs
Normal file
|
@ -0,0 +1,89 @@
|
|||
//! ```text
|
||||
//! NAME
|
||||
//! stale-label
|
||||
//!
|
||||
//! SYNOPSIS
|
||||
//! stale-label [<FILE>]
|
||||
//!
|
||||
//! DESCRIPTION
|
||||
//! Detect stale paths in autolabel definitions in triagebot.toml.
|
||||
//! Probably autofix them in the future.
|
||||
//! ```
|
||||
|
||||
use std::fmt::Write as _;
|
||||
use std::path::Path;
|
||||
use std::path::PathBuf;
|
||||
use std::process;
|
||||
use toml_edit::Document;
|
||||
|
||||
fn main() {
|
||||
let pkg_root = std::env!("CARGO_MANIFEST_DIR");
|
||||
let ws_root = PathBuf::from(format!("{pkg_root}/../.."));
|
||||
let triagebot_toml = format!("{pkg_root}/../../triagebot.toml");
|
||||
let path = std::env::args_os().nth(1).unwrap_or(triagebot_toml.into());
|
||||
let path = Path::new(&path).canonicalize().unwrap_or(path.into());
|
||||
|
||||
eprintln!("Checking file {path:?}\n");
|
||||
|
||||
let mut failed = 0;
|
||||
let mut passed = 0;
|
||||
|
||||
let toml = std::fs::read_to_string(path).expect("read from file");
|
||||
let doc = toml.parse::<Document>().expect("a toml");
|
||||
let autolabel = doc["autolabel"].as_table().expect("a toml table");
|
||||
|
||||
for (label, value) in autolabel.iter() {
|
||||
let Some(trigger_files) = value.get("trigger_files") else {
|
||||
continue
|
||||
};
|
||||
let trigger_files = trigger_files.as_array().expect("an array");
|
||||
let missing_files: Vec<_> = trigger_files
|
||||
.iter()
|
||||
// Hey TOML content is strict UTF-8.
|
||||
.map(|v| v.as_str().unwrap())
|
||||
.filter(|f| {
|
||||
// triagebot checks with `starts_with` only.
|
||||
// See https://github.com/rust-lang/triagebot/blob/0e4b48ca86ffede9cc70fb1611e658e4d013bce2/src/handlers/autolabel.rs#L45
|
||||
let path = ws_root.join(f);
|
||||
if path.exists() {
|
||||
return false;
|
||||
}
|
||||
let Some(mut read_dir) = path.parent().and_then(|p| p.read_dir().ok()) else {
|
||||
return true;
|
||||
};
|
||||
!read_dir.any(|e| {
|
||||
e.unwrap()
|
||||
.path()
|
||||
.strip_prefix(&ws_root)
|
||||
.unwrap()
|
||||
.to_str()
|
||||
.unwrap()
|
||||
.starts_with(f)
|
||||
})
|
||||
})
|
||||
.collect();
|
||||
|
||||
failed += missing_files.len();
|
||||
passed += trigger_files.len() - missing_files.len();
|
||||
|
||||
if missing_files.is_empty() {
|
||||
continue;
|
||||
}
|
||||
|
||||
let mut msg = String::new();
|
||||
writeln!(
|
||||
&mut msg,
|
||||
"missing files defined in `autolabel.{label}.trigger_files`:"
|
||||
)
|
||||
.unwrap();
|
||||
for f in missing_files.iter() {
|
||||
writeln!(&mut msg, "\t {f}").unwrap();
|
||||
}
|
||||
eprintln!("{msg}");
|
||||
}
|
||||
|
||||
let result = if failed == 0 { "ok" } else { "FAILED" };
|
||||
eprintln!("test result: {result}. {passed} passed; {failed} failed;");
|
||||
|
||||
process::exit(failed as i32);
|
||||
}
|
Loading…
Reference in a new issue