Skip to content

Commit

Permalink
refactor: more idiomatic rust code
Browse files Browse the repository at this point in the history
  • Loading branch information
coenraadhuman committed Jun 20, 2024
1 parent 9eb2588 commit 3b532d6
Show file tree
Hide file tree
Showing 9 changed files with 369 additions and 294 deletions.
21 changes: 15 additions & 6 deletions .github/workflows/publish-binary.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ env:
RUST_BACKTRACE: 1

jobs:
test:
build:
name: ${{ matrix.platform.os_name }} with Rust ${{ matrix.toolchain }} on target ${{ matrix.platform.target }}
runs-on: ${{ matrix.platform.os }}
strategy:
Expand Down Expand Up @@ -174,10 +174,19 @@ jobs:
with:
key: "v2"

- name: Configure Git
run: |
git config --global user.email "jdoe@example.com"
git config --global user.name "J. Doe"
- name: Generate New Release Ghangelog
uses: addnab/docker-run-action@v3
with:
image: ghcr.io/coenraadhuman/gib:latest
shell: /bin/bash
options: -v ${{ github.workspace }}:/app
run : |
echo "=================="
echo "Generate Changelog"
echo "=================="
gib changelog -p /app > RELEASE_CHANGELOG.md
echo "Updated CHANGELOG.md"
- name: Install musl-tools on Linux
run: sudo apt-get update --yes && sudo apt-get install --yes musl-tools
Expand Down Expand Up @@ -234,4 +243,4 @@ jobs:
with:
draft: true
files: "gib*"
body_path: CHANGELOG.md
body_path: RELEASE_CHANGELOG.md
6 changes: 5 additions & 1 deletion src/args.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,5 +50,9 @@ pub enum Commands {
/// Scope regex filter; provide mechanism for generating a changelog for a specific project within a monorepo based of a regular expression
#[arg(short, long, value_name = "SCOPE_REGEX_FILTER")]
scope_filter: Option<String>,

/// Specify whether changelog generated is for latest tag
#[arg(short, long)]
release: bool
}
}
}
197 changes: 135 additions & 62 deletions src/commands/changelog.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,12 @@ use crate::semantic::{add_commit_to_version, Version};

// Todo: find a nice template engine for Rust to create the changelog document:
// Todo: use map for tag associated with commits on current branch:
pub fn run(path: Option<String>, commit_git_hook: Option<String>, scope_filter: Option<String>) {
pub fn run(
path: Option<String>,
commit_git_hook: Option<String>,
scope_filter: Option<String>,
_release: bool,
) {
let commits = retrieve_branch_commits(path.clone());
let optional_oid_commit_tag_map = retrieve_commit_tag_map(path);

Expand All @@ -19,80 +24,148 @@ pub fn run(path: Option<String>, commit_git_hook: Option<String>, scope_filter:
simple_changelog.insert_str(0, " </tbody>\n");

for commit in commits.iter().rev() {
match commit.message {
Some(ref message) => {
version = add_commit_to_version(&version, create_conventional_commit(message), scope_filter.clone());
if let Some(ref message) = commit.message {
version = add_commit_to_version(
&version,
create_conventional_commit(message),
scope_filter.clone(),
);

match create_conventional_commit(message) {
Some(conventional_commit) => {
if scope_filter_check(scope_filter.clone(), conventional_commit.scope) {
// Add commit to log:
simple_changelog.insert_str(0, " </tr>\n");
simple_changelog.insert_str(0, &format!(" <td>{}</td>\n", commit.committer.to_changelog_string()));
simple_changelog.insert_str(0, &format!(" <td>{}</td>\n", commit.author.to_changelog_string()));
simple_changelog.insert_str(0, &format!(" <td>{}</td>\n", if conventional_commit.is_deprecrated { 'X' } else { ' ' }));
simple_changelog.insert_str(0, &format!(" <td>{}</td>\n", if conventional_commit.is_breaking { 'X' } else { ' ' }));
simple_changelog.insert_str(0, &format!(" <td>{}.</td>\n", conventional_commit.commit_description.to_sentence_case()));
simple_changelog.insert_str(0, &format!(" <td>{}</td>\n", conventional_commit.commit_type));
simple_changelog.insert_str(0, &format!(" <td>{}</td>\n", version.format()));
simple_changelog.insert_str(0, " <tr>\n");
if let Some(conventional_commit) = create_conventional_commit(message) {
if scope_filter_check(scope_filter.clone(), conventional_commit.scope) {
// Add commit to log:
simple_changelog.insert_str(0, " </tr>\n");
simple_changelog.insert_str(
0,
&format!(
" <td>{}</td>\n",
commit.committer.to_changelog_string()
),
);
simple_changelog.insert_str(
0,
&format!(" <td>{}</td>\n", commit.author.to_changelog_string()),
);
simple_changelog.insert_str(
0,
&format!(
" <td>{}</td>\n",
if conventional_commit.is_deprecrated {
'X'
} else {
' '
}
),
);
simple_changelog.insert_str(
0,
&format!(
" <td>{}</td>\n",
if conventional_commit.is_breaking {
'X'
} else {
' '
}
),
);
simple_changelog.insert_str(
0,
&format!(
" <td>{}.</td>\n",
conventional_commit.commit_description.to_sentence_case()
),
);
simple_changelog.insert_str(
0,
&format!(" <td>{}</td>\n", conventional_commit.commit_type),
);
simple_changelog
.insert_str(0, &format!(" <td>{}</td>\n", version.format()));
simple_changelog.insert_str(0, " <tr>\n");

match optional_oid_commit_tag_map {
Some(ref map) => {
// Add release entry to log:
match map.get(&commit.oid) {
Some(found_tag) => {
simple_changelog.insert_str(0, " </tr>\n");
simple_changelog.insert_str(0, &format!(" <td colspan=\"7\"><em><strong>Release: {}</strong></em></td>\n", found_tag));
simple_changelog.insert_str(0, " <tr>\n");
unreleased_count = 0;
},
// No release associated with commit, add to counter to determine no release header:
None => unreleased_count = unreleased_count + 1,
}
},
match optional_oid_commit_tag_map {
Some(ref map) => {
// Add release entry to log:
match map.get(&commit.oid) {
Some(found_tag) => {
simple_changelog.insert_str(0, " </tr>\n");
simple_changelog.insert_str(0, &format!(" <td colspan=\"7\"><em><strong>Release: {}</strong></em></td>\n", found_tag));
simple_changelog.insert_str(0, " <tr>\n");
unreleased_count = 0;
}
// No release associated with commit, add to counter to determine no release header:
None => unreleased_count = unreleased_count + 1,
};
None => unreleased_count += 1,
}
}
},
None => {},
// No release associated with commit, add to counter to determine no release header:
None => unreleased_count += 1,
};
}
},
None => {},
}
}
}

match commit_git_hook {
Some(ref user_commit) => {
match create_conventional_commit(user_commit) {
Some(user_conventional_commit) => {
version = add_commit_to_version(&version, create_conventional_commit(user_commit), scope_filter.clone());
if let Some(ref user_commit) = commit_git_hook {
if let Some(user_conventional_commit) = create_conventional_commit(user_commit) {
version = add_commit_to_version(
&version,
create_conventional_commit(user_commit),
scope_filter.clone(),
);

// Add commit to log:
simple_changelog.insert_str(0, " </tr>\n");
simple_changelog.insert_str(0, &format!(" <td>{}</td>\n", "Unknown"));
simple_changelog.insert_str(0, &format!(" <td>{}</td>\n", "Unknown"));
simple_changelog.insert_str(0, &format!(" <td>{}</td>\n", if user_conventional_commit.is_deprecrated { 'X' } else { ' ' }));
simple_changelog.insert_str(0, &format!(" <td>{}</td>\n", if user_conventional_commit.is_breaking { 'X' } else { ' ' }));
simple_changelog.insert_str(0, &format!(" <td>{}.</td>\n", user_conventional_commit.commit_description.to_sentence_case()));
simple_changelog.insert_str(0, &format!(" <td>{}</td>\n", user_conventional_commit.commit_type));
simple_changelog.insert_str(0, &format!(" <td>{}</td>\n", version.format()));
simple_changelog.insert_str(0, " <tr>\n");
// Add commit to log:
simple_changelog.insert_str(0, " </tr>\n");
simple_changelog.insert_str(0, &format!(" <td>{}</td>\n", "Unknown"));
simple_changelog.insert_str(0, &format!(" <td>{}</td>\n", "Unknown"));
simple_changelog.insert_str(
0,
&format!(
" <td>{}</td>\n",
if user_conventional_commit.is_deprecrated {
'X'
} else {
' '
}
),
);
simple_changelog.insert_str(
0,
&format!(
" <td>{}</td>\n",
if user_conventional_commit.is_breaking {
'X'
} else {
' '
}
),
);
simple_changelog.insert_str(
0,
&format!(
" <td>{}.</td>\n",
user_conventional_commit
.commit_description
.to_sentence_case()
),
);
simple_changelog.insert_str(
0,
&format!(" <td>{}</td>\n", user_conventional_commit.commit_type),
);
simple_changelog.insert_str(0, &format!(" <td>{}</td>\n", version.format()));
simple_changelog.insert_str(0, " <tr>\n");

// Will always be unreleased:
unreleased_count = unreleased_count + 1;
},
// Commit invalid ignore:
None => {},
}
},
None => {},
// Will always be unreleased:
unreleased_count += 1;
}
}

if unreleased_count != 0 {
simple_changelog.insert_str(0, " </tr>\n");
simple_changelog.insert_str(0, " <td colspan=\"7\"><em><strong>Unreleased</strong></em>\n");
simple_changelog.insert_str(
0,
" <td colspan=\"7\"><em><strong>Unreleased</strong></em>\n",
);
simple_changelog.insert_str(0, " <tr>\n");
}

Expand All @@ -112,4 +185,4 @@ pub fn run(path: Option<String>, commit_git_hook: Option<String>, scope_filter:
simple_changelog.insert_str(0, "# Changelog\n\n");

print!("{}", simple_changelog);
}
}
48 changes: 30 additions & 18 deletions src/commands/version.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,19 @@
use crate::conventional::create_conventional_commit;
use crate::git::{retrieve_branch_commits, Commit};
use crate::semantic::{add_commit_to_version, add_impact_to_version, Version, Impact};

pub fn run(path: Option<String>, major:bool, minor: bool, patch: bool, commit_git_hook: Option<String>, scope_filter: Option<String>) {
let flag_count: u8 = vec![major, minor, patch].into_iter().map(|flag| if flag { 1 } else { 0 }).sum();
use crate::semantic::{add_commit_to_version, add_impact_to_version, Impact, Version};

pub fn run(
path: Option<String>,
major: bool,
minor: bool,
patch: bool,
commit_git_hook: Option<String>,
scope_filter: Option<String>,
) {
let flag_count: u8 = vec![major, minor, patch]
.into_iter()
.map(|flag| if flag { 1 } else { 0 })
.sum();

if flag_count > 1 {
panic!("Only one of the following flags major, minor or patch are allowed at a time")
Expand All @@ -14,32 +24,34 @@ pub fn run(path: Option<String>, major:bool, minor: bool, patch: bool, commit_gi
let mut version = Version::new(0, 0, 0);

for commit in commits.iter().rev() {
match commit.message {
Some(ref message) => {
version = add_commit_to_version(&version, create_conventional_commit(message), scope_filter.clone())
},
None => {},
if let Some(ref message) = commit.message {
version = add_commit_to_version(
&version,
create_conventional_commit(message),
scope_filter.clone(),
)
}
}

match commit_git_hook {
Some(message) => {
version = add_commit_to_version(&version, create_conventional_commit(message.as_str()), scope_filter.clone())
},
None => {},
if let Some(message) = commit_git_hook {
version = add_commit_to_version(
&version,
create_conventional_commit(message.as_str()),
scope_filter.clone(),
)
}

if major {
version = add_impact_to_version(&version, Impact::MAJOR);
version = add_impact_to_version(&version, Impact::Major);
}

if minor {
version = add_impact_to_version(&version, Impact::MINOR);
version = add_impact_to_version(&version, Impact::Minor);
}

if patch {
version = add_impact_to_version(&version, Impact::PATCH);
version = add_impact_to_version(&version, Impact::Patch);
}

version.print();
}
}
Loading

0 comments on commit 3b532d6

Please sign in to comment.