From c444c915fc349ee345080aa4d151f9416b5c0ab8 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sun, 28 Mar 2021 13:19:02 +0300 Subject: feat: create git tag for release --- src/bin/bumper.rs | 26 +++++++++++++++++++++++++- src/errors.rs | 15 +++++++++++++++ src/git.rs | 25 +++++++++++++++++++++++++ src/lib.rs | 3 ++- 4 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 src/errors.rs create mode 100644 src/git.rs (limited to 'src') 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(()) +} diff --git a/src/lib.rs b/src/lib.rs index 8b13789..7d4548a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1 +1,2 @@ - +pub mod errors; +pub mod git; -- cgit v1.2.1