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
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 |