diff src/capnproto-git-20161025/release.sh @ 48:9530b331f8c1

Add Cap'n Proto source
author Chris Cannam <cannam@all-day-breakfast.com>
date Tue, 25 Oct 2016 11:17:01 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/capnproto-git-20161025/release.sh	Tue Oct 25 11:17:01 2016 +0100
@@ -0,0 +1,329 @@
+#! /usr/bin/env bash
+
+set -euo pipefail
+
+if (grep -r KJ_DBG c++/src | egrep -v '/debug(-test)?[.]'); then
+  echo '*** Error:  There are instances of KJ_DBG in the code.' >&2
+  exit 1
+fi
+
+if (egrep -r 'TODO\((now|soon)\)' *); then
+  echo '*** Error:  There are release-blocking TODOs in the code.' >&2
+  exit 1
+fi
+
+doit() {
+  echo "@@@@ $@"
+  "$@"
+}
+
+get_version() {
+  local VERSION=$(grep AC_INIT c++/configure.ac | sed -e 's/^[^]]*],\[\([^]]*\)].*$/\1/g')
+  if [[ ! "$VERSION" =~ $1 ]]; then
+    echo "Couldn't parse version: $VERSION" >&2
+    exit 1
+  fi
+  echo "$VERSION"
+}
+
+get_release_version() {
+  get_version '^[0-9]+[.][0-9]+[.][0-9]+(-rc[0-9]+|[.][0-9]+)?$'
+}
+
+update_version() {
+  local OLD=$1
+  local NEW=$2
+  local BRANCH_DESC=$3
+
+  local OLD_REGEX=${OLD//./[.]}
+  doit sed -i -e "s/$OLD_REGEX/$NEW/g" c++/configure.ac
+  doit sed -i -e "s/set(VERSION.*)/set(VERSION $NEW)/g" c++/CMakeLists.txt
+
+  local NEW_NOTAG=${NEW%%-*}
+  declare -a NEW_ARR=(${NEW_NOTAG//./ })
+  doit sed -i -re "
+      s/^#define CAPNP_VERSION_MAJOR [0-9]+\$/#define CAPNP_VERSION_MAJOR ${NEW_ARR[0]}/g;
+      s/^#define CAPNP_VERSION_MINOR [0-9]+\$/#define CAPNP_VERSION_MINOR ${NEW_ARR[1]}/g;
+      s/^#define CAPNP_VERSION_MICRO [0-9]+\$/#define CAPNP_VERSION_MICRO ${NEW_ARR[2]:-0}/g" \
+      c++/src/capnp/common.h
+
+  local NEW_COMBINED=$(( ${NEW_ARR[0]} * 1000000 + ${NEW_ARR[1]} * 1000 + ${NEW_ARR[2]:-0 }))
+  doit sed -i -re "s/^#if CAPNP_VERSION != [0-9]*\$/#if CAPNP_VERSION != $NEW_COMBINED/g" \
+      c++/src/*/*.capnp.h c++/src/*/*/*.capnp.h
+
+  doit git commit -a -m "Set $BRANCH_DESC version to $NEW."
+}
+
+build_packages() {
+  local VERSION=$1
+  local VERSION_BASE=${VERSION%%-*}
+
+  echo "========================================================================="
+  echo "Building C++ package..."
+  echo "========================================================================="
+  cd c++
+  doit autoreconf -i
+  doit ./configure
+  doit make -j6 distcheck
+  doit make dist-zip
+  doit mv capnproto-c++-$VERSION.tar.gz ..
+  doit mv capnproto-c++-$VERSION.zip ../capnproto-c++-win32-$VERSION.zip
+  doit make distclean
+  doit ./configure --host=i686-w64-mingw32 --with-external-capnp \
+      --disable-shared CXXFLAGS='-static-libgcc -static-libstdc++'
+  doit make -j6 capnp.exe capnpc-c++.exe capnpc-capnp.exe
+  doit i686-w64-mingw32-strip capnp.exe capnpc-c++.exe capnpc-capnp.exe
+  doit mkdir capnproto-tools-win32-$VERSION
+  doit mv capnp.exe capnpc-c++.exe capnpc-capnp.exe capnproto-tools-win32-$VERSION
+  doit zip -r ../capnproto-c++-win32-$VERSION.zip capnproto-tools-win32-$VERSION
+  doit make maintainer-clean
+  cd ..
+}
+
+cherry_pick() {
+  shift
+  if [ $# -gt 0 ]; then
+    echo "========================================================================="
+    echo "Cherry-picking fixes"
+    echo "========================================================================="
+    doit git cherry-pick "$@"
+  fi
+}
+
+done_banner() {
+  local VERSION=$1
+  local PUSH=$2
+  local FINAL=$3
+  echo "========================================================================="
+  echo "Done"
+  echo "========================================================================="
+  echo "Ready to release:"
+  echo "  capnproto-c++-$VERSION.tar.gz"
+  echo "  capnproto-c++-win32-$VERSION.zip"
+  echo "Don't forget to push changes:"
+  echo "  git push origin $PUSH"
+
+  read -s -n 1 -p "Shall I push to git and upload to capnproto.org now? (y/N)" YESNO
+
+  echo
+  case "$YESNO" in
+    y | Y )
+      doit git push origin $PUSH
+      doit gcutil push fe capnproto-c++-$VERSION.tar.gz capnproto-c++-win32-$VERSION.zip \
+          /var/www/capnproto.org
+
+      if [ "$FINAL" = yes ]; then
+        echo "========================================================================="
+        echo "Publishing docs"
+        echo "========================================================================="
+        cd doc
+        doit ./push-site.sh
+        cd ..
+        echo "========================================================================="
+        echo "Really done"
+        echo "========================================================================="
+      fi
+
+      echo "Release is available at:"
+      echo "  http://capnproto.org/capnproto-c++-$VERSION.tar.gz"
+      ;;
+    * )
+      echo "OK, do it yourself then."
+      ;;
+  esac
+}
+
+BRANCH=$(git rev-parse --abbrev-ref HEAD)
+
+case "${1-}:$BRANCH" in
+  # ======================================================================================
+  candidate:master )
+    echo "New major release."
+
+    if [ $# -gt 1 ]; then
+      echo "Cannot cherry-pick when starting from master.  Do it yourself." >&2
+      exit 1
+    fi
+
+    HEAD_VERSION=$(get_version '^[0-9]+[.][0-9]+-dev$')
+    RELEASE_VERSION=${HEAD_VERSION%%-dev}.0
+
+    echo "Version: $RELEASE_VERSION"
+
+    echo "========================================================================="
+    echo "Creating release branch..."
+    echo "========================================================================="
+    doit git checkout -b release-$RELEASE_VERSION
+
+    update_version $HEAD_VERSION $RELEASE_VERSION-rc1 "release branch"
+
+    build_packages $RELEASE_VERSION-rc1
+
+    echo "========================================================================="
+    echo "Updating version in master branch..."
+    echo "========================================================================="
+
+    doit git checkout master
+    declare -a VERSION_ARR=(${RELEASE_VERSION//./ })
+    NEXT_VERSION=${VERSION_ARR[0]}.$((VERSION_ARR[1] + 1))
+
+    update_version $HEAD_VERSION $NEXT_VERSION-dev "mainlaine"
+
+    done_banner $RELEASE_VERSION-rc1 "master release-$RELEASE_VERSION" no
+    ;;
+
+  # ======================================================================================
+  candidate:release-* )
+    echo "New release candidate."
+    OLD_VERSION=$(get_release_version)
+
+    if [[ $OLD_VERSION == *-rc* ]]; then
+      # New release candidate for existing release.
+
+      RC=${OLD_VERSION##*-rc}
+      BRANCH_VERSION=${OLD_VERSION%%-rc*}
+      RC_VERSION=$BRANCH_VERSION-rc$(( RC + 1 ))
+
+      echo "Version: $RC_VERSION"
+    else
+      # New micro release.
+
+      declare -a VERSION_ARR=(${OLD_VERSION//./ })
+      BRANCH_VERSION=${VERSION_ARR[0]}.${VERSION_ARR[1]}.$((VERSION_ARR[2] + 1))
+
+      RC_VERSION=$BRANCH_VERSION-rc1
+      echo "Version: $RC_VERSION"
+
+      echo "========================================================================="
+      echo "Creating new release branch..."
+      echo "========================================================================="
+
+      doit git checkout -b release-$BRANCH_VERSION
+    fi
+
+    echo "========================================================================="
+    echo "Updating version number to $RC_VERSION..."
+    echo "========================================================================="
+
+    update_version $OLD_VERSION $RC_VERSION "release branch"
+
+    cherry_pick "$@"
+
+    build_packages $RC_VERSION
+
+    done_banner $RC_VERSION release-$BRANCH_VERSION no
+    ;;
+
+  # ======================================================================================
+  final:release-* )
+    echo "Final release."
+    OLD_VERSION=$(get_release_version)
+
+    if [[ $OLD_VERSION != *-rc* ]]; then
+      echo "Current version is already a final release.  You need to create a new candidate first." >&2
+      exit 1
+    fi
+
+    if [ $# -gt 1 ]; then
+      echo "Cannot cherry-pick into final release.  Make another candidate." >&2
+      exit 1
+    fi
+
+    RC=${OLD_VERSION##*-rc}
+    NEW_VERSION=${OLD_VERSION%%-rc*}
+
+    echo "Version: $NEW_VERSION"
+
+    echo "========================================================================="
+    echo "Updating version number to $NEW_VERSION..."
+    echo "========================================================================="
+
+    doit sed -i -re "s/capnproto-c[+][+]-[0-9]+[.][0-9]+[.][0-9]+([.][0-9]+)?\>/capnproto-c++-$NEW_VERSION/g" doc/install.md
+    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
+    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
+    update_version $OLD_VERSION $NEW_VERSION "release branch"
+
+    doit git tag v$NEW_VERSION
+
+    build_packages $NEW_VERSION
+
+    done_banner $NEW_VERSION "v$NEW_VERSION release-$NEW_VERSION" yes
+    ;;
+
+  # ======================================================================================
+  security:release-* )
+    echo "Security release."
+    OLD_VERSION=$(get_release_version)
+
+    if [[ $OLD_VERSION == *-rc* ]]; then
+      echo "Security releases don't have candidates." >&2
+      exit 1
+    fi
+
+    declare -a VERSION_ARR=(${OLD_VERSION//./ } 0)
+    NEW_VERSION=${VERSION_ARR[0]}.${VERSION_ARR[1]}.${VERSION_ARR[2]}.$((VERSION_ARR[3] + 1))
+
+    echo "Version: $NEW_VERSION"
+
+    echo "========================================================================="
+    echo "Updating version number to $NEW_VERSION..."
+    echo "========================================================================="
+
+    doit sed -i -re "s/capnproto-c[+][+]-[0-9]+[.][0-9]+[.][0-9]+([.][0-9]+)?\>/capnproto-c++-$NEW_VERSION/g" doc/install.md
+    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
+    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
+    update_version $OLD_VERSION $NEW_VERSION "release branch"
+
+    cherry_pick "$@"
+
+    doit git tag v$NEW_VERSION
+
+    build_packages $NEW_VERSION
+
+    done_banner $NEW_VERSION "v$NEW_VERSION release-$NEW_VERSION" yes
+    ;;
+
+  # ======================================================================================
+  retry:release-* )
+    echo "Retrying release."
+    OLD_VERSION=$(get_release_version)
+    echo "Version: $OLD_VERSION"
+
+    if [[ $OLD_VERSION == *-rc* ]]; then
+      # We can add more cherry-picks when retrying a candidate.
+      cherry_pick "$@"
+    else
+      if [ $# -gt 1 ]; then
+        echo "Cannot cherry-pick into final release.  Make another candidate." >&2
+        exit 1
+      fi
+    fi
+
+    OLD_VERSION=$(get_release_version)
+    build_packages $OLD_VERSION
+
+    if [[ $OLD_VERSION == *-rc* ]]; then
+      BRANCH_VERSION=${OLD_VERSION%%-rc*}
+      done_banner $OLD_VERSION release-$BRANCH_VERSION no
+    else
+      doit git tag v$OLD_VERSION
+      done_banner $OLD_VERSION "v$OLD_VERSION release-$OLD_VERSION" no
+    fi
+    ;;
+
+  # ======================================================================================
+  *:master )
+    echo "Invalid command for mainline branch.  Only command is 'candidate'." >&2
+    exit 1
+    ;;
+
+  *:release-* )
+    echo "Invalid command for release branch.  Commands are 'candidate', 'final', and 'retry'." >&2
+    exit 1
+    ;;
+
+  * )
+    echo "Not a master or release branch." >&2
+    exit 1
+    ;;
+esac