diff --git a/.Rbuildignore b/.Rbuildignore index beed977..3a072c5 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -2,5 +2,6 @@ ^.vscode ^LICENSE\.md$ ^nix +^release.sh ^shell.nix$ ^tmp diff --git a/README.md b/README.md index 224ecf6..ea830c1 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,21 @@ my_data <- jsonlite::fromJSON(response$parse(encoding = "UTF-8")) print(my_data) ``` +## Releasing + +Make sure that your `main` branch is up to date: + +```sh +git checkout main +git pull +``` + +Then, run the release script with new version information: + +```sh +./release.sh -n +``` + ## License This work is licensed under MIT license. See [LICENSE](./LICENSE.md). diff --git a/release.sh b/release.sh new file mode 100755 index 0000000..ddb2c44 --- /dev/null +++ b/release.sh @@ -0,0 +1,91 @@ +#!/usr/bin/env bash + +## Stop on errors: +set -eo pipefail + +## Helper function to print log messages. +_log() { + echo "[RELEASE LOG]" "${@}" +} + +## Helper function to print errors. +_error() { + echo 1>&2 "[RELEASE ERROR]" "${@}" +} + +## Helper function to print usage. +_usage() { + echo "Usage: $0 [-h] -n " +} + +## Declare variables: +_version="" + +## Parse command line arguments: +while getopts "n:h" o; do + case "${o}" in + n) + _version="${OPTARG}" + ;; + h) + _usage + exit 0 + ;; + *) + _usage 1>&2 + exit 1 + ;; + esac +done +shift $((OPTIND - 1)) + +_log "Checking variables..." +if [ -z "${_version}" ]; then + _usage 1>&2 + exit 1 +else + _log "Version is \"${_version}\". Proceeding..." +fi + +_log "Checking git repository state..." +if [[ -z "$(git status --porcelain)" ]]; then + _log "Git repository is clean. Proceeding..." +else + _error "Git repository is not clean. Aborting..." + exit 1 +fi + +_log "Updating application version..." +sed -i -E "s/^Version:([ ]+).*/Version:\\1${_version}/g" DESCRIPTION + +_log "Generating changelog..." +git-chglog --output NEWS.md --next-tag "${_version}" + +_log "Staging changes..." +git add NEWS.md DESCRIPTION + +_log "Committing changes..." +git commit -m "chore(release): ${_version}" + +_log "Tagging version..." +git tag -a -m "Release ${_version}" "${_version}" + +_log "Pushing changes to remote..." +git push --follow-tags origin main + +_log "Creating the release..." +gh release create "${_version}" --title "${_version}" --generate-notes + +_log "Updating application version for development..." +sed -i -E "s/^Version:([ ]+).*/Version:\\1${_version}.9000/g" DESCRIPTION + +_log "Staging changes..." +git add DESCRIPTION + +_log "Committing changes..." +git commit -m "chore: bump development version to ${_version}.9000" + +_log "Pushing changes to remote..." +git push + +_log "Finished!"