annotate src/capnproto-0.6.0/release.sh @ 62:0994c39f1e94

Cap'n Proto v0.6 + build for OSX
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 22 May 2017 10:01:37 +0100
parents
children
rev   line source
cannam@62 1 #! /usr/bin/env bash
cannam@62 2
cannam@62 3 set -euo pipefail
cannam@62 4
cannam@62 5 if [ "$1" != "package" ]; then
cannam@62 6 if (grep -r KJ_DBG c++/src | egrep -v '/debug(-test)?[.]' | grep -v 'See KJ_DBG\.$'); then
cannam@62 7 echo '*** Error: There are instances of KJ_DBG in the code.' >&2
cannam@62 8 exit 1
cannam@62 9 fi
cannam@62 10
cannam@62 11 if (egrep -r 'TODO\((now|soon)\)' *); then
cannam@62 12 echo '*** Error: There are release-blocking TODOs in the code.' >&2
cannam@62 13 exit 1
cannam@62 14 fi
cannam@62 15 fi
cannam@62 16
cannam@62 17 doit() {
cannam@62 18 echo "@@@@ $@"
cannam@62 19 "$@"
cannam@62 20 }
cannam@62 21
cannam@62 22 get_version() {
cannam@62 23 local VERSION=$(grep AC_INIT c++/configure.ac | sed -e 's/^[^]]*],\[\([^]]*\)].*$/\1/g')
cannam@62 24 if [[ ! "$VERSION" =~ $1 ]]; then
cannam@62 25 echo "Couldn't parse version: $VERSION" >&2
cannam@62 26 exit 1
cannam@62 27 fi
cannam@62 28 echo "$VERSION"
cannam@62 29 }
cannam@62 30
cannam@62 31 get_release_version() {
cannam@62 32 get_version '^[0-9]+[.][0-9]+[.][0-9]+(-rc[0-9]+|[.][0-9]+)?$'
cannam@62 33 }
cannam@62 34
cannam@62 35 update_version() {
cannam@62 36 local OLD=$1
cannam@62 37 local NEW=$2
cannam@62 38 local BRANCH_DESC=$3
cannam@62 39
cannam@62 40 local OLD_REGEX=${OLD//./[.]}
cannam@62 41 doit sed -i -e "s/$OLD_REGEX/$NEW/g" c++/configure.ac
cannam@62 42 doit sed -i -e "s/set(VERSION.*)/set(VERSION $NEW)/g" c++/CMakeLists.txt
cannam@62 43
cannam@62 44 local NEW_NOTAG=${NEW%%-*}
cannam@62 45 declare -a NEW_ARR=(${NEW_NOTAG//./ })
cannam@62 46 doit sed -i -re "
cannam@62 47 s/^#define CAPNP_VERSION_MAJOR [0-9]+\$/#define CAPNP_VERSION_MAJOR ${NEW_ARR[0]}/g;
cannam@62 48 s/^#define CAPNP_VERSION_MINOR [0-9]+\$/#define CAPNP_VERSION_MINOR ${NEW_ARR[1]}/g;
cannam@62 49 s/^#define CAPNP_VERSION_MICRO [0-9]+\$/#define CAPNP_VERSION_MICRO ${NEW_ARR[2]:-0}/g" \
cannam@62 50 c++/src/capnp/common.h
cannam@62 51
cannam@62 52 local NEW_COMBINED=$(( ${NEW_ARR[0]} * 1000000 + ${NEW_ARR[1]} * 1000 + ${NEW_ARR[2]:-0 }))
cannam@62 53 doit sed -i -re "s/^#if CAPNP_VERSION != [0-9]*\$/#if CAPNP_VERSION != $NEW_COMBINED/g" \
cannam@62 54 c++/src/*/*.capnp.h c++/src/*/*/*.capnp.h
cannam@62 55
cannam@62 56 doit git commit -a -m "Set $BRANCH_DESC version to $NEW."
cannam@62 57 }
cannam@62 58
cannam@62 59 build_packages() {
cannam@62 60 local VERSION=$1
cannam@62 61 local VERSION_BASE=${VERSION%%-*}
cannam@62 62
cannam@62 63 echo "========================================================================="
cannam@62 64 echo "Building C++ package..."
cannam@62 65 echo "========================================================================="
cannam@62 66
cannam@62 67 # make dist tarball and move into ..
cannam@62 68 cd c++
cannam@62 69 doit autoreconf -i
cannam@62 70 doit ./configure
cannam@62 71 doit make -j6 distcheck
cannam@62 72 doit mv capnproto-c++-$VERSION.tar.gz ..
cannam@62 73 doit make distclean
cannam@62 74
cannam@62 75 # build windows executables
cannam@62 76 doit ./configure --host=i686-w64-mingw32 --with-external-capnp \
cannam@62 77 --disable-shared CXXFLAGS='-static-libgcc -static-libstdc++'
cannam@62 78 doit make -j6 capnp.exe capnpc-c++.exe capnpc-capnp.exe
cannam@62 79 doit i686-w64-mingw32-strip capnp.exe capnpc-c++.exe capnpc-capnp.exe
cannam@62 80 doit mkdir capnproto-tools-win32-$VERSION
cannam@62 81 doit mv capnp.exe capnpc-c++.exe capnpc-capnp.exe capnproto-tools-win32-$VERSION
cannam@62 82 doit make maintainer-clean
cannam@62 83
cannam@62 84 # repack dist tarball and win32 tools into win32 zip, with DOS line endings
cannam@62 85 doit tar zxf ../capnproto-c++-$VERSION.tar.gz
cannam@62 86 find capnproto-c++-$VERSION -name '*.c++' -o -name '*.h' -o -name '*.capnp' -o -name '*.md' -o -name '*.txt' | grep -v testdata | doit xargs unix2dos
cannam@62 87 doit zip -r ../capnproto-c++-win32-$VERSION.zip capnproto-c++-$VERSION capnproto-tools-win32-$VERSION
cannam@62 88
cannam@62 89 rm -rf capnproto-c++-$VERSION capnproto-tools-win32-$VERSION
cannam@62 90 cd ..
cannam@62 91 }
cannam@62 92
cannam@62 93 cherry_pick() {
cannam@62 94 shift
cannam@62 95 if [ $# -gt 0 ]; then
cannam@62 96 echo "========================================================================="
cannam@62 97 echo "Cherry-picking fixes"
cannam@62 98 echo "========================================================================="
cannam@62 99 doit git cherry-pick "$@"
cannam@62 100 fi
cannam@62 101 }
cannam@62 102
cannam@62 103 done_banner() {
cannam@62 104 local VERSION=$1
cannam@62 105 local PUSH=$2
cannam@62 106 local FINAL=$3
cannam@62 107 echo "========================================================================="
cannam@62 108 echo "Done"
cannam@62 109 echo "========================================================================="
cannam@62 110 echo "Ready to release:"
cannam@62 111 echo " capnproto-c++-$VERSION.tar.gz"
cannam@62 112 echo " capnproto-c++-win32-$VERSION.zip"
cannam@62 113 echo "Don't forget to push changes:"
cannam@62 114 echo " git push origin $PUSH"
cannam@62 115
cannam@62 116 read -s -n 1 -p "Shall I push to git and upload to capnproto.org now? (y/N)" YESNO
cannam@62 117
cannam@62 118 echo
cannam@62 119 case "$YESNO" in
cannam@62 120 y | Y )
cannam@62 121 doit git push origin $PUSH
cannam@62 122 doit gce-ss copy-files capnproto-c++-$VERSION.tar.gz capnproto-c++-win32-$VERSION.zip \
cannam@62 123 fe:/var/www/capnproto.org
cannam@62 124
cannam@62 125 if [ "$FINAL" = yes ]; then
cannam@62 126 echo "========================================================================="
cannam@62 127 echo "Publishing docs"
cannam@62 128 echo "========================================================================="
cannam@62 129 cd doc
cannam@62 130 doit ./push-site.sh
cannam@62 131 cd ..
cannam@62 132 echo "========================================================================="
cannam@62 133 echo "Really done"
cannam@62 134 echo "========================================================================="
cannam@62 135 fi
cannam@62 136
cannam@62 137 echo "Release is available at:"
cannam@62 138 echo " http://capnproto.org/capnproto-c++-$VERSION.tar.gz"
cannam@62 139 ;;
cannam@62 140 * )
cannam@62 141 echo "OK, do it yourself then."
cannam@62 142 ;;
cannam@62 143 esac
cannam@62 144 }
cannam@62 145
cannam@62 146 BRANCH=$(git rev-parse --abbrev-ref HEAD)
cannam@62 147
cannam@62 148 case "${1-}:$BRANCH" in
cannam@62 149 # ======================================================================================
cannam@62 150 candidate:master )
cannam@62 151 echo "New major release."
cannam@62 152
cannam@62 153 if [ $# -gt 1 ]; then
cannam@62 154 echo "Cannot cherry-pick when starting from master. Do it yourself." >&2
cannam@62 155 exit 1
cannam@62 156 fi
cannam@62 157
cannam@62 158 HEAD_VERSION=$(get_version '^[0-9]+[.][0-9]+-dev$')
cannam@62 159 RELEASE_VERSION=${HEAD_VERSION%%-dev}.0
cannam@62 160
cannam@62 161 echo "Version: $RELEASE_VERSION"
cannam@62 162
cannam@62 163 echo "========================================================================="
cannam@62 164 echo "Creating release branch..."
cannam@62 165 echo "========================================================================="
cannam@62 166 doit git checkout -b release-$RELEASE_VERSION
cannam@62 167
cannam@62 168 update_version $HEAD_VERSION $RELEASE_VERSION-rc1 "release branch"
cannam@62 169
cannam@62 170 build_packages $RELEASE_VERSION-rc1
cannam@62 171
cannam@62 172 echo "========================================================================="
cannam@62 173 echo "Updating version in master branch..."
cannam@62 174 echo "========================================================================="
cannam@62 175
cannam@62 176 doit git checkout master
cannam@62 177 declare -a VERSION_ARR=(${RELEASE_VERSION//./ })
cannam@62 178 NEXT_VERSION=${VERSION_ARR[0]}.$((VERSION_ARR[1] + 1))
cannam@62 179
cannam@62 180 update_version $HEAD_VERSION $NEXT_VERSION-dev "mainlaine"
cannam@62 181
cannam@62 182 done_banner $RELEASE_VERSION-rc1 "master release-$RELEASE_VERSION" no
cannam@62 183 ;;
cannam@62 184
cannam@62 185 # ======================================================================================
cannam@62 186 candidate:release-* )
cannam@62 187 echo "New release candidate."
cannam@62 188 OLD_VERSION=$(get_release_version)
cannam@62 189
cannam@62 190 if [[ $OLD_VERSION == *-rc* ]]; then
cannam@62 191 # New release candidate for existing release.
cannam@62 192
cannam@62 193 RC=${OLD_VERSION##*-rc}
cannam@62 194 BRANCH_VERSION=${OLD_VERSION%%-rc*}
cannam@62 195 RC_VERSION=$BRANCH_VERSION-rc$(( RC + 1 ))
cannam@62 196
cannam@62 197 echo "Version: $RC_VERSION"
cannam@62 198 else
cannam@62 199 # New micro release.
cannam@62 200
cannam@62 201 declare -a VERSION_ARR=(${OLD_VERSION//./ })
cannam@62 202 BRANCH_VERSION=${VERSION_ARR[0]}.${VERSION_ARR[1]}.$((VERSION_ARR[2] + 1))
cannam@62 203
cannam@62 204 RC_VERSION=$BRANCH_VERSION-rc1
cannam@62 205 echo "Version: $RC_VERSION"
cannam@62 206
cannam@62 207 echo "========================================================================="
cannam@62 208 echo "Creating new release branch..."
cannam@62 209 echo "========================================================================="
cannam@62 210
cannam@62 211 doit git checkout -b release-$BRANCH_VERSION
cannam@62 212 fi
cannam@62 213
cannam@62 214 echo "========================================================================="
cannam@62 215 echo "Updating version number to $RC_VERSION..."
cannam@62 216 echo "========================================================================="
cannam@62 217
cannam@62 218 update_version $OLD_VERSION $RC_VERSION "release branch"
cannam@62 219
cannam@62 220 cherry_pick "$@"
cannam@62 221
cannam@62 222 build_packages $RC_VERSION
cannam@62 223
cannam@62 224 done_banner $RC_VERSION release-$BRANCH_VERSION no
cannam@62 225 ;;
cannam@62 226
cannam@62 227 # ======================================================================================
cannam@62 228 final:release-* )
cannam@62 229 echo "Final release."
cannam@62 230 OLD_VERSION=$(get_release_version)
cannam@62 231
cannam@62 232 if [[ $OLD_VERSION != *-rc* ]]; then
cannam@62 233 echo "Current version is already a final release. You need to create a new candidate first." >&2
cannam@62 234 exit 1
cannam@62 235 fi
cannam@62 236
cannam@62 237 if [ $# -gt 1 ]; then
cannam@62 238 echo "Cannot cherry-pick into final release. Make another candidate." >&2
cannam@62 239 exit 1
cannam@62 240 fi
cannam@62 241
cannam@62 242 RC=${OLD_VERSION##*-rc}
cannam@62 243 NEW_VERSION=${OLD_VERSION%%-rc*}
cannam@62 244
cannam@62 245 echo "Version: $NEW_VERSION"
cannam@62 246
cannam@62 247 echo "========================================================================="
cannam@62 248 echo "Updating version number to $NEW_VERSION..."
cannam@62 249 echo "========================================================================="
cannam@62 250
cannam@62 251 doit sed -i -re "s/capnproto-c[+][+]-[0-9]+[.][0-9]+[.][0-9]+([.][0-9]+)?\>/capnproto-c++-$NEW_VERSION/g" doc/install.md
cannam@62 252 doit sed -i -re "s/capnproto-c[+][+]-win32-[0-9]+[.][0-9]+[.][0-9]+([.][0-9]+)?\>/capnproto-c++-win32-$NEW_VERSION/g" doc/install.md
cannam@62 253 doit sed -i -re "s/capnproto-tools-win32-[0-9]+[.][0-9]+[.][0-9]+([.][0-9]+)?\>/capnproto-tools-win32-$NEW_VERSION/g" doc/install.md
cannam@62 254 update_version $OLD_VERSION $NEW_VERSION "release branch"
cannam@62 255
cannam@62 256 doit git tag v$NEW_VERSION
cannam@62 257
cannam@62 258 build_packages $NEW_VERSION
cannam@62 259
cannam@62 260 done_banner $NEW_VERSION "v$NEW_VERSION release-$NEW_VERSION" yes
cannam@62 261 ;;
cannam@62 262
cannam@62 263 # ======================================================================================
cannam@62 264 security:release-* )
cannam@62 265 echo "Security release."
cannam@62 266 OLD_VERSION=$(get_release_version)
cannam@62 267
cannam@62 268 if [[ $OLD_VERSION == *-rc* ]]; then
cannam@62 269 echo "Security releases don't have candidates." >&2
cannam@62 270 exit 1
cannam@62 271 fi
cannam@62 272
cannam@62 273 declare -a VERSION_ARR=(${OLD_VERSION//./ } 0)
cannam@62 274 NEW_VERSION=${VERSION_ARR[0]}.${VERSION_ARR[1]}.${VERSION_ARR[2]}.$((VERSION_ARR[3] + 1))
cannam@62 275
cannam@62 276 echo "Version: $NEW_VERSION"
cannam@62 277
cannam@62 278 echo "========================================================================="
cannam@62 279 echo "Updating version number to $NEW_VERSION..."
cannam@62 280 echo "========================================================================="
cannam@62 281
cannam@62 282 doit sed -i -re "s/capnproto-c[+][+]-[0-9]+[.][0-9]+[.][0-9]+([.][0-9]+)?\>/capnproto-c++-$NEW_VERSION/g" doc/install.md
cannam@62 283 doit sed -i -re "s/capnproto-c[+][+]-win32-[0-9]+[.][0-9]+[.][0-9]+([.][0-9]+)?\>/capnproto-c++-win32-$NEW_VERSION/g" doc/install.md
cannam@62 284 doit sed -i -re "s/capnproto-tools-win32-[0-9]+[.][0-9]+[.][0-9]+([.][0-9]+)?\>/capnproto-tools-win32-$NEW_VERSION/g" doc/install.md
cannam@62 285 update_version $OLD_VERSION $NEW_VERSION "release branch"
cannam@62 286
cannam@62 287 cherry_pick "$@"
cannam@62 288
cannam@62 289 doit git tag v$NEW_VERSION
cannam@62 290
cannam@62 291 build_packages $NEW_VERSION
cannam@62 292
cannam@62 293 done_banner $NEW_VERSION "v$NEW_VERSION release-$NEW_VERSION" yes
cannam@62 294 ;;
cannam@62 295
cannam@62 296 # ======================================================================================
cannam@62 297 retry:release-* )
cannam@62 298 echo "Retrying release."
cannam@62 299 OLD_VERSION=$(get_release_version)
cannam@62 300 echo "Version: $OLD_VERSION"
cannam@62 301
cannam@62 302 if [[ $OLD_VERSION == *-rc* ]]; then
cannam@62 303 # We can add more cherry-picks when retrying a candidate.
cannam@62 304 cherry_pick "$@"
cannam@62 305 else
cannam@62 306 if [ $# -gt 1 ]; then
cannam@62 307 echo "Cannot cherry-pick into final release. Make another candidate." >&2
cannam@62 308 exit 1
cannam@62 309 fi
cannam@62 310 fi
cannam@62 311
cannam@62 312 OLD_VERSION=$(get_release_version)
cannam@62 313 build_packages $OLD_VERSION
cannam@62 314
cannam@62 315 if [[ $OLD_VERSION == *-rc* ]]; then
cannam@62 316 BRANCH_VERSION=${OLD_VERSION%%-rc*}
cannam@62 317 done_banner $OLD_VERSION release-$BRANCH_VERSION no
cannam@62 318 else
cannam@62 319 doit git tag v$OLD_VERSION
cannam@62 320 done_banner $OLD_VERSION "v$OLD_VERSION release-$OLD_VERSION" no
cannam@62 321 fi
cannam@62 322 ;;
cannam@62 323
cannam@62 324 # ======================================================================================
cannam@62 325 package:* )
cannam@62 326 echo "Just building a package."
cannam@62 327 build_packages $(get_version '.*')
cannam@62 328 ;;
cannam@62 329
cannam@62 330 # ======================================================================================
cannam@62 331 *:master )
cannam@62 332 echo "Invalid command for mainline branch. Only command is 'candidate'." >&2
cannam@62 333 exit 1
cannam@62 334 ;;
cannam@62 335
cannam@62 336 *:release-* )
cannam@62 337 echo "Invalid command for release branch. Commands are 'candidate', 'final', and 'retry'." >&2
cannam@62 338 exit 1
cannam@62 339 ;;
cannam@62 340
cannam@62 341 * )
cannam@62 342 echo "Not a master or release branch." >&2
cannam@62 343 exit 1
cannam@62 344 ;;
cannam@62 345 esac