Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add new subcommands to changelogger for supporting file-per-change changelog #3771

Merged
merged 11 commits into from
Jul 31, 2024
Merged
Empty file added .changelog/.keep
Empty file.
35 changes: 33 additions & 2 deletions tools/ci-build/changelogger/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions tools/ci-build/changelogger/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,13 @@ opt-level = 0
[dependencies]
anyhow = "1.0.57"
clap = { version = "~3.2.1", features = ["derive"] }
edit = "0.1"
fastrand = "2.1.0"
once_cell = "1.15.0"
ordinal = "0.3.2"
serde = { version = "1", features = ["derive"]}
serde_json = "1"
serde_yaml = "0.9"
smithy-rs-tool-common = { path = "../smithy-rs-tool-common" }
time = { version = "0.3.9", features = ["local-offset"]}
toml = "0.5.8"
Expand Down
14 changes: 14 additions & 0 deletions tools/ci-build/changelogger/src/entry.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ use clap::clap_derive::ArgEnum;
use smithy_rs_tool_common::changelog::{Changelog, HandAuthoredEntry, SdkModelEntry};
use smithy_rs_tool_common::git::Git;
use smithy_rs_tool_common::versions_manifest::VersionsManifest;
use std::fmt::{Display, Formatter};
use std::path::Path;

#[derive(ArgEnum, Copy, Clone, Debug, Eq, PartialEq)]
Expand All @@ -16,6 +17,19 @@ pub enum ChangeSet {
AwsSdk,
}

impl Display for ChangeSet {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
ChangeSet::SmithyRs => "smithy-rs",
ChangeSet::AwsSdk => "aws-sdk-rust",
}
)
}
}

pub struct ChangelogEntries {
pub aws_sdk_rust: Vec<ChangelogEntry>,
pub smithy_rs: Vec<ChangelogEntry>,
Expand Down
2 changes: 2 additions & 0 deletions tools/ci-build/changelogger/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,7 @@

pub mod entry;
pub mod init;
pub mod ls;
pub mod new;
pub mod render;
pub mod split;
50 changes: 50 additions & 0 deletions tools/ci-build/changelogger/src/ls.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/

use crate::entry::{ChangeSet, ChangelogEntries};
use crate::render::render;
use anyhow::Context;
use clap::Parser;
use smithy_rs_tool_common::changelog::{ChangelogLoader, ValidationSet};
use smithy_rs_tool_common::git::find_git_repository_root;
use smithy_rs_tool_common::here;
use smithy_rs_tool_common::versions_manifest::CrateVersionMetadataMap;

#[derive(Parser, Debug, Eq, PartialEq)]
pub struct LsArgs {
/// Which set of changes to preview
#[clap(long, short, action)]
pub change_set: ChangeSet,
}

pub fn subcommand_ls(args: LsArgs) -> anyhow::Result<()> {
let mut dot_changelog = find_git_repository_root("smithy-rs", ".").context(here!())?;
dot_changelog.push(".changelog");

let loader = ChangelogLoader::default();
let changelog = loader.load_from_dir(dot_changelog.clone())?;

changelog.validate(ValidationSet::Render).map_err(|errs| {
anyhow::Error::msg(format!(
"failed to load {dot_changelog:?}: {errors}",
errors = errs.join("\n")
))
})?;

let entries = ChangelogEntries::from(changelog);

let (release_header, release_notes) = render(
match args.change_set {
ChangeSet::SmithyRs => &entries.smithy_rs,
ChangeSet::AwsSdk => &entries.aws_sdk_rust,
},
CrateVersionMetadataMap::new(),
&format!("\nNext changelog preview for {}", args.change_set),
);

println!("{release_header}{release_notes}");

Ok(())
}
74 changes: 68 additions & 6 deletions tools/ci-build/changelogger/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,37 +5,49 @@

use anyhow::Result;
use changelogger::init::subcommand_init;
use changelogger::ls::subcommand_ls;
use changelogger::new::subcommand_new;
use changelogger::render::subcommand_render;
use changelogger::split::subcommand_split;
use clap::Parser;

#[derive(Parser, Debug, Eq, PartialEq)]
#[clap(name = "changelogger", author, version, about)]
pub enum Args {
/// Split SDK changelog entries into a separate file
Split(changelogger::split::SplitArgs),
/// Print to stdout the empty "next" CHANGELOG template
Init(changelogger::init::InitArgs),
/// Create a new changelog entry Markdown file in the `smithy-rs/.changelog` directory
New(changelogger::new::NewArgs),
/// Render a preview of changelog entries since the last release
Ls(changelogger::ls::LsArgs),
/// Render a TOML/JSON changelog into GitHub-flavored Markdown
Render(changelogger::render::RenderArgs),
/// Print to stdout the empty "next" CHANGELOG template.
Init(changelogger::init::InitArgs),
/// Split SDK changelog entries into a separate file
Split(changelogger::split::SplitArgs),
}

fn main() -> Result<()> {
match Args::parse() {
Args::Split(split) => subcommand_split(&split),
Args::Render(render) => subcommand_render(&render),
Args::Init(init) => subcommand_init(&init),
Args::New(new) => subcommand_new(new),
Args::Ls(ls) => subcommand_ls(ls),
Args::Render(render) => subcommand_render(&render),
Args::Split(split) => subcommand_split(&split),
}
}

#[cfg(test)]
mod tests {
use super::Args;
use changelogger::entry::ChangeSet;
use changelogger::ls::LsArgs;
use changelogger::new::NewArgs;
use changelogger::render::RenderArgs;
use changelogger::split::SplitArgs;
use clap::Parser;
use smithy_rs_tool_common::changelog::{Reference, Target};
use std::path::PathBuf;
use std::str::FromStr;

#[test]
fn args_parsing() {
Expand Down Expand Up @@ -188,5 +200,55 @@ mod tests {
])
.unwrap()
);

assert_eq!(
Args::New(NewArgs {
applies_to: Some(vec![Target::Client, Target::AwsSdk]),
authors: Some(vec!["external-contrib".to_owned(), "ysaito1001".to_owned()]),
references: Some(vec![
Reference::from_str("smithy-rs#1234").unwrap(),
Reference::from_str("aws-sdk-rust#5678").unwrap()
]),
breaking: false,
new_feature: true,
bug_fix: false,
message: Some("Implement a long-awaited feature for S3".to_owned()),
basename: None,
}),
Args::try_parse_from([
"./changelogger",
"new",
"--applies-to",
"client",
"--applies-to",
"aws-sdk-rust",
"--authors",
"external-contrib",
"--authors",
"ysaito1001",
"--references",
"smithy-rs#1234",
"--references",
"aws-sdk-rust#5678",
"--new-feature",
"--message",
"Implement a long-awaited feature for S3",
])
.unwrap()
);

assert_eq!(
Args::Ls(LsArgs {
change_set: ChangeSet::SmithyRs
}),
Args::try_parse_from(["./changelogger", "ls", "--change-set", "smithy-rs",]).unwrap()
);

assert_eq!(
Args::Ls(LsArgs {
change_set: ChangeSet::AwsSdk
}),
Args::try_parse_from(["./changelogger", "ls", "--change-set", "aws-sdk",]).unwrap()
);
}
}
Loading
Loading