1use std::{env, error::Error, io::{self, Write}};
2
3use tokio::fs;
4
5#[tokio::main]
6async fn main() {
7 real_main().await.unwrap();
8}
9
10async 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}