summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2021-03-28 13:19:02 +0300
committerLars Wirzenius <liw@liw.fi>2021-03-28 16:26:45 +0300
commitc444c915fc349ee345080aa4d151f9416b5c0ab8 (patch)
treeea41a40f3e29db50758d1f9d3744b7b78702743b /src
parent81fa9799b1393f427e4095978285cabbaa809735 (diff)
downloadbumper-rs-c444c915fc349ee345080aa4d151f9416b5c0ab8.tar.gz
feat: create git tag for release
Diffstat (limited to 'src')
-rw-r--r--src/bin/bumper.rs26
-rw-r--r--src/errors.rs15
-rw-r--r--src/git.rs25
-rw-r--r--src/lib.rs3
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(())
+}
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;