mod cache;
mod error;
mod git;
mod git_cmd;
mod parse;
mod pathdiff;
mod prelude;
mod status;
#[cfg(test)]
mod tests;
use prelude::*;
use std::env::{args, current_dir};
use std::path::PathBuf;
use std::process::{Command, ExitCode, ExitStatus};
fn prefetch(cwd: PathBuf) -> Result<(PathBuf, PathBuf, Aliases)> {
let git_dir = git::dir(&cwd)?;
let git_aliases = git::aliases();
Ok((cwd, git_dir, git_aliases))
}
fn postrun(
mut cmd: Command,
git_cmd: Option<GitCommand>,
git_dir: PathBuf,
) -> Result<ExitStatus> {
use GitCommand as G;
match git_cmd {
Some(v @ G::Status(_)) => status::git_status(cmd, &git_dir, v),
Some(G::Version) => {
let result = cmd.run();
println!("gitnu version {CARGO_PKG_VERSION}");
result
}
_ => cmd.run(),
}
}
fn main_cli(cwd: PathBuf, args: &[String]) -> Result<ExitStatus> {
let (cwd, git_dir, git_aliases) = match prefetch(cwd) {
Ok(v) => v,
Err(_) => {
let mut git = Command::new("git");
git.args(&args[1..]);
return git.status().map_err(Error::from);
}
};
let mut argh = Command::new("git");
argh.current_dir(&cwd);
let cache = Cache::new(&git_dir, &cwd);
let (argh, git_cmd) = parse::parse(&args, git_aliases, cache, argh);
postrun(argh, git_cmd, git_dir)
}
fn main() -> ExitCode {
let cwd = current_dir().unwrap_or_default();
let args = args().collect::<Vec<_>>();
main_cli(cwd, &args).map(|v| v.to_exitcode()).unwrap_or(ExitCode::FAILURE)
}