github.com/moov-io/imagecashletter@v0.10.1/tagged-release.sh (about) 1 #!/bin/bash 2 3 [ $# -eq 0 ] && { echo "Usage: $0 version_tag"; exit 1; } 4 5 newVersionTag=$1 6 if ! [[ "$newVersionTag" =~ v[0-9]+\.[0-9]+\.[0-9]+ ]] 7 then 8 echo "invalid version tag $newVersionTag" 9 exit 1 10 fi 11 12 # make sure this is a new tag 13 if git show-ref --tags | grep -q "$newVersionTag"; then 14 echo "$newVersionTag already exists!" 15 exit 16 fi 17 18 # aborts if the git command fails 19 if ! current=$(git describe --tags --abbrev=0); then 20 exit 1 21 fi 22 parts=( $( echo "$current" | grep -o -E '[0-9]+') ) 23 major=${parts[0]} 24 minor=${parts[1]} 25 bug=${parts[2]} 26 27 newMajorVersion=v$((major+1)).0.0 28 newMinorVersion=v$major.$((minor+1)).0 29 newBugVersion=v$major.$minor.$((bug+1)) 30 31 if [[ "$newVersionTag" == "$newMajorVersion" ]]; then 32 echo "releasing new major version $newVersionTag (currently on $current)" 33 elif [[ "$newVersionTag" == "$newMinorVersion" ]]; then 34 echo "releasing new minor version $newVersionTag (currently on $current)" 35 elif [[ "$newVersionTag" == "$newBugVersion" ]]; then 36 echo "releasing new bug fix $newVersionTag (currently on $current)" 37 else 38 echo cannot increment version from "$current" to "$newVersionTag" 39 exit 1 40 fi 41 42 read -p "Do you want to continue? (y/n) " -n 1 -r 43 echo 44 if [[ ! $REPLY =~ ^[Yy]$ ]] 45 then 46 echo "aborting release" 47 exit 0 48 fi 49 50 # releases should be created from master branch 51 if [ "$(git branch --show-current)" != "master" ] 52 then 53 echo "switching to branch 'master'" 54 git checkout master > /dev/null 2>&1 55 fi 56 57 # only 2 files should be changed 58 status=$(git status --porcelain) 59 if [ "$(echo "$status" | wc -l)" -ne 2 ] 60 then 61 echo "Only version.go and CHANGELOG.md should be updated!" 62 if [ -n "$status" ] 63 then 64 printf "Pending changes:\n%s\n" "$status" 65 fi 66 exit 67 elif ! echo "$status" | grep -q "CHANGELOG.md" && ! echo "$status" | grep -q "version.go" 68 then 69 echo "version.go and changelog.md must be updated to proceed" 70 exit 71 fi 72 73 firstLine=$(head -n 1 CHANGELOG.md) 74 if ! echo "$firstLine" | grep -q "$newVersionTag"; then 75 echo "new tag ($newVersionTag) doesn't match CHANGELOG ($firstLine)" 76 exit 77 fi 78 79 expectedHeader=$(printf "## $newVersionTag (Released %s)" "$(date +"%Y-%m-%d")") 80 if [ "$firstLine" != "$expectedHeader" ] 81 then 82 echo "Did you update the CHANGELOG's header? Expected \"$expectedHeader\", found \"$firstLine\"" 83 exit 84 fi 85 86 git add CHANGELOG.md version.go 87 git commit -m "release $newVersionTag" 88 git tag "$newVersionTag" 89 git push origin master 90 git push origin "$newVersionTag"