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