#!/bin/bash # Release next version of the product # Usage: # release # release --force # # Require: # - semver - https://github.com/sekati/semver # - jq - brew install jq # Common stuff RED="$(tput setaf 1)" CYAN="$(tput setaf 6)" UNDERLINE="$(tput sgr 0 1)" NOCOLOR="$(tput sgr0)" function header() { echo -e "$UNDERLINE$CYAN$1$NOCOLOR\n"; } function error() { echo -e "$UNDERLINE$RED$1$NOCOLOR"; } function usage() { echo "Usage:" echo " `basename $0` " echo " `basename $0` --force" echo } command -v semver >/dev/null 2>&1 || { error "semver not installed: see comments for instructions."; exit 1; } command -v jq >/dev/null 2>&1 || { error "jq not installed: see comments for instructions."; exit 1; } if [ "$1" == "" ]; then usage exit 1 fi git pull # Make sure all changes are merged. if [ $? -ne 0 ]; then error "Branch did not contain the latest changes and could not be merged automatically." echo "Please merge by hand before continue." echo git status exit 1 fi # Dirty repo? if [ "$(git status --porcelain 2>/dev/null)" ]; then error "Repo is dirty." echo "Pleae commit changes before continue." echo git status exit 1 fi # Read existing versions jq_ver=$(find . -maxdepth 1 -name "*.jquery.json" | xargs cat | jq -r ".version") cmpnt_ver=$(find . -maxdepth 1 -name "bower.json" | xargs cat | jq -r ".version") pkg_ver=$(find . -maxdepth 1 -name "package.json" | xargs cat | jq -r ".version") git_ver=$(git tag | sort -rV | head -n1) # Non npm package [ "$pkg_ver" == "0.0.0" ] && pkg_ver= # Verify current versions current_ver= [ -n "$jq_ver" ] && current_ver="$jq_ver" [ -n "$cmpnt_ver" ] && current_ver="$cmpnt_ver" [ -n "$pkg_ver" ] && current_ver="$pkg_ver" [ -n "$git_ver" ] && current_ver="$git_ver" [ -z "$current_ver" ] && current_ver="0.0.0" # Validate current versions and determine new version if [ "$1" == "major" ] || [ "$1" == "minor" ] || [ "$1" == "patch" ]; then dont_match="Versions in *.jquery.json, bower.json and package.json don’t match." if [ -n "$jq_ver" ] && [ "$current_ver" != "$jq_ver" ]; then error $dont_match; fi if [ -n "$cmpnt_ver" ] && [ "$current_ver" != "$cmpnt_ver" ]; then error $dont_match; fi if [ -n "$pkg_ver" ] && [ "$current_ver" != "$pkg_ver" ]; then error $dont_match; fi else if [ "$1" != "--force" ]; then error "Custom versions possible only with --force key." echo usage exit 1 fi new_ver="$1" fi if [ -z "$new_ver" ]; then [ "$1" == "patch" ] && new_ver=$(semver -p $current_ver) [ "$1" == "minor" ] && new_ver=$(semver -n $current_ver) [ "$1" == "major" ] && new_ver=$(semver -m $current_ver) fi header "Releasing v$new_ver..." # Update bower.json if [ -n "$cmpnt_ver" ]; then sed -i '' "s^$current_ver^$new_ver^" bower.json fi # Update package.json if [ -n "$pkg_ver" ]; then sed -i '' "s^$current_ver^$new_ver^" package.json fi # Update *.jquery.json if [ -n "$jq_ver" ]; then find . -maxdepth 1 -name "*.jquery.json" | xargs sed -i '' "s^$current_ver^$new_ver^" fi # Build files [ -f Gruntfile.js ] || [ -f Gruntfile.coffee ] && grunt build if [ -f src/Gruntfile.js ]; then pushd src grunt build popd fi # Commit changed files git commit -am "$new_ver" git push origin # Create tag git tag "$new_ver" git push origin --tags # Publish npm package if [ -n "$pkg_ver" ]; then npm publish fi echo "Done."