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/Justfile b/Justfile index 4628423..c320b58 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} --unreleased $INCLUDES" + echo "git-cliff $CLIFF_ARGS" + if [ -f "$CHANGELOG" ]; then + git-cliff $CLIFF_ARGS --prepend "$CHANGELOG" + else + git-cliff $CLIFF_ARGS --output "$CHANGELOG" + fi + + editor "$CHANGELOG" + + git add "$CHANGELOG" "$CARGO_TOML" + git commit -m "chore(release): release $CRATE v$VERSION" + + awk 'BEGIN{RS="(^|\n)## "} NR==2 { print "##",$0 }' "$CHANGELOG" | git tag -a -F - --cleanup whitespace "${CRATE}/v${VERSION}" 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/cliff.toml b/cliff.toml new file mode 100644 index 0000000..32b679a --- /dev/null +++ b/cliff.toml @@ -0,0 +1,99 @@ +# 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 = """ +{% set repo_url = "https://code.thetadev.de/ThetaDev/rustypipe" %}\ +{% if version %}\ + {%if previous.version %}\ + ## [{{ version }}]({{ repo_url }}/compare/{{ previous.version }}..{{ version }})\ + {% else %}\ + ## {{ version }}\ + {% endif %} - {{ 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 }} - \ + ([{{ commit.id | truncate(length=7, end="") }}]({{ repo_url }}/commit/{{ commit.id }}))\ + {% 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 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