From da8f008f1a4e342a98cf213adf85128346e469bf Mon Sep 17 00:00:00 2001 From: Robert Garrett Date: Mon, 21 Jul 2025 14:48:30 -0500 Subject: [PATCH] Use current-dir as final fallback repo name It all falls into place! I had been dreading doing this bit, but after updating the usage guide I realized the CLI args should be split, too. Which finally means that I can just glue on the PWD name as a final fallback for the repo name. Try the args, then the config file(s), then PWD. If nothing works, the user is in a world of hurt. Bail out. --- src/lib.rs | 2 ++ src/main.rs | 35 ++++++++++++++++++----------------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 25c0afd..e20b41a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -23,6 +23,8 @@ pub enum Error { Placeholder, // TODO: Enumerate error modes MissingGiteaUrl, // the gitea URL wasn't specified on the CLI, env, or config file. MissingRepoFRQN, // either the owner, repo, or both weren't specified in the loaded PartialConfig + MissingRepoOwner, + MissingRepoName, WrappedConfigErr(config::Error), WrappedReqwestErr(reqwest::Error), MissingAuthToken, diff --git a/src/main.rs b/src/main.rs index 5a5b82a..0193b29 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,8 +12,6 @@ use reqwest::header::ACCEPT; async fn main() -> Result<(), gt_tool::Error> { let args = Args::parse(); - // TODO: Heuristics to guess project path - // See issue #8: https://git.gelvin.dev/robert/gt-tool/issues/8 let project_path = args.project .map(PathBuf::from) @@ -32,21 +30,17 @@ async fn main() -> Result<(), gt_tool::Error> { .gitea_url .or(config.gitea_url) .ok_or(gt_tool::Error::MissingGiteaUrl)?; - // Config files split the repo FQRN into "owner" and "repo" (confusing naming, sorry) - // These must be merged back together and passed along. - let conf_fqrn = config - .owner - .ok_or(gt_tool::Error::MissingRepoFRQN) - .and_then(|mut own| { - let repo = config.repo.ok_or(gt_tool::Error::MissingRepoFRQN)?; - own.push('/'); - own.push_str(&repo); - Ok(own) - }); - let repo_fqrn = args - .repo - .ok_or(gt_tool::Error::MissingRepoFRQN) - .or(conf_fqrn)?; + + let owner = args.owner + .or(config.owner) + .ok_or(gt_tool::Error::MissingRepoOwner)?; + + let repo = args.repo + .or(config.repo) + .or_else(infer_repo) + .ok_or(gt_tool::Error::MissingRepoName)?; + + let repo_fqrn = String::from(format!("{owner}/{repo}")); let mut headers = reqwest::header::HeaderMap::new(); headers.append(ACCEPT, header::HeaderValue::from_static("application/json")); @@ -176,3 +170,10 @@ fn match_release_by_tag(tag: &String, releases: Vec) -> Option } release } + +fn infer_repo() -> Option { + let pwd = std::env::current_dir().ok()?; + let file_name = pwd.file_name()?; + let file_name_string = file_name.to_str()?; + Some(String::from(file_name_string)) +}