Make changelog generator strict

Make the changelog generator fail if commits don't contain metadata.

type: changed
pr: https://github.com/casey/intermodal/pull/341
This commit is contained in:
Casey Rodarmor 2020-04-07 20:17:03 -07:00
parent c33446b481
commit 92748f9fd4
No known key found for this signature in database
GPG Key ID: 556186B153EC6FE0
6 changed files with 32 additions and 31 deletions

View File

@ -4,7 +4,8 @@ Changelog
UNRELEASED - 2020-04-08 UNRELEASED - 2020-04-08
----------------------- -----------------------
- :wrench: [`xxxxxxxxxxxx`](https://github.com/casey/intermodal/commits/master) Generate changelog from git history ([#337](https://github.com/casey/intermodal/pull/337)) - Fixes [#336](https://github.com/casey/intermodal/issues/336) - _Casey Rodarmor <casey@rodarmor.com>_ - :zap: [`xxxxxxxxxxxx`](https://github.com/casey/intermodal/commits/master) Make changelog generator strict ([#341](https://github.com/casey/intermodal/pull/341)) - _Casey Rodarmor <casey@rodarmor.com>_
- :wrench: [`c33446b48135`](https://github.com/casey/intermodal/commit/c33446b481351009fc16335cbcd66ff2c2b7985e) Generate changelog from git history ([#337](https://github.com/casey/intermodal/pull/337)) - Fixes [#336](https://github.com/casey/intermodal/issues/336) - _Casey Rodarmor <casey@rodarmor.com>_
- :art: [`6edab1fa3fa8`](https://github.com/casey/intermodal/commit/6edab1fa3fa8461ac4ca02466a04b0f14e42dfc0) Use `TestEnv::assert_ok` everywhere - Fixes [#330](https://github.com/casey/intermodal/issues/330) - _Casey Rodarmor <casey@rodarmor.com>_ - :art: [`6edab1fa3fa8`](https://github.com/casey/intermodal/commit/6edab1fa3fa8461ac4ca02466a04b0f14e42dfc0) Use `TestEnv::assert_ok` everywhere - Fixes [#330](https://github.com/casey/intermodal/issues/330) - _Casey Rodarmor <casey@rodarmor.com>_
- :zap: [`8e3f5516aff8`](https://github.com/casey/intermodal/commit/8e3f5516aff8c89289203a2bc1b46505410c5f1f) Use attractive paths in user-facing messages - Fixes [#252](https://github.com/casey/intermodal/issues/252), [#332](https://github.com/casey/intermodal/issues/332) - _Casey Rodarmor <casey@rodarmor.com>_ - :zap: [`8e3f5516aff8`](https://github.com/casey/intermodal/commit/8e3f5516aff8c89289203a2bc1b46505410c5f1f) Use attractive paths in user-facing messages - Fixes [#252](https://github.com/casey/intermodal/issues/252), [#332](https://github.com/casey/intermodal/issues/332) - _Casey Rodarmor <casey@rodarmor.com>_
- :bug: [`1cfc0214536c`](https://github.com/casey/intermodal/commit/1cfc0214536c607fff7c29d9e878cbcd7f3a9ffc) Forbid empty input, output, and path targets - _Casey Rodarmor <casey@rodarmor.com>_ - :bug: [`1cfc0214536c`](https://github.com/casey/intermodal/commit/1cfc0214536c607fff7c29d9e878cbcd7f3a9ffc) Forbid empty input, output, and path targets - _Casey Rodarmor <casey@rodarmor.com>_

View File

@ -5,7 +5,7 @@ pub(crate) use std::{
fs, str, fs, str,
}; };
pub(crate) use anyhow::Error; pub(crate) use anyhow::{anyhow, Error};
pub(crate) use cargo_toml::Manifest; pub(crate) use cargo_toml::Manifest;
pub(crate) use chrono::{DateTime, NaiveDateTime, Utc}; pub(crate) use chrono::{DateTime, NaiveDateTime, Utc};
pub(crate) use fehler::throws; pub(crate) use fehler::throws;

View File

@ -18,7 +18,7 @@ impl Entry {
Utc, Utc,
); );
let metadata = Metadata::from_commit(commit).unwrap_or_default(); let metadata = Metadata::from_commit(commit)?;
Entry { Entry {
version: version.into(), version: version.into(),

View File

@ -1,7 +1,3 @@
// TODO:
// - parse URL in fixed:
// - figure out how to check labels before merge
use crate::common::*; use crate::common::*;
mod changelog; mod changelog;

View File

@ -2,8 +2,8 @@ use crate::common::*;
#[derive(Deserialize, Serialize)] #[derive(Deserialize, Serialize)]
pub(crate) struct Metadata { pub(crate) struct Metadata {
#[serde(default, rename = "type")] #[serde(rename = "type")]
pub(crate) kind: Option<Kind>, pub(crate) kind: Kind,
#[serde(default)] #[serde(default)]
pub(crate) pr: Option<Url>, pub(crate) pr: Option<Url>,
#[serde(default)] #[serde(default)]
@ -11,37 +11,35 @@ pub(crate) struct Metadata {
} }
impl Metadata { impl Metadata {
#[throws(as Option)] #[throws]
pub(crate) fn from_commit(commit: &Commit) -> Metadata { pub(crate) fn from_commit(commit: &Commit) -> Metadata {
const BLANK: &str = "\n\n"; const BLANK: &str = "\n\n";
let message = String::from_utf8_lossy(commit.message_bytes()); let message = String::from_utf8_lossy(commit.message_bytes());
let blank = message.rfind(BLANK)?; let blank = message
.rfind(BLANK)
.ok_or_else(|| anyhow!("Commit message missing metadata: {}", message))?;
let yaml = &message[blank + BLANK.len()..]; let yaml = &message[blank + BLANK.len()..];
let metadata = serde_yaml::from_str(yaml).ok()?; let metadata = serde_yaml::from_str(yaml)?;
metadata metadata
} }
pub(crate) fn emoji(&self) -> &'static str { pub(crate) fn emoji(&self) -> &'static str {
if let Some(kind) = self.kind { match self.kind {
match kind { Kind::Added => ":sparkles:",
Kind::Added => ":sparkles:", Kind::Breaking => ":boom:",
Kind::Breaking => ":boom:", Kind::Changed => ":zap:",
Kind::Changed => ":zap:", Kind::Development => ":wrench:",
Kind::Development => ":wrench:", Kind::Distribution => ":package:",
Kind::Distribution => ":package:", Kind::Documentation => ":books:",
Kind::Documentation => ":books:", Kind::Fixed => ":bug:",
Kind::Fixed => ":bug:", Kind::Reform => ":art:",
Kind::Reform => ":art:", Kind::Release => ":bookmark:",
Kind::Release => ":bookmark:", Kind::Testing => ":white_check_mark:",
Kind::Testing => ":white_check_mark:",
}
} else {
":construction:"
} }
} }
} }
@ -49,7 +47,7 @@ impl Metadata {
impl Default for Metadata { impl Default for Metadata {
fn default() -> Metadata { fn default() -> Metadata {
Metadata { Metadata {
kind: None, kind: Kind::Changed,
pr: None, pr: None,
fixes: Vec::new(), fixes: Vec::new(),
} }

View File

@ -24,7 +24,7 @@ push: check
git push github git push github
# clean up feature branch BRANCH # clean up feature branch BRANCH
done BRANCH=`git rev-parse --abbrev-ref HEAD`: done BRANCH=`git rev-parse --abbrev-ref HEAD`: check
git diff --no-ext-diff --quiet --exit-code git diff --no-ext-diff --quiet --exit-code
git push github {{BRANCH}}:master git push github {{BRANCH}}:master
git checkout master git checkout master
@ -86,16 +86,19 @@ check-man: man
check-minimal-versions: check-minimal-versions:
./bin/check-minimal-versions ./bin/check-minimal-versions
check: test clippy lint check-minimal-versions check: test clippy lint check-minimal-versions changelog
git diff --no-ext-diff --quiet --exit-code git diff --no-ext-diff --quiet --exit-code
cargo +nightly fmt --all -- --check cargo +nightly fmt --all -- --check
cargo run --package update-readme toc cargo run --package update-readme toc
git diff --no-ext-diff --quiet --exit-code git diff --no-ext-diff --quiet --exit-code
draft: push
hub pull-request -o --draft
pr: push pr: push
hub pull-request -o hub pull-request -o
merge: merge: check
#!/usr/bin/env bash #!/usr/bin/env bash
set -euxo pipefail set -euxo pipefail
while ! hub ci-status --verbose; do while ! hub ci-status --verbose; do
@ -113,6 +116,9 @@ publish: publish-check
git push github {{version}} git push github {{version}}
cargo publish cargo publish
changelog:
cargo run --package changelog update
# record demo animation # record demo animation
record: record:
#!/usr/bin/env bash #!/usr/bin/env bash