Skip to content

Instantly share code, notes, and snippets.

@Nomane
Last active January 15, 2024 02:49
Show Gist options
  • Star 25 You must be signed in to star a gist
  • Fork 12 You must be signed in to fork a gist
  • Save Nomane/df017387aaa2d24cbacb5da3a55256cf to your computer and use it in GitHub Desktop.
Save Nomane/df017387aaa2d24cbacb5da3a55256cf to your computer and use it in GitHub Desktop.
Bump version shell script.
#!/bin/bash
# Thanks goes to @pete-otaqui for the initial gist:
# https://gist.github.com/pete-otaqui/4188238
#
# Original version modified by Marek Suscak
#
# works with a file called VERSION in the current directory,
# the contents of which should be a semantic version number
# such as "1.2.3" or even "1.2.3-beta+001.ab"
# this script will display the current version, automatically
# suggest a "minor" version update, and ask for input to use
# the suggestion, or a newly entered value.
# New revision modified by Nomane Oulali
# - Add some reliability stuff like controlling that last commit is
# not already tagged
# - Allow custom comment when you apply your tags
# - Increment patch field instead of minor
# Thanks to Marek Suscak for the original version
# https://gist.github.com/mareksuscak/1f206fbc3bb9d97dec9c
# once the new version number is determined, the script will
# pull a list of changes from git history, prepend this to
# a file called CHANGELOG.md (under the title of the new version
# number), give user a chance to review and update the changelist
# manually if needed and create a GIT tag.
NOW="$(date +'%B %d, %Y')"
RED="\033[1;31m"
GREEN="\033[0;32m"
YELLOW="\033[1;33m"
BLUE="\033[1;34m"
PURPLE="\033[1;35m"
CYAN="\033[1;36m"
WHITE="\033[1;37m"
RESET="\033[0m"
LATEST_HASH=`git log --pretty=format:'%h' -n 1`
QUESTION_FLAG="${GREEN}?"
WARNING_FLAG="${YELLOW}!"
NOTICE_FLAG="${CYAN}"
ADJUSTMENTS_MSG="${QUESTION_FLAG} ${CYAN}Now you can make adjustments to ${WHITE}CHANGELOG.md${CYAN}. Then press enter to continue."
PUSHING_MSG="${NOTICE_FLAG} Pushing new version to the ${WHITE}origin${CYAN}..."
RELEASE_NOTE=""
while true; do
case "$1" in
-m | --message ) RELEASE_NOTE=$2; shift; shift ;;
* ) break ;;
esac
done
# $1 : version
# $2 : release note
function tag {
if [ -z "$2" ]; then
# Default release note
git tag -a "v$1" -m "Tag version $1."
else
# Custom release note
git tag -a "v$1" -m "$2"
fi
}
if [ -f VERSION ]; then
BASE_STRING=`cat VERSION`
BASE_LIST=(`echo $BASE_STRING | tr '.' ' '`)
V_MAJOR=${BASE_LIST[0]}
V_MINOR=${BASE_LIST[1]}
V_PATCH=${BASE_LIST[2]}
echo -e "${NOTICE_FLAG} Current version: ${WHITE}$BASE_STRING"
echo -e "${NOTICE_FLAG} Latest commit hash: ${WHITE}$LATEST_HASH"
V_PATCH=$((V_PATCH + 1))
SUGGESTED_VERSION="$V_MAJOR.$V_MINOR.$V_PATCH"
echo -ne "${QUESTION_FLAG} ${CYAN}Enter a version number [${WHITE}$SUGGESTED_VERSION${CYAN}]: "
read INPUT_STRING
if [ "$INPUT_STRING" = "" ]; then
INPUT_STRING=$SUGGESTED_VERSION
fi
# Check if your current source is not already tagged by using current hash
GIT_COMMIT=`git rev-parse HEAD`
NEEDS_TAG=`git describe --contains $GIT_COMMIT`
# Only tag if no tag already (would be better if the git describe command above could have a silent option)
if [ -n "$NEEDS_TAG" ]; then
echo -e "${WARNING_FLAG} Current code is already released."
exit 0
fi
echo -e "${NOTICE_FLAG} Will set new version to be ${WHITE}$INPUT_STRING"
echo $INPUT_STRING > VERSION
echo "## $INPUT_STRING ($NOW)" > tmpfile
git log --pretty=format:" - %s" "v$BASE_STRING"...HEAD >> tmpfile
echo "" >> tmpfile
echo "" >> tmpfile
cat CHANGELOG.md >> tmpfile
mv tmpfile CHANGELOG.md
echo -e "$ADJUSTMENTS_MSG"
read
echo -e "$PUSHING_MSG"
git add CHANGELOG.md VERSION
git commit -m "Bump version to ${INPUT_STRING}."
tag "${INPUT_STRING}" "${RELEASE_NOTE}"
git push origin --tags
else
echo -e "${WARNING_FLAG} Could not find a VERSION file."
echo -ne "${QUESTION_FLAG} ${CYAN}Do you want to create a version file and start from scratch? [${WHITE}y${CYAN}]: "
read RESPONSE
if [ "$RESPONSE" = "" ]; then RESPONSE="y"; fi
if [ "$RESPONSE" = "Y" ]; then RESPONSE="y"; fi
if [ "$RESPONSE" = "Yes" ]; then RESPONSE="y"; fi
if [ "$RESPONSE" = "yes" ]; then RESPONSE="y"; fi
if [ "$RESPONSE" = "YES" ]; then RESPONSE="y"; fi
if [ "$RESPONSE" = "y" ]; then
echo "0.1.0" > VERSION
echo "## 0.1.0 ($NOW)" > CHANGELOG.md
git log --pretty=format:" - %s" >> CHANGELOG.md
echo "" >> CHANGELOG.md
echo "" >> CHANGELOG.md
echo -e "$ADJUSTMENTS_MSG"
read
echo -e "$PUSHING_MSG"
git add VERSION CHANGELOG.md
git commit -m "Add VERSION and CHANGELOG.md files, Bump version to v0.1.0."
tag "0.1.0" ${RELEASE_NOTE}
git push origin --tags
fi
fi
echo -e "${NOTICE_FLAG} Finished."
@posesco
Copy link

posesco commented Nov 27, 2020

Thanks !!

@jv-k
Copy link

jv-k commented Feb 14, 2022

Check mine out too! There's a few more features, and it's an NPM module
https://github.com/jv-k/bump-version

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment