github.com/dashpay/godash@v0.0.0-20160726055534-e038a21e0e3d/release/prep_release.sh (about) 1 #!/bin/sh 2 # 3 # Copyright (c) 2013 Conformal Systems LLC <info@conformal.com> 4 # 5 # Permission to use, copy, modify, and distribute this software for any 6 # purpose with or without fee is hereby granted, provided that the above 7 # copyright notice and this permission notice appear in all copies. 8 # 9 # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 # 17 # 18 # Prepares for a release: 19 # - Bumps version according to specified level (major, minor, or patch) 20 # - Updates all version files and package control files with new version 21 # - Performs some basic validation on specified release notes 22 # - Updates project changes file with release notes 23 # 24 25 PROJECT=btcd 26 PROJECT_UC=$(echo $PROJECT | tr '[:lower:]' '[:upper:]') 27 SCRIPT=$(basename $0) 28 VERFILE=../version.go 29 VERFILES="$VERFILE ../cmd/btcctl/version.go" 30 PROJ_CHANGES=../CHANGES 31 32 # verify params 33 if [ $# -lt 2 ]; then 34 echo "usage: $SCRIPT {major | minor | patch} release-notes-file" 35 exit 1 36 fi 37 38 CUR_DIR=$(pwd) 39 cd "$(dirname $0)" 40 41 # verify version files exist 42 for verfile in $VERFILES; do 43 if [ ! -f "$verfile" ]; then 44 echo "$SCRIPT: error: $verfile does not exist" 1>&2 45 exit 1 46 fi 47 done 48 49 # verify changes file exists 50 if [ ! -f "$PROJ_CHANGES" ]; then 51 echo "$SCRIPT: error: $PROJ_CHANGES does not exist" 1>&2 52 exit 1 53 fi 54 55 RTYPE="$1" 56 RELEASE_NOTES="$2" 57 if [ $(echo $RELEASE_NOTES | cut -c1) != "/" ]; then 58 RELEASE_NOTES="$CUR_DIR/$RELEASE_NOTES" 59 fi 60 61 # verify valid release type 62 if [ "$RTYPE" != "major" -a "$RTYPE" != "minor" -a "$RTYPE" != "patch" ]; then 63 echo "$SCRIPT: error: release type must be major, minor, or patch" 64 exit 1 65 fi 66 67 # verify release notes 68 if [ ! -e "$RELEASE_NOTES" ]; then 69 echo "$SCRIPT: error: specified release notes file does not exist" 70 exit 1 71 fi 72 73 if [ ! -s "$RELEASE_NOTES" ]; then 74 echo "$SCRIPT: error: specified release notes file is empty" 75 exit 1 76 fi 77 78 # verify release notes format 79 while IFS='' read line; do 80 if [ -z "$line" ]; then 81 echo "$SCRIPT: error: release notes must not have blank lines" 82 exit 1 83 fi 84 if [ ${#line} -gt 74 ]; then 85 echo -n "$SCRIPT: error: release notes must not contain lines " 86 echo "with more than 74 characters" 87 exit 1 88 fi 89 if expr "$line" : ".*\.$" >/dev/null 2>&1 ; then 90 echo -n "$SCRIPT: error: release notes must not contain lines " 91 echo "that end in a period" 92 exit 1 93 fi 94 if ! expr "$line" : "\-" >/dev/null 2>&1; then 95 if ! expr "$line" : " " >/dev/null 2>&1; then 96 echo -n "$SCRIPT: error: release notes must not contain lines " 97 echo "that do not begin with a dash and are not indented" 98 exit 1 99 fi 100 fi 101 done <"$RELEASE_NOTES" 102 103 # verify git is available 104 if ! type git >/dev/null 2>&1; then 105 echo -n "$SCRIPT: error: Unable to find 'git' in the system path." 106 exit 1 107 fi 108 109 # verify the git repository is on the master branch 110 BRANCH=$(git branch | grep '\*' | cut -c3-) 111 if [ "$BRANCH" != "master" ]; then 112 echo "$SCRIPT: error: git repository must be on the master branch." 113 exit 1 114 fi 115 116 # verify there are no uncommitted modifications prior to release modifications 117 NUM_MODIFIED=$(git diff 2>/dev/null | wc -l | sed 's/^[ \t]*//') 118 NUM_STAGED=$(git diff --cached 2>/dev/null | wc -l | sed 's/^[ \t]*//') 119 if [ "$NUM_MODIFIED" != "0" -o "$NUM_STAGED" != "0" ]; then 120 echo -n "$SCRIPT: error: the working directory contains uncommitted " 121 echo "modifications" 122 exit 1 123 fi 124 125 # get version 126 PAT_PREFIX="(^[[:space:]]+app" 127 PAT_SUFFIX='[[:space:]]+uint[[:space:]]+=[[:space:]]+)[0-9]+$' 128 MAJOR=$(egrep "${PAT_PREFIX}Major${PAT_SUFFIX}" $VERFILE | awk '{print $4}') 129 MINOR=$(egrep "${PAT_PREFIX}Minor${PAT_SUFFIX}" $VERFILE | awk '{print $4}') 130 PATCH=$(egrep "${PAT_PREFIX}Patch${PAT_SUFFIX}" $VERFILE | awk '{print $4}') 131 if [ -z "$MAJOR" -o -z "$MINOR" -o -z "$PATCH" ]; then 132 echo "$SCRIPT: error: unable to get version from $VERFILE" 1>&2 133 exit 1 134 fi 135 136 # bump version according to level 137 if [ "$RTYPE" = "major" ]; then 138 MAJOR=$(expr $MAJOR + 1) 139 MINOR=0 140 PATCH=0 141 elif [ "$RTYPE" = "minor" ]; then 142 MINOR=$(expr $MINOR + 1) 143 PATCH=0 144 elif [ "$RTYPE" = "patch" ]; then 145 PATCH=$(expr $PATCH + 1) 146 fi 147 PROJ_VER="$MAJOR.$MINOR.$PATCH" 148 149 # update project changes with release notes 150 DATE=$(date "+%a %b %d %Y") 151 awk -v D="$DATE" -v VER="$PROJ_VER" ' 152 /=======/ && first_line==0 { 153 first_line=1 154 print $0 155 next 156 } 157 /=======/ && first_line==1 { 158 print $0 159 print "" 160 print "Changes in "VER" ("D")" 161 exit 162 } 163 { print $0 } 164 ' <"$PROJ_CHANGES" >"${PROJ_CHANGES}.tmp" 165 cat "$RELEASE_NOTES" | sed 's/^/ /' >>"${PROJ_CHANGES}.tmp" 166 awk ' 167 /=======/ && first_line==0 { 168 first_line=1 169 next 170 } 171 /=======/ && first_line==1 { 172 second_line=1 173 next 174 } 175 second_line==1 { print $0 } 176 ' <"$PROJ_CHANGES" >>"${PROJ_CHANGES}.tmp" 177 178 # update version filef with new version 179 for verfile in $VERFILES; do 180 sed -E " 181 s/${PAT_PREFIX}Major${PAT_SUFFIX}/\1${MAJOR}/; 182 s/${PAT_PREFIX}Minor${PAT_SUFFIX}/\1${MINOR}/; 183 s/${PAT_PREFIX}Patch${PAT_SUFFIX}/\1${PATCH}/; 184 " <"$verfile" >"${verfile}.tmp" 185 done 186 187 188 # Apply changes 189 mv "${PROJ_CHANGES}.tmp" "$PROJ_CHANGES" 190 for verfile in $VERFILES; do 191 mv "${verfile}.tmp" "$verfile" 192 done 193 194 echo "All files have been prepared for release." 195 echo "Use the following commands to review the changes for accuracy:" 196 echo " git status" 197 echo " git diff" 198 echo "" 199 echo "If everything is accurate, use the following commands to commit, tag," 200 echo "and push the changes" 201 echo " git commit -am \"Prepare for release ${PROJ_VER}.\"" 202 echo -n " git tag -a \"${PROJECT_UC}_${MAJOR}_${MINOR}_${PATCH}\" -m " 203 echo "\"Release ${PROJ_VER}\"" 204 echo " git push" 205 echo " git push --tags"