use anyhow::{bail, Context, Result};
use std::path::{Path, PathBuf};
use std::process::Command;
pub fn sign_sidecar(
manifest: &Path,
out_dir: &Path,
name: &str,
version: &str,
gpg_key: &str,
) -> Result<PathBuf> {
let sig_name = format!("node-app-{}_{}.manifest.json.sig", name, version);
let sig_path = out_dir.join(&sig_name);
let _ = std::fs::remove_file(&sig_path);
println!("→ gpg --detach-sign (key {})", gpg_key);
let status = Command::new("gpg")
.args([
"--batch",
"--yes",
"--quiet",
"--default-key",
gpg_key,
"--detach-sign",
"--output",
])
.arg(&sig_path)
.arg(manifest)
.status()
.with_context(|| {
"failed to run `gpg` — is GPG installed? \
(On macOS: `brew install gnupg`.)"
})?;
if !status.success() {
bail!("`gpg --detach-sign` failed (exit: {})", status);
}
if !sig_path.exists() {
bail!(
"gpg reported success but the sidecar signature was not written: {}",
sig_path.display()
);
}
Ok(sig_path)
}