Skip to content

Instantly share code, notes, and snippets.

@mareksuscak
Created March 15, 2015 12:56
Show Gist options
  • Save mareksuscak/1f206fbc3bb9d97dec9c to your computer and use it in GitHub Desktop.
Save mareksuscak/1f206fbc3bb9d97dec9c to your computer and use it in GitHub Desktop.

Revisions

  1. mareksuscak created this gist Mar 15, 2015.
    97 changes: 97 additions & 0 deletions bump-version.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,97 @@
    #!/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.

    # 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}..."

    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_MINOR=$((V_MINOR + 1))
    V_PATCH=0
    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
    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}."
    git tag -a -m "Tag version ${INPUT_STRING}." "v$INPUT_STRING"
    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."
    git tag -a -m "Tag version 0.1.0." "v0.1.0"
    git push origin --tags
    fi
    fi

    echo -e "${NOTICE_FLAG} Finished."