use std::process::ExitCode;
use clap::Args;
use log::{debug, info};
use crate::git::ref_format::validate_revision;
use crate::model::changeset::filter_changeset_paths;
#[derive(Args, Debug, Clone)]
pub struct VerifyArgs {
#[arg(long, default_value = "origin/HEAD")]
pub base: String,
}
impl Default for VerifyArgs {
fn default() -> Self {
Self {
base: "origin/HEAD".to_string(),
}
}
}
pub(crate) async fn cmd_verify(args: &VerifyArgs, env: &crate::Env) -> anyhow::Result<ExitCode> {
let git = env.git();
debug!("Verifying changesets against base ref: {}", args.base);
validate_revision(&args.base)?;
let range = format!("{}..HEAD", args.base);
let names = git
.diff_names(&["--diff-filter=A", &range, "--", ".cursus/"])
.await?;
let changesets: Vec<&str> = filter_changeset_paths(&names);
if changesets.is_empty() {
log::warn!("{}", crate::t!("verify-no-changeset", "base" => &args.base));
return Ok(ExitCode::from(2));
}
log::info!(
"{}",
crate::t!("verify-found-changesets", "count" => changesets.len())
);
for name in &changesets {
info!(" {name}");
}
Ok(ExitCode::SUCCESS)
}