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