diff options
author | Lars Wirzenius <liw@liw.fi> | 2021-03-28 13:19:02 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2021-03-28 16:26:45 +0300 |
commit | c444c915fc349ee345080aa4d151f9416b5c0ab8 (patch) | |
tree | ea41a40f3e29db50758d1f9d3744b7b78702743b /src | |
parent | 81fa9799b1393f427e4095978285cabbaa809735 (diff) | |
download | bumper-rs-c444c915fc349ee345080aa4d151f9416b5c0ab8.tar.gz |
feat: create git tag for release
Diffstat (limited to 'src')
-rw-r--r-- | src/bin/bumper.rs | 26 | ||||
-rw-r--r-- | src/errors.rs | 15 | ||||
-rw-r--r-- | src/git.rs | 25 | ||||
-rw-r--r-- | src/lib.rs | 3 |
4 files changed, 67 insertions, 2 deletions
diff --git a/src/bin/bumper.rs b/src/bin/bumper.rs index 081ca86..1a2e567 100644 --- a/src/bin/bumper.rs +++ b/src/bin/bumper.rs @@ -1,3 +1,27 @@ +use bumper::errors::BumperError; +use bumper::git; +use log::{error, info}; +use std::process::exit; +use structopt::StructOpt; + fn main() { - std::process::exit(1); + if let Err(err) = bumper() { + error!("{}", err); + exit(1); + } +} + +fn bumper() -> Result<(), BumperError> { + pretty_env_logger::init_custom_env("BUMPER_LOG"); + info!("Bumper starts"); + let opt = Opt::from_args(); + git::tag(&opt.version)?; + info!("Bumper ends OK"); + Ok(()) +} + +#[derive(Debug, StructOpt)] +struct Opt { + #[structopt(help = "version number of new release")] + version: String, } diff --git a/src/errors.rs b/src/errors.rs new file mode 100644 index 0000000..607eecb --- /dev/null +++ b/src/errors.rs @@ -0,0 +1,15 @@ +#[derive(Debug, thiserror::Error)] +pub enum BumperError { + #[error("Failed to run git: {0}")] + GitInvoke(#[source] std::io::Error), + + #[error("Command 'git tag' failed: {0}")] + GitTag(String), +} + +impl BumperError { + pub fn git_tag(stderr: &[u8]) -> Self { + let stderr = String::from_utf8_lossy(stderr).into_owned(); + Self::GitTag(stderr) + } +} diff --git a/src/git.rs b/src/git.rs new file mode 100644 index 0000000..76f6da1 --- /dev/null +++ b/src/git.rs @@ -0,0 +1,25 @@ +use crate::errors::BumperError; +use log::{debug, info}; +use std::process::Command; + +pub fn tag(version: &str) -> Result<(), BumperError> { + let tag_name = format!("v{}", version); + info!("Create git tag {}", tag_name); + 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)); + } + }; + debug!("git exit code was {:?}", output.status.code()); + if !output.status.success() { + return Err(BumperError::git_tag(&output.stderr)); + } + Ok(()) +} @@ -1 +1,2 @@ - +pub mod errors; +pub mod git; |