lol

maintainers/scripts: add check-maintainer-usernames

Co-authored-by: Sandro <sandro.jaeckel@gmail.com>

+52
+1
maintainers/scripts/check-maintainer-usernames/.gitignore
··· 1 + /target
+9
maintainers/scripts/check-maintainer-usernames/Cargo.toml
··· 1 + [package] 2 + name = "check-maintainers" 3 + version = "0.1.0" 4 + edition = "2021" 5 + 6 + [dependencies] 7 + octocrab = "0.42.1" 8 + serde_json = "1.0.133" 9 + tokio = { version = "1.41.1", features = ["fs", "macros", "rt-multi-thread"] }
+42
maintainers/scripts/check-maintainer-usernames/src/main.rs
··· 1 + use std::{env, error::Error, io::{self, Write}}; 2 + 3 + use tokio::fs; 4 + 5 + #[tokio::main] 6 + async fn main() { 7 + real_main().await.unwrap(); 8 + } 9 + 10 + async fn real_main() -> Result<(), Box<dyn Error>> { 11 + let gh = octocrab::OctocrabBuilder::default() 12 + .personal_token(env::var("GITHUB_PAT").expect("no GITHUB_PAT configured")) 13 + .build()?; 14 + 15 + // first run: nix-instantiate -A lib.maintainers --eval --strict --json > maintainers.json 16 + let data: serde_json::Value = serde_json::from_str(&fs::read_to_string("maintainers.json").await?)?; 17 + 18 + let data = data.as_object().unwrap(); 19 + let total = data.len(); 20 + for (i, (maintainer_name, v)) in data.iter().enumerate() { 21 + print!("\r{i}/{total}"); 22 + io::stdout().flush()?; 23 + let Some(github_id) = v.get("githubId") else { 24 + println!("\rWARN: no id for {maintainer_name}"); 25 + continue; 26 + }; 27 + let Some(github) = v.get("github") else { 28 + println!("\rWARN: no username for {maintainer_name}"); 29 + continue; 30 + }; 31 + let Ok(name) = gh.users_by_id(github_id.as_u64().unwrap()).profile().await else { 32 + println!("\rWARN: error fetching {maintainer_name}"); 33 + continue; 34 + }; 35 + let name = name.login; 36 + if name.to_ascii_lowercase() != github.as_str().unwrap().to_ascii_lowercase() { 37 + println!("\rERR: {maintainer_name} has github = {github}, but username really is '{name}'"); 38 + } 39 + } 40 + 41 + Ok(()) 42 + }