summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2021-04-22 08:27:04 +0300
committerLars Wirzenius <liw@liw.fi>2021-04-22 08:40:49 +0300
commit24574aef2299925c10eeb9d20a942f36d1d806d4 (patch)
treee05affad9e645047bddee6a93ca69e11445f50fa
parent3f68ce4a8e9b295a4b9fc288174f166e229da8b0 (diff)
downloadbumper-rs-24574aef2299925c10eeb9d20a942f36d1d806d4.tar.gz
feat: use project's name in git tag template
-rw-r--r--bumper.md11
-rw-r--r--src/bin/bumper.rs11
-rw-r--r--src/debian.rs18
-rw-r--r--src/errors.rs12
-rw-r--r--src/project.rs8
-rw-r--r--src/python.rs22
-rw-r--r--src/rust.rs4
-rw-r--r--subplot/bumper.py4
-rw-r--r--subplot/bumper.yaml3
9 files changed, 89 insertions, 4 deletions
diff --git a/bumper.md b/bumper.md
index 9472b73..d00c08c 100644
--- a/bumper.md
+++ b/bumper.md
@@ -146,7 +146,8 @@ release for a Python project.
~~~scenario
given an installed Bumper
-given file foo/setup.py from empty
+given file foo/setup.py from setup.py
+given file foo/setup.py is executable
given file foo/lib/version.py from empty
given all files in foo are committed to git
when I run, in foo, bumper --tag=foo-%v 105.12765.42
@@ -155,6 +156,14 @@ then in foo, git tag foo-105.12765.42 is a signed tag
then file foo/lib/version.py matches regex /__version__\s*=\s*"105\.12765\.42"/
~~~
+~~~{#setup.py .file .python}
+#!/usr/bin/env python3
+from distutils.core import setup
+setup(
+ name="vmdb2",
+)
+~~~
+
---
title: bumper &ndash; set version number for a project
diff --git a/src/bin/bumper.rs b/src/bin/bumper.rs
index fb5194a..9fbf898 100644
--- a/src/bin/bumper.rs
+++ b/src/bin/bumper.rs
@@ -21,7 +21,14 @@ fn bumper() -> Result<(), BumperError> {
let cwd = abspath(".")?;
println!("Setting version for project in {}", cwd.display());
- for mut kind in ProjectKind::detect(&cwd)? {
+
+ let mut kinds = ProjectKind::detect(&cwd)?;
+ if kinds.is_empty() {
+ return Err(BumperError::UnknownProjectKind(cwd));
+ }
+ let name = kinds[0].name()?;
+
+ for kind in kinds.iter_mut() {
let version = kind.set_version(&opt.version)?;
println!("{} project set to {}", kind.desc(), version);
}
@@ -30,7 +37,7 @@ fn bumper() -> Result<(), BumperError> {
git::commit(".", &msg)?;
let tag = Tag::new(&opt.tag)?;
- let tag = tag.apply("", &opt.version);
+ let tag = tag.apply(&name, &opt.version);
println!("release tag: {}", tag);
git::tag(".", &tag, &msg)?;
debug!("Bumper ends OK");
diff --git a/src/debian.rs b/src/debian.rs
index 3f9e01b..15b87ed 100644
--- a/src/debian.rs
+++ b/src/debian.rs
@@ -19,6 +19,24 @@ impl Debian {
Err(BumperError::UnknownProjectKind(dirname.to_path_buf()))
}
+ pub fn name(&self) -> Result<String, BumperError> {
+ let output = Command::new("dpkg-parsechangelog")
+ .arg("-SSource")
+ .current_dir(&self.dirname)
+ .output()
+ .map_err(|err| BumperError::ParseChangelogInvoke(self.dirname.to_path_buf(), err))?;
+ if output.status.success() {
+ let name = String::from_utf8_lossy(&output.stdout).into_owned();
+ Ok(name.trim_end().to_string())
+ } else {
+ let stderr = String::from_utf8_lossy(&output.stderr).into_owned();
+ Err(BumperError::ParseChangelog(
+ self.dirname.to_path_buf(),
+ stderr,
+ ))
+ }
+ }
+
pub fn set_version(&mut self, version: &str) -> Result<String, BumperError> {
let version = format!("{}-1", version);
self.dch(&["-v", &version, ""])?;
diff --git a/src/errors.rs b/src/errors.rs
index 19a758d..a296afd 100644
--- a/src/errors.rs
+++ b/src/errors.rs
@@ -47,6 +47,18 @@ pub enum BumperError {
#[error("dch failed in {0}: {1}")]
Dch(PathBuf, String),
+ #[error("Failed to run dpkg-parsechangelog in {0}: {1}")]
+ ParseChangelogInvoke(PathBuf, #[source] std::io::Error),
+
+ #[error("dpkg-parsechangelog failed in {0}: {1}")]
+ ParseChangelog(PathBuf, String),
+
+ #[error("Failed to run setup.py in {0}: {1}")]
+ Setupnvoke(PathBuf, #[source] std::io::Error),
+
+ #[error("setup.py failed in {0}: {1}")]
+ Setup(PathBuf, String),
+
#[error("Failed to run cargo in {0}: {1}")]
CargoInvoke(PathBuf, #[source] std::io::Error),
diff --git a/src/project.rs b/src/project.rs
index 655fb23..9941ef7 100644
--- a/src/project.rs
+++ b/src/project.rs
@@ -48,6 +48,14 @@ impl ProjectKind {
}
}
+ pub fn name(&mut self) -> Result<String, BumperError> {
+ match self {
+ Self::Debian(x) => x.name(),
+ Self::Python(x) => x.name(),
+ Self::Rust(x) => x.name(),
+ }
+ }
+
pub fn set_version(&mut self, version: &str) -> Result<String, BumperError> {
Ok(match self {
Self::Rust(ref mut rust) => rust.set_version(version)?,
diff --git a/src/python.rs b/src/python.rs
index 4cc043e..28c0aec 100644
--- a/src/python.rs
+++ b/src/python.rs
@@ -2,8 +2,10 @@ use crate::errors::BumperError;
use glob::glob;
use log::{debug, info};
use std::path::{Path, PathBuf};
+use std::process::Command;
pub struct Python {
+ dirname: PathBuf,
version_pys: Vec<PathBuf>,
}
@@ -17,13 +19,31 @@ impl Python {
debug!("no version.py files in {}", dirname.display());
Err(BumperError::NoVersionPy(dirname.to_path_buf()))
} else {
- Ok(Self { version_pys: files })
+ Ok(Self {
+ dirname: dirname.to_path_buf(),
+ version_pys: files,
+ })
}
} else {
Err(BumperError::UnknownProjectKind(dirname.to_path_buf()))
}
}
+ pub fn name(&mut self) -> Result<String, BumperError> {
+ let output = Command::new("./setup.py")
+ .arg("--name")
+ .current_dir(&self.dirname)
+ .output()
+ .map_err(|err| BumperError::Setupnvoke(self.dirname.to_path_buf(), err))?;
+ if output.status.success() {
+ let name = String::from_utf8_lossy(&output.stdout).into_owned();
+ Ok(name.trim_end().to_string())
+ } else {
+ let stderr = String::from_utf8_lossy(&output.stderr).into_owned();
+ Err(BumperError::Setup(self.dirname.to_path_buf(), stderr))
+ }
+ }
+
pub fn set_version(&mut self, version: &str) -> Result<String, BumperError> {
for filename in self.version_pys.iter() {
info!("writing Python version to {}", filename.display());
diff --git a/src/rust.rs b/src/rust.rs
index 0ffe8c0..2dbe1f7 100644
--- a/src/rust.rs
+++ b/src/rust.rs
@@ -27,6 +27,10 @@ impl Rust {
Err(BumperError::UnknownProjectKind(dirname.to_path_buf()))
}
+ pub fn name(&mut self) -> Result<String, BumperError> {
+ self.cargo_toml.name()
+ }
+
pub fn set_version(&mut self, version: &str) -> Result<String, BumperError> {
debug!("parsing Cargo.toml from {}", self.dirname.display());
// debug!("Cargo.toml:\n{:#?}", self.cargo_toml);
diff --git a/subplot/bumper.py b/subplot/bumper.py
index 3edad5e..3c2f8fd 100644
--- a/subplot/bumper.py
+++ b/subplot/bumper.py
@@ -11,6 +11,10 @@ def install_bumper(ctx):
runcmd_prepend_to_path(ctx, dirname=os.path.join(srcdir, "target", "debug"))
+def chmod_exec(ctx, filename=None):
+ os.chmod(filename, 0o755)
+
+
def git_init_and_commit_everything(ctx, dirname=None):
runcmd_run = globals()["runcmd_run"]
runcmd_exit_code_is_zero = globals()["runcmd_exit_code_is_zero"]
diff --git a/subplot/bumper.yaml b/subplot/bumper.yaml
index 6109c59..83aae28 100644
--- a/subplot/bumper.yaml
+++ b/subplot/bumper.yaml
@@ -1,6 +1,9 @@
- given: "an installed Bumper"
function: install_bumper
+- given: "file {filename} is executable"
+ function: chmod_exec
+
- given: "all files in {dirname} are committed to git"
function: git_init_and_commit_everything