Skip to content

Commit

Permalink
Auto merge of #12051 - weihanglo:stale-label, r=epage
Browse files Browse the repository at this point in the history
chore: new xtask to check stale paths in autolabel defintions
  • Loading branch information
bors committed Apr 28, 2023
2 parents a285008 + 36653ab commit c8d980c
Show file tree
Hide file tree
Showing 5 changed files with 114 additions and 0 deletions.
1 change: 1 addition & 0 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
[alias]
unpublished = "run --package xtask-unpublished --"
stale-label = "run --package xtask-stale-label --"
7 changes: 7 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,13 @@ jobs:
# TODO: check every members
- run: cargo clippy -p cargo --lib --no-deps -- -D warnings

stale-label:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: rustup update stable && rustup default stable
- run: cargo stale-label

# Ensure Cargo.lock is up-to-date
lockfile:
runs-on: ubuntu-latest
Expand Down
7 changes: 7 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions crates/xtask-stale-label/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[package]
name = "xtask-stale-label"
version = "0.0.0"
edition = "2021"
publish = false

[dependencies]
toml_edit = "0.19"
91 changes: 91 additions & 0 deletions crates/xtask-stale-label/src/main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
//! ```text
//! NAME
//! stale-label
//!
//! SYNOPSIS
//! stale-label
//!
//! DESCRIPTION
//! Detect stale paths in autolabel definitions in triagebot.toml.
//! Probably autofix them in the future.
//! ```
use std::fmt::Write as _;
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 path = {
let path = ws_root.join("triagebot.toml");
path.canonicalize().unwrap_or(path)
};

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;");

if failed > 0 {
process::exit(1);
}
}

0 comments on commit c8d980c

Please sign in to comment.