summaryrefslogtreecommitdiff
path: root/src/git.rs
blob: 061ed6161d082bb1991c53add339d374dc364bf9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use crate::errors::BumperError;
use log::debug;
use std::path::Path;
use std::process::Command;

pub fn tag<P: AsRef<Path>>(dirname: P, tag_name: &str, msg: &str) -> Result<(), BumperError> {
    git(dirname.as_ref(), &["tag", "-am", &msg, &tag_name])?;
    Ok(())
}

pub fn commit<P: AsRef<Path>>(dirname: P, msg: &str) -> Result<(), BumperError> {
    git(dirname.as_ref(), &["commit", "-am", msg])?;
    Ok(())
}

fn git(dirname: &Path, args: &[&str]) -> Result<(), BumperError> {
    debug!("git {:?} in {}", args, dirname.display());
    let output = Command::new("git")
        .args(args)
        .current_dir(dirname)
        .output()
        .map_err(|err| {
            let args = args.iter().map(|s| s.to_string()).collect();
            BumperError::GitInvoke(dirname.to_path_buf(), args, err)
        })?;
    debug!("git exit code was {:?}", output.status.code());
    if !output.status.success() {
        let args = args.iter().map(|s| s.to_string()).collect();
        let stderr = String::from_utf8_lossy(&output.stderr).into_owned();
        return Err(BumperError::Git(dirname.to_path_buf(), args, stderr));
    }
    Ok(())
}