Skip to content

Instantly share code, notes, and snippets.

@pietvanzoen
Last active August 31, 2017 12:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pietvanzoen/40dd1bb43bcf49223532a4beb941c384 to your computer and use it in GitHub Desktop.
Save pietvanzoen/40dd1bb43bcf49223532a4beb941c384 to your computer and use it in GitHub Desktop.
Git annotated tag release script

Git annotated tag release script

Install

cd <where-you-want-to-run-your-script-from>
curl -O https://gist.githubusercontent.com/pietvanzoen/40dd1bb43bcf49223532a4beb941c384/raw/git-release.sh
chmod +x git-release.sh

Run

cd <your-git-repo>
<path-to-script>/git-release.sh

Follow prompts.

#!/bin/bash
set -e
function main() {
update_master
get_latest_tag_version
get_changelog
get_new_release_version
make_release
echo "Success! Release $new_release created. Run git push --tags to publish"
}
function update_master() {
git checkout master --quiet
git pull --quiet
}
function get_latest_tag_version() {
latest_tag_version="$(git tag --list --sort='-*authordate' 'v*' | head -n 1)"
read -r -p "Last tag version was $latest_tag_version. Is this correct? " response
if [[ ! $response =~ ^([yY][eE][sS]|[yY])$ ]]; then
read -r -p "What tag should we go from? " latest_tag_version
fi
}
function get_changelog() {
echo
changelog="$(git log --pretty="* %ad - %s [%h]" --date=short $latest_tag_version..origin/master)"
change_count="$(git rev-list --count $latest_tag_version..origin/master)"
if [[ "$change_count" -lt 1 ]]; then
echo "No commits since $latest_tag_version"
exit
fi
echo "$change_count commit(s) since $latest_tag_version. These will be included in the new release:"
echo "$changelog"
}
function get_new_release_version() {
echo
read -r -p "What is the version of the new release? (e.g. 'v1.4.6') " new_release
if [[ ! $new_release =~ ^(v[0-9]+\.[0-9]+\.[0-9]+)$ ]]; then
echo "Not a valid release version: $new_release"
exit 1
fi
}
function make_release() {
message="$new_release
$changelog"
git tag -a "$new_release" -m "$message"
}
main
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment