rlls 0.0.32

Cut a version, tag it, and publish a GitHub Release with raw git notes
use anyhow::{anyhow, Result};
use std::process::{Command as StdCommand, Stdio};

pub async fn run_capture_async(
    cmd: &str,
    args: &[&str],
) -> Result<String> {
    let output = tokio::process::Command::new(cmd)
        .args(args)
        .output()
        .await?;
    if !output.status.success() {
        let err = String::from_utf8_lossy(&output.stderr);
        return Err(anyhow!(
            "{} {:?} failed: {}",
            cmd,
            args,
            err.trim()
        ));
    }
    Ok(String::from_utf8_lossy(&output.stdout).trim().to_string())
}

pub async fn run_quiet_async(
    cmd: &str,
    args: &[&str],
    _label: &str,
) -> Result<()> {
    let status = tokio::process::Command::new(cmd)
        .args(args)
        .stdout(Stdio::null())
        .stderr(Stdio::inherit())
        .status()
        .await?;
    if !status.success() {
        return Err(anyhow!("{} {:?} failed", cmd, args));
    }
    Ok(())
}

pub async fn run_status_async(cmd: &str, args: &[&str]) -> bool {
    tokio::process::Command::new(cmd)
        .args(args)
        .status()
        .await
        .map(|s| s.success())
        .unwrap_or(false)
}

pub fn run_capture(cmd: &str, args: &[&str]) -> Result<String> {
    let output = StdCommand::new(cmd).args(args).output()?;
    if !output.status.success() {
        let err = String::from_utf8_lossy(&output.stderr);
        return Err(anyhow!(
            "{} {:?} failed: {}",
            cmd,
            args,
            err.trim()
        ));
    }
    Ok(String::from_utf8_lossy(&output.stdout).trim().to_string())
}

pub fn run_quiet(
    cmd: &str,
    args: &[&str],
    _label: &str,
) -> Result<()> {
    let status = StdCommand::new(cmd)
        .args(args)
        .stdout(Stdio::null())
        .stderr(Stdio::inherit())
        .status()?;
    if !status.success() {
        return Err(anyhow!("{} {:?} failed", cmd, args));
    }
    Ok(())
}

pub fn run_status(cmd: &str, args: &[&str]) -> bool {
    StdCommand::new(cmd)
        .args(args)
        .status()
        .map(|s| s.success())
        .unwrap_or(false)
}