release.sh 9.38 KB
Newer Older
1
#! /usr/bin/env bash
2 3 4

set -euo pipefail

5 6 7 8 9
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

10
if (egrep -r 'TODO\((now|soon)\)' *); then
11 12 13 14
  echo '*** Error:  There are release-blocking TODOs in the code.' >&2
  exit 1
fi

15 16
doit() {
  echo "@@@@ $@"
Kenton Varda's avatar
Kenton Varda committed
17
  "$@"
Kenton Varda's avatar
Kenton Varda committed
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
}

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]+)?$'
}

update_version() {
  local OLD=$1
  local NEW=$2
  local BRANCH_DESC=$3

  local OLD_REGEX=${OLD//./[.]}
39
  doit sed -i -e "s/$OLD_REGEX/$NEW/g" c++/configure.ac
40 41 42 43 44 45 46 47 48

  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

49 50
  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" \
Kenton Varda's avatar
Kenton Varda committed
51
      c++/src/*/*.capnp.h c++/src/*/*/*.capnp.h
52

Kenton Varda's avatar
Kenton Varda committed
53 54 55 56 57 58 59 60
  doit git commit -a -m "Set $BRANCH_DESC version to $NEW."
}

build_packages() {
  local VERSION=$1
  local VERSION_BASE=${VERSION%%-*}

  echo "========================================================================="
61
  echo "Building C++ package..."
Kenton Varda's avatar
Kenton Varda committed
62 63 64 65 66
  echo "========================================================================="
  cd c++
  doit ./setup-autotools.sh | tr = -
  doit autoreconf -i
  doit ./configure
67 68
  doit make -j6 distcheck
  doit make dist-zip
Kenton Varda's avatar
Kenton Varda committed
69
  doit mv capnproto-c++-$VERSION.tar.gz ..
70 71 72 73 74
  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
75
  doit i686-w64-mingw32-strip capnp.exe capnpc-c++.exe capnpc-capnp.exe
76 77 78
  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
Kenton Varda's avatar
Kenton Varda committed
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
  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
96
  local FINAL=$3
Kenton Varda's avatar
Kenton Varda committed
97 98 99 100 101
  echo "========================================================================="
  echo "Done"
  echo "========================================================================="
  echo "Ready to release:"
  echo "  capnproto-c++-$VERSION.tar.gz"
102
  echo "  capnproto-c++-win32-$VERSION.zip"
Kenton Varda's avatar
Kenton Varda committed
103 104
  echo "Don't forget to push changes:"
  echo "  git push origin $PUSH"
105

106
  read -s -n 1 -p "Shall I push to git and upload to capnproto.org now? (y/N)" YESNO
107 108 109 110 111

  echo
  case "$YESNO" in
    y | Y )
      doit git push origin $PUSH
112
      doit gcutil push fe capnproto-c++-$VERSION.tar.gz capnproto-c++-win32-$VERSION.zip \
113
          /var/www/capnproto.org
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

      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
134 135 136 137
}

BRANCH=$(git rev-parse --abbrev-ref HEAD)

Kenton Varda's avatar
Kenton Varda committed
138 139 140 141 142 143 144
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
145 146 147
      exit 1
    fi

Kenton Varda's avatar
Kenton Varda committed
148 149
    HEAD_VERSION=$(get_version '^[0-9]+[.][0-9]+-dev$')
    RELEASE_VERSION=${HEAD_VERSION%%-dev}.0
150

Kenton Varda's avatar
Kenton Varda committed
151
    echo "Version: $RELEASE_VERSION"
152 153 154 155

    echo "========================================================================="
    echo "Creating release branch..."
    echo "========================================================================="
Kenton Varda's avatar
Kenton Varda committed
156
    doit git checkout -b release-$RELEASE_VERSION
157

Kenton Varda's avatar
Kenton Varda committed
158
    update_version $HEAD_VERSION $RELEASE_VERSION-rc1 "release branch"
159

Kenton Varda's avatar
Kenton Varda committed
160
    build_packages $RELEASE_VERSION-rc1
161 162 163 164

    echo "========================================================================="
    echo "Updating version in master branch..."
    echo "========================================================================="
Kenton Varda's avatar
Kenton Varda committed
165

166
    doit git checkout master
Kenton Varda's avatar
Kenton Varda committed
167
    declare -a VERSION_ARR=(${RELEASE_VERSION//./ })
168
    NEXT_VERSION=${VERSION_ARR[0]}.$((VERSION_ARR[1] + 1))
Kenton Varda's avatar
Kenton Varda committed
169 170 171

    update_version $HEAD_VERSION $NEXT_VERSION-dev "mainlaine"

172
    done_banner $RELEASE_VERSION-rc1 "master release-$RELEASE_VERSION" no
Kenton Varda's avatar
Kenton Varda committed
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
    ;;

  # ======================================================================================
  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
203 204

    echo "========================================================================="
Kenton Varda's avatar
Kenton Varda committed
205
    echo "Updating version number to $RC_VERSION..."
206
    echo "========================================================================="
Kenton Varda's avatar
Kenton Varda committed
207 208 209 210 211 212 213

    update_version $OLD_VERSION $RC_VERSION "release branch"

    cherry_pick "$@"

    build_packages $RC_VERSION

214
    done_banner $RC_VERSION release-$BRANCH_VERSION no
215 216
    ;;

Kenton Varda's avatar
Kenton Varda committed
217 218 219 220 221 222 223
  # ======================================================================================
  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
224
      exit 1
Kenton Varda's avatar
Kenton Varda committed
225 226 227 228
    fi

    if [ $# -gt 1 ]; then
      echo "Cannot cherry-pick into final release.  Make another candidate." >&2
229
      exit 1
Kenton Varda's avatar
Kenton Varda committed
230 231 232 233 234 235 236 237 238 239 240
    fi

    RC=${OLD_VERSION##*-rc}
    NEW_VERSION=${OLD_VERSION%%-rc*}

    echo "Version: $NEW_VERSION"

    echo "========================================================================="
    echo "Updating version number to $NEW_VERSION..."
    echo "========================================================================="

241
    doit sed -i -re "s/capnproto-c[+][+]-[0-9]+[.][0-9]+[.][0-9]+\>/capnproto-c++-$NEW_VERSION/g" doc/install.md
242
    doit sed -i -re "s/capnproto-c[+][+]-win32-[0-9]+[.][0-9]+[.][0-9]+\>/capnproto-c++-win32-$NEW_VERSION/g" doc/install.md
Kenton Varda's avatar
Kenton Varda committed
243
    doit sed -i -re "s/capnproto-tools-win32-[0-9]+[.][0-9]+[.][0-9]+\>/capnproto-tools-win32-$NEW_VERSION/g" doc/install.md
Kenton Varda's avatar
Kenton Varda committed
244 245
    update_version $OLD_VERSION $NEW_VERSION "release branch"

246 247
    doit git tag v$NEW_VERSION

Kenton Varda's avatar
Kenton Varda committed
248 249
    build_packages $NEW_VERSION

250
    done_banner $NEW_VERSION "v$NEW_VERSION release-$NEW_VERSION" yes
Kenton Varda's avatar
Kenton Varda committed
251 252 253 254 255 256 257 258 259 260 261
    ;;

  # ======================================================================================
  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 "$@"
262
    else
Kenton Varda's avatar
Kenton Varda committed
263 264 265 266
      if [ $# -gt 1 ]; then
        echo "Cannot cherry-pick into final release.  Make another candidate." >&2
        exit 1
      fi
267
    fi
Kenton Varda's avatar
Kenton Varda committed
268 269 270

    OLD_VERSION=$(get_release_version)
    build_packages $OLD_VERSION
271 272 273 274 275 276 277 278

    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
Kenton Varda's avatar
Kenton Varda committed
279 280 281 282 283 284 285 286 287 288 289
    ;;

  # ======================================================================================
  *: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
290 291 292 293 294
    ;;

  * )
    echo "Not a master or release branch." >&2
    exit 1
Kenton Varda's avatar
Kenton Varda committed
295
    ;;
296
esac