use std::path::Path;
use std::process::Command;
pub fn is_jj_repo(root: &Path) -> bool {
root.join(".jj").is_dir()
}
pub fn resolve_jj_revset(revset: &str, root: &Path) -> Option<String> {
let output = Command::new("jj")
.args(["log", "--no-graph", "-T", "commit_id ++ \"\\n\"", "-r", revset])
.current_dir(root)
.output()
.ok()?;
if !output.status.success() {
return None;
}
let stdout = String::from_utf8_lossy(&output.stdout);
let sha = stdout.lines().next()?.trim().to_string();
if sha.len() == 40 && sha.chars().all(|c| c.is_ascii_hexdigit()) {
Some(sha)
} else {
None
}
}
pub fn maybe_resolve_ref(refspec: &str, root: &Path) -> String {
if !is_jj_repo(root) {
return refspec.to_string();
}
let trimmed = refspec.trim();
if trimmed.len() >= 7
&& trimmed.len() <= 40
&& trimmed.chars().all(|c| c.is_ascii_hexdigit())
{
return refspec.to_string();
}
resolve_jj_revset(refspec, root).unwrap_or_else(|| refspec.to_string())
}