feat: collect env into Config and note planned operations
All checks were successful
Test / test (push) Successful in 3s

This commit is contained in:
Paul Campbell 2024-09-17 19:42:05 +01:00
parent 307e463c87
commit eea2e14fb0
2 changed files with 51 additions and 16 deletions

View file

@ -6,3 +6,4 @@ edition = "2021"
[dependencies]
anyhow = "1.0"
regex = "1.10"
ureq = "2.10"

View file

@ -1,28 +1,62 @@
use std::path::PathBuf;
use anyhow::Context;
use regex::Regex;
struct Config {
workdir: PathBuf,
repo: String,
server: String,
auth_token: Option<String>,
prefix_pattern: Regex,
issue_pattern: Regex,
}
fn main() -> anyhow::Result<()> {
println!("Forgejo TODO Checker!");
let ci_repo = std::env::var("GITHUB_REPOSITORY").context("GITHUB_REPOSITORY")?;
let ci_server_url = std::env::var("GITHUB_SERVER_URL").context("GITHUB_SERVER_URL")?;
let ci_repo_url = format!("{ci_server_url}/{ci_repo}");
let config = Config {
workdir: std::env::var("GITHUB_WORKSPACE")
.context("GITHUB_WORKSPACE")?
.into(),
repo: std::env::var("GITHUB_REPOSITORY").context("GITHUB_REPOSITORY")?,
server: std::env::var("GITHUB_SERVER_URL").context("GITHUB_SERVER_URL")?,
auth_token: std::env::var("REPO_TOKEN").ok(),
prefix_pattern: regex::Regex::new(r"(#|//)\s*(TODO|FIXME)").context("prefix regex")?,
issue_pattern: regex::Regex::new(r"( |)(\(|\(#)(?P<ISSUE_NUMBER>\d+)(\))")
.context("issue regex")?,
};
// optional arg for private repos
let repo_token = std::env::var("REPO_TOKEN").ok();
println!("Repo: {}", config.repo);
println!("Prefix: {}", config.prefix_pattern);
println!("Issues: {}", config.issue_pattern);
// Regex to match a todo or fixme comment
let prefix = regex::Regex::new(r"(#|//)\s*(TODO|FIXME)").context("prefix regex")?;
// Regex to match the rest of the line to find an issue number
let issue =
regex::Regex::new(r"( |)(\(|\(#)(?P<ISSUE_NUMBER>\d+)(\))").context("issue regex")?;
println!("[ci_repo:{ci_repo}][ci_repo_url:{ci_repo_url}][repo_token:{repo_token:?}][prefix:{prefix}][issue:{issue}]");
// TODO: scan files in workdir
// TODO: ignore files listed in .rgignore .ignore or .gitignore
// TODO: scan for malformed TODO and FIXME comments (e.g. no issue number) - add to error list
// TODO: build list of expected open issues with file locations where found
// list files in current directory to get a feel for what we have access to
std::fs::read_dir(".")?
.filter_map(Result::ok)
.map(|e| e.path())
.for_each(|e| println!("{e:?}"));
// std::fs::read_dir(workdir)?
// .filter_map(Result::ok)
// .map(|e| e.path())
// .for_each(|e| println!("{e:?}"));
// Collect open issues:
// let limit = 10;
// let page = 0;
// let api = format!(
// "{ci_server_url}/api/v1/repos/{ci_repo}/issues?state=open&limit=${limit}&page=${page}"
// );
// TODO: add authentication when provided
// let issues = ureq::get(&api).call()?.into_string()?;
// TODO: parse issues to get list of open issue numbers
// TODO: loop over list of expected issues and drop any where they do exist and are open
// TODO: if remaining list is not empty - add all to error list
//
// TODO: if error list is empty - exit okay
// TODO: if error list is not empty - log erros and exit not okay
Ok(())
}