summaryrefslogtreecommitdiff
path: root/src/git.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/git.rs')
-rw-r--r--src/git.rs39
1 files changed, 24 insertions, 15 deletions
diff --git a/src/git.rs b/src/git.rs
index 38e99d9..563afa1 100644
--- a/src/git.rs
+++ b/src/git.rs
@@ -1,26 +1,35 @@
use crate::errors::BumperError;
use log::{debug, info};
+use std::path::Path;
use std::process::Command;
-pub fn tag(version: &str) -> Result<(), BumperError> {
- debug!("git tag in {}", std::env::current_dir().unwrap().display());
+pub fn tag<P: AsRef<Path>>(dirname: P, version: &str) -> Result<(), BumperError> {
+ let msg = format!("release version {}", version);
let tag_name = format!("v{}", version);
- info!("Create git tag {}", tag_name);
+ 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> {
+ info!("git {:?} in {}", args, dirname.display());
let output = Command::new("git")
- .arg("tag")
- .arg("-am")
- .arg(format!("release version {}", version))
- .arg(format!("v{}", version))
- .output();
- let output = match output {
- Ok(output) => output,
- Err(err) => {
- return Err(BumperError::GitInvoke(err));
- }
- };
+ .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() {
- return Err(BumperError::git_tag(&output.stderr));
+ 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(())
}