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