actix-web 4.0.0-beta.14

Actix Web is a powerful, pragmatic, and extremely fast web framework for Rust
Documentation
#!/bin/sh

# developed on macOS and probably doesn't work on Linux yet due to minor
# differences in flags on sed

# requires github cli tool for automatic release draft creation

set -euo pipefail

DIR=$1

LINUX=""
MACOS=""

if [ "$(uname)" = "Darwin" ]; then
    MACOS="1"
fi

CARGO_MANIFEST=$DIR/Cargo.toml
CHANGELOG_FILE=$DIR/CHANGES.md
README_FILE=$DIR/README.md

# get current version
PACKAGE_NAME="$(sed -nE 's/^name ?= ?"([^"]+)"$/\1/ p' "$CARGO_MANIFEST" | head -n 1)"
CURRENT_VERSION="$(sed -nE 's/^version ?= ?"([^"]+)"$/\1/ p' "$CARGO_MANIFEST")"

CHANGE_CHUNK_FILE="$(mktemp)"
echo saving changelog to $CHANGE_CHUNK_FILE
echo

# get changelog chunk and save to temp file
cat "$CHANGELOG_FILE" |
    # skip up to unreleased heading
    sed '1,/Unreleased/ d' |
    # take up to previous version heading
    sed "/$CURRENT_VERSION/ q" |
    # drop last line
    sed '$d' \
        >"$CHANGE_CHUNK_FILE"

# if word count of changelog chunk is 0 then insert filler changelog chunk
if [ "$(wc -w "$CHANGE_CHUNK_FILE" | awk '{ print $1 }')" = "0" ]; then
    echo "* No significant changes since \`$CURRENT_VERSION\`." >"$CHANGE_CHUNK_FILE"
    echo >>"$CHANGE_CHUNK_FILE"
    echo >>"$CHANGE_CHUNK_FILE"
fi

if [ -n "${2-}" ]; then
    NEW_VERSION="$2"
else
    echo
    echo "--- Changes since $CURRENT_VERSION ----"
    cat "$CHANGE_CHUNK_FILE"
    echo
    read -p "Update version to: " NEW_VERSION
fi

DATE="$(date -u +"%Y-%m-%d")"
echo "updating from $CURRENT_VERSION => $NEW_VERSION ($DATE)"

# update package.version field
sed -i.bak -E "s/^version ?= ?\"[^\"]+\"$/version = \"$NEW_VERSION\"/" "$CARGO_MANIFEST"

# update readme
[ -f "$README_FILE" ] && sed -i.bak -E "s#$CURRENT_VERSION([/)])#$NEW_VERSION\1#g" "$README_FILE"

# update changelog file
(
    sed '/Unreleased/ q' "$CHANGELOG_FILE"                   # up to unreleased heading
    echo                                                     # blank line
    echo                                                     # blank line
    echo "## $NEW_VERSION - $DATE"                           # new version heading
    cat "$CHANGE_CHUNK_FILE"                                 # previously unreleased changes
    sed "/$CURRENT_VERSION/ q" "$CHANGELOG_FILE" | tail -n 1 # the previous version heading
    sed "1,/$CURRENT_VERSION/ d" "$CHANGELOG_FILE"           # everything after previous version heading
) >"$CHANGELOG_FILE.bak"
mv "$CHANGELOG_FILE.bak" "$CHANGELOG_FILE"

# done; remove backup files
rm -f $CARGO_MANIFEST.bak
rm -f $CHANGELOG_FILE.bak
rm -f $README_FILE.bak

echo "manifest, changelog, and readme updated"
echo
echo "check other references:"
rg --glob='**/Cargo.toml' "\
${PACKAGE_NAME} ?= ?\"[^\"]+\"\
|${PACKAGE_NAME} ?=.*version ?= ?\"([^\"]+)\"\
|package ?= ?\"${PACKAGE_NAME}\".*version ?= ?\"([^\"]+)\"\
|version ?= ?\"([^\"]+)\".*package ?= ?\"${PACKAGE_NAME}\"" || true

echo
read -p "Update all references: (y/N) " UPDATE_REFERENCES
UPDATE_REFERENCES="${UPDATE_REFERENCES:-n}"

if [ "$UPDATE_REFERENCES" = 'y' ] || [ "$UPDATE_REFERENCES" = 'Y' ]; then

    for f in $(fd Cargo.toml); do
        sed -i.bak -E \
            "s/^(${PACKAGE_NAME} ?= ?\")[^\"]+(\")$/\1${NEW_VERSION}\2/g" $f
        sed -i.bak -E \
            "s/^(${PACKAGE_NAME} ?=.*version ?= ?\")[^\"]+(\".*)$/\1${NEW_VERSION}\2/g" $f
        sed -i.bak -E \
            "s/^(.*package ?= ?\"${PACKAGE_NAME}\".*version ?= ?\")[^\"]+(\".*)$/\1${NEW_VERSION}\2/g" $f
        sed -i.bak -E \
            "s/^(.*version ?= ?\")[^\"]+(\".*package ?= ?\"${PACKAGE_NAME}\".*)$/\1${NEW_VERSION}\2/g" $f

        # remove backup file
        rm -f $f.bak
    done

fi

if [ $MACOS ]; then
    printf "prepare $PACKAGE_NAME release $NEW_VERSION" | pbcopy
else
    echo
    echo "commit message:"
    echo "prepare $PACKAGE_NAME release $NEW_VERSION"
fi

SHORT_PACKAGE_NAME="$(echo $PACKAGE_NAME | sed 's/^actix-web-//' | sed 's/^actix-//')"
GIT_TAG="$(echo $SHORT_PACKAGE_NAME-v$NEW_VERSION)"
RELEASE_TITLE="$(echo $PACKAGE_NAME: v$NEW_VERSION)"

echo
echo "GitHub release command:"
echo "gh release create \"$GIT_TAG\" --draft --title \"$RELEASE_TITLE\" --notes-file \"$CHANGE_CHUNK_FILE\" --prerelease"

read -p "Submit draft GH release: (y/N) " GH_RELEASE
GH_RELEASE="${GH_RELEASE:-n}"

if [ "$GH_RELEASE" = 'y' ] || [ "$GH_RELEASE" = 'Y' ]; then
    gh release create "$GIT_TAG" --draft --title "$RELEASE_TITLE" --notes-file "$CHANGE_CHUNK_FILE" --prerelease
fi

echo