/// the signer touches `signed` and exits 1, which is how a leaked read shows up.
pub fn signing_home(dir: &std::path::Path) -> (std::path::PathBuf, std::path::PathBuf) {
use std::os::unix::fs::PermissionsExt as _;
let home = dir.join("home");
let signed = dir.join("signed");
let signer = dir.join("signer");
std::fs::create_dir_all(&home).unwrap();
std::fs::write(
&signer,
format!("#!/bin/sh\ntouch '{}'\nexit 1\n", signed.display()),
)
.unwrap();
std::fs::set_permissions(&signer, std::fs::Permissions::from_mode(0o755)).unwrap();
std::fs::write(
home.join(".gitconfig"),
format!(
"[commit]\n\tgpgsign = true\n[gpg]\n\tformat = ssh\n[gpg \"ssh\"]\n\tprogram = {}\n[user]\n\tsigningkey = {}\n",
signer.display(),
dir.join("key").display(),
),
)
.unwrap();
(home, signed)
}