From f0b21ed2b4243b476817f08f58c01e0964467e13 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 22 Mar 2024 01:59:29 +0100 Subject: [PATCH 1/3] chore: add git-cliff --- Justfile | 44 ++++++++++++++++++++++++++ cliff.toml | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 cliff.toml diff --git a/Justfile b/Justfile index 4628423..61ad9db 100644 --- a/Justfile +++ b/Justfile @@ -43,3 +43,47 @@ testfiles: report2yaml: mkdir -p rustypipe_reports/conv for f in rustypipe_reports/*.json; do yq '.http_request.resp_body' $f | yq -o json -P > rustypipe_reports/conv/`basename $f .json`_body.json; yq e -Pi "del(.http_request.resp_body)" $f; mv $f rustypipe_reports/conv/`basename $f .json`.yaml; done; + +release crate="rustypipe": + #!/usr/bin/env bash + set -e + + CRATE="{{crate}}" + INCLUDES='--include-path README.md --include-path LICENSE --include-path Cargo.toml' + CHANGELOG="CHANGELOG.md" + CARGO_TOML="Cargo.toml" + + if [ "$CRATE" = "rustypipe" ]; then + INCLUDES="$INCLUDES --include-path src/** --include-path tests/** --include-path testfiles/**" + else + if [ ! -d "$CRATE" ]; then + echo "$CRATE does not exist."; exit 1 + fi + INCLUDES="$INCLUDES --include-path $CRATE/**" + CHANGELOG="$CRATE/$CHANGELOG" + CARGO_TOML="$CRATE/Cargo.toml" + CRATE="rustypipe-$CRATE" # Add crate name prefix + fi + + VERSION=$(git-cliff $INCLUDES --bumped-version | grep -Po '\d+\.\d+\.\d+$') + echo "Releasing $VERSION:" + + # if [ -n "$(git status --porcelain)" ]; then echo "Workdir must be clean"; exit 1; fi + if git rev-parse "${CRATE}/v${VERSION}" >/dev/null 2>&1; then echo "version tag v${VERSION} already exists"; exit 1; fi + + cargo semver -c "$CARGO_TOML" set "$VERSION" + + CLIFF_ARGS="--tag v${VERSION}" + if [ -f "$CHANGELOG" ]; then + CLIFF_ARGS="$CLIFF_ARGS --unreleased $INCLUDES" + CLIFF_OUT="--prepend $CHANGELOG" + else + CLIFF_OUT="--output $CHANGELOG" + fi + + echo "git-cliff $CLIFF_ARGS $CLIFF_OUT" + eval "git-cliff $CLIFF_ARGS $CLIFF_OUT" + git add "$CHANGELOG" "$CARGO_TOML" + git commit -m "chore(release): release $CRATE v$VERSION" + + eval "git-cliff $CLIFF_ARGS --strip all" | git tag -a -F - --cleanup whitespace "${CRATE}/v${VERSION}" diff --git a/cliff.toml b/cliff.toml new file mode 100644 index 0000000..ee730e3 --- /dev/null +++ b/cliff.toml @@ -0,0 +1,93 @@ +# git-cliff ~ default configuration file +# https://git-cliff.org/docs/configuration +# +# Lines starting with "#" are comments. +# Configuration options are organized into tables and keys. +# See documentation for more information on available options. + +[changelog] +# changelog header +header = """ +# Changelog\n +All notable changes to this project will be documented in this file.\n +""" +# template for the changelog body +# https://keats.github.io/tera/docs/#introduction +body = """ +{% if version %}\ + ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} +{% else %}\ + ## [unreleased] +{% endif %}\ +{% if previous.version %}\ +{% for group, commits in commits | group_by(attribute="group") %} + ### {{ group | striptags | trim | upper_first }} + {% for commit in commits %} + - {% if commit.scope %}*({{ commit.scope }})* {% endif %}\ + {% if commit.breaking %}[**breaking**] {% endif %}\ + {{ commit.message | upper_first }}\ + {% endfor %} +{% endfor %}\ +{% else %} +Initial release +{% endif %}\n +""" +# template for the changelog footer +footer = """ + +""" +# remove the leading and trailing s +trim = true +# postprocessors +postprocessors = [ + # { pattern = '', replace = "https://github.com/orhun/git-cliff" }, # replace repository URL +] + +[git] +# parse the commits based on https://www.conventionalcommits.org +conventional_commits = true +# filter out the commits that are not conventional +filter_unconventional = true +# process each line of a commit as an individual commit +split_commits = false +# regex for preprocessing the commit messages +commit_preprocessors = [ + # Replace issue numbers + #{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))"}, + # Check spelling of the commit with https://github.com/crate-ci/typos + # If the spelling is incorrect, it will be automatically fixed. + #{ pattern = '.*', replace_command = 'typos --write-changes -' }, +] +# regex for parsing and grouping commits +commit_parsers = [ + { message = "^feat", group = "๐Ÿš€ Features" }, + { message = "^fix", group = "๐Ÿ› Bug Fixes" }, + { message = "^doc", group = "๐Ÿ“š Documentation" }, + { message = "^perf", group = "โšก Performance" }, + { message = "^refactor", group = "๐Ÿšœ Refactor" }, + { message = "^style", group = "๐ŸŽจ Styling" }, + { message = "^test", group = "๐Ÿงช Testing" }, + { message = "^chore\\(release\\): prepare for", skip = true }, + { message = "^chore\\(pr\\)", skip = true }, + { message = "^chore\\(pull\\)", skip = true }, + { message = "^chore", group = "โš™๏ธ Miscellaneous Tasks" }, + { message = "^ci", skip = true }, + { body = ".*security", group = "๐Ÿ›ก๏ธ Security" }, + { message = "^revert", group = "โ—€๏ธ Revert" }, +] +# protect breaking changes from being skipped due to matching a skipping commit_parser +protect_breaking_commits = false +# filter out the commits that are not matched by commit parsers +filter_commits = false +# regex for matching git tags +# tag_pattern = "v[0-9].*" +# regex for skipping tags +# skip_tags = "" +# regex for ignoring tags +# ignore_tags = "" +# sort the tags topologically +topo_order = false +# sort the commits inside sections by oldest/newest order +sort_commits = "oldest" +# limit the number of commits included in the changelog. +# limit_commits = 42 From c9f86c31f979f3bdbff6be399cd47af749e95719 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 22 Mar 2024 03:09:52 +0100 Subject: [PATCH 2/3] chore: fix git-cliff --- Justfile | 16 ++++++++-------- cliff.toml | 10 ++++++++-- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/Justfile b/Justfile index 61ad9db..c320b58 100644 --- a/Justfile +++ b/Justfile @@ -68,22 +68,22 @@ release crate="rustypipe": VERSION=$(git-cliff $INCLUDES --bumped-version | grep -Po '\d+\.\d+\.\d+$') echo "Releasing $VERSION:" - # if [ -n "$(git status --porcelain)" ]; then echo "Workdir must be clean"; exit 1; fi + if [ -n "$(git status --porcelain)" ]; then echo "Workdir must be clean"; exit 1; fi if git rev-parse "${CRATE}/v${VERSION}" >/dev/null 2>&1; then echo "version tag v${VERSION} already exists"; exit 1; fi cargo semver -c "$CARGO_TOML" set "$VERSION" - CLIFF_ARGS="--tag v${VERSION}" + CLIFF_ARGS="--tag v${VERSION} --unreleased $INCLUDES" + echo "git-cliff $CLIFF_ARGS" if [ -f "$CHANGELOG" ]; then - CLIFF_ARGS="$CLIFF_ARGS --unreleased $INCLUDES" - CLIFF_OUT="--prepend $CHANGELOG" + git-cliff $CLIFF_ARGS --prepend "$CHANGELOG" else - CLIFF_OUT="--output $CHANGELOG" + git-cliff $CLIFF_ARGS --output "$CHANGELOG" fi - echo "git-cliff $CLIFF_ARGS $CLIFF_OUT" - eval "git-cliff $CLIFF_ARGS $CLIFF_OUT" + editor "$CHANGELOG" + git add "$CHANGELOG" "$CARGO_TOML" git commit -m "chore(release): release $CRATE v$VERSION" - eval "git-cliff $CLIFF_ARGS --strip all" | git tag -a -F - --cleanup whitespace "${CRATE}/v${VERSION}" + awk 'BEGIN{RS="(^|\n)## "} NR==2 { print "##",$0 }' "$CHANGELOG" | git tag -a -F - --cleanup whitespace "${CRATE}/v${VERSION}" diff --git a/cliff.toml b/cliff.toml index ee730e3..32b679a 100644 --- a/cliff.toml +++ b/cliff.toml @@ -14,8 +14,13 @@ All notable changes to this project will be documented in this file.\n # template for the changelog body # https://keats.github.io/tera/docs/#introduction body = """ +{% set repo_url = "https://code.thetadev.de/ThetaDev/rustypipe" %}\ {% if version %}\ - ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} + {%if previous.version %}\ + ## [{{ version }}]({{ repo_url }}/compare/{{ previous.version }}..{{ version }})\ + {% else %}\ + ## {{ version }}\ + {% endif %} - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ @@ -25,7 +30,8 @@ body = """ {% for commit in commits %} - {% if commit.scope %}*({{ commit.scope }})* {% endif %}\ {% if commit.breaking %}[**breaking**] {% endif %}\ - {{ commit.message | upper_first }}\ + {{ commit.message | upper_first }} - \ + ([{{ commit.id | truncate(length=7, end="") }}]({{ repo_url }}/commit/{{ commit.id }}))\ {% endfor %} {% endfor %}\ {% else %} From df5e021733afe6c00e74d7d151415a5cdf1aede1 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 22 Mar 2024 14:49:12 +0100 Subject: [PATCH 3/3] ci: add release workflow --- .gitea/workflows/release.yaml | 29 +++++++++++++++++++++++++++++ Cargo.toml | 4 ++++ cli/Cargo.toml | 4 ++-- downloader/Cargo.toml | 2 +- 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 .gitea/workflows/release.yaml diff --git a/.gitea/workflows/release.yaml b/.gitea/workflows/release.yaml new file mode 100644 index 0000000..6ade8ae --- /dev/null +++ b/.gitea/workflows/release.yaml @@ -0,0 +1,29 @@ +name: Release +on: + push: + tags: + - "*/v*.*.*" + +jobs: + Release: + runs-on: cimaster-latest + steps: + - name: ๐Ÿ“ฆ Checkout repository + uses: actions/checkout@v3 + + - name: Get variables + run: | + echo "CRATE=$(echo '${{ github.ref_name }}' | awk 'BEGIN{RS="/"} NR==1{print}')" >> $GITHUB_ENV + echo "CRATE_VERSION=$(echo '${{ github.ref_name }}' | awk 'BEGIN{RS="/"} NR==2{print}')" >> $GITHUB_ENV + echo "CHANGELOG=$(git show -s --format=%N "${{ github.ref_name }}" | tail -n +4)" >> $GITHUB_ENV + + - name: ๐Ÿ“ค Publish crate + run: | + printf '[registries.thetadev]\nindex = "https://code.thetadev.de/ThetaDev/_cargo-index.git"\ntoken = "Bearer ${{ secrets.GITHUB_TOKEN }}"\n' >> ~/.cargo/config.toml + cargo publish --registry thetadev --package "${{ env.CRATE }}" + + - name: Publish release + uses: https://gitea.com/actions/release-action + with: + title: "${{ env.CRATE }} ${{ env.CRATE_VERSION }}" + body: "${{ env.CHANGELOG }}" diff --git a/Cargo.toml b/Cargo.toml index f7d68a4..2778864 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,6 +62,10 @@ tokio-test = "0.4.2" insta = { version = "1.17.1", features = ["ron", "redactions"] } path_macro = "1.0.0" +# Included crates +rustypipe = { path = ".", default-features = false } +rustypipe-downloader = { path = "./downloader", default-features = false } + [features] default = ["default-tls"] diff --git a/cli/Cargo.toml b/cli/Cargo.toml index f6d6053..8df7047 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -39,8 +39,8 @@ rustls-tls-native-roots = [ ] [dependencies] -rustypipe = { path = "../", default-features = false } -rustypipe-downloader = { path = "../downloader", default-features = false } +rustypipe.workspace = true +rustypipe-downloader.workspace = true reqwest.workspace = true tokio = { workspace = true, features = ["macros", "rt-multi-thread"] } futures.workspace = true diff --git a/downloader/Cargo.toml b/downloader/Cargo.toml index 58b9cae..ef8028e 100644 --- a/downloader/Cargo.toml +++ b/downloader/Cargo.toml @@ -29,7 +29,7 @@ rustls-tls-native-roots = [ ] [dependencies] -rustypipe = { path = "../", default-features = false } +rustypipe.workspace = true once_cell.workspace = true regex.workspace = true thiserror.workspace = true