//! `tree-sha [repo]` — print the tree SHA of the commit at a //! branch name or commit SHA. use anyhow::Result; use clap::Args as ClapArgs; use serde_json::Value; use crate::client::Client; #[derive(ClapArgs)] pub struct Args { /// Branch name or commit SHA. reference: String, } pub fn run(client: &Client, args: Args) -> Result<()> { let repo = client.repo(); // Try branch first; the bash helper silently treats failure as // "not a branch, use the reference as a commit sha directly". let commit_sha = match client.get_json(&format!("/repos/{repo}/branches/{}", args.reference)) { Ok(v) => v .get("commit") .and_then(|c| c.get("id")) .and_then(Value::as_str) .unwrap_or(&args.reference) .to_owned(), Err(_) => args.reference.clone(), }; let commit = client.get_json(&format!("/repos/{repo}/git/commits/{commit_sha}"))?; let sha = commit .get("tree") .and_then(|t| t.get("sha")) .and_then(Value::as_str) .or_else(|| commit.get("sha").and_then(Value::as_str)) .unwrap_or(""); println!("{sha}"); Ok(()) }