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