1 | #!/bin/bash
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 | set -e
|
16 |
|
17 | jq --version > /dev/null || (echo "jq is required: please install it"; kill $$)
|
18 | if [[ `command -v hub` ]] && [[ `hub --version` =~ hub[[:space:]]version[[:space:]]([0-9]*).([0-9]*) ]]; then
|
19 | HUB_VERSION_MAJOR=${BASH_REMATCH[1]}
|
20 | HUB_VERSION_MINOR=${BASH_REMATCH[2]}
|
21 | if [[ $HUB_VERSION_MAJOR -lt 2 ]] || [[ $HUB_VERSION_MAJOR -eq 2 && $HUB_VERSION_MINOR -lt 5 ]]; then
|
22 | echo "hub version 2.5 is required, you have $HUB_VERSION_MAJOR.$HUB_VERSION_MINOR installed"
|
23 | exit
|
24 | fi
|
25 | else
|
26 | echo "hub is required: please install it"
|
27 | exit
|
28 | fi
|
29 | npm --version > /dev/null || (echo "npm is required: please install it"; kill $$)
|
30 | yarn --version > /dev/null || (echo "yarn is required: please install it"; kill $$)
|
31 |
|
32 | USAGE="$0 [-xz] [-c changelog_file] vX.Y.Z"
|
33 |
|
34 | help() {
|
35 | cat <<EOF
|
36 | $USAGE
|
37 |
|
38 | -c changelog_file: specify name of file containing changelog
|
39 | -x: skip updating the changelog
|
40 | -z: skip generating the jsdoc
|
41 | EOF
|
42 | }
|
43 |
|
44 | ret=0
|
45 | cat package.json | jq '.dependencies[]' | grep -q '#develop' || ret=$?
|
46 | if [ "$ret" -eq 0 ]; then
|
47 | echo "package.json contains develop dependencies. Refusing to release."
|
48 | exit
|
49 | fi
|
50 |
|
51 | if ! git diff-index --quiet --cached HEAD; then
|
52 | echo "this git checkout has staged (uncommitted) changes. Refusing to release."
|
53 | exit
|
54 | fi
|
55 |
|
56 | if ! git diff-files --quiet; then
|
57 | echo "this git checkout has uncommitted changes. Refusing to release."
|
58 | exit
|
59 | fi
|
60 |
|
61 | skip_changelog=
|
62 | skip_jsdoc=
|
63 | changelog_file="CHANGELOG.md"
|
64 | expected_npm_user="matrixdotorg"
|
65 | while getopts hc:u:xz f; do
|
66 | case $f in
|
67 | h)
|
68 | help
|
69 | exit 0
|
70 | ;;
|
71 | c)
|
72 | changelog_file="$OPTARG"
|
73 | ;;
|
74 | x)
|
75 | skip_changelog=1
|
76 | ;;
|
77 | z)
|
78 | skip_jsdoc=1
|
79 | ;;
|
80 | u)
|
81 | expected_npm_user="$OPTARG"
|
82 | ;;
|
83 | esac
|
84 | done
|
85 | shift `expr $OPTIND - 1`
|
86 |
|
87 | if [ $# -ne 1 ]; then
|
88 | echo "Usage: $USAGE" >&2
|
89 | exit 1
|
90 | fi
|
91 |
|
92 | if [ -z "$skip_changelog" ]; then
|
93 |
|
94 | update_changelog -h > /dev/null || (echo "github-changelog-generator is required: please install it"; exit)
|
95 | fi
|
96 |
|
97 |
|
98 |
|
99 | actual_npm_user=`npm whoami`;
|
100 | if [ $expected_npm_user != $actual_npm_user ]; then
|
101 | echo "you need to be logged into npm as $expected_npm_user, but you are logged in as $actual_npm_user" >&2
|
102 | exit 1
|
103 | fi
|
104 |
|
105 |
|
106 | release="${1#v}"
|
107 | tag="v${release}"
|
108 | rel_branch="release-$tag"
|
109 |
|
110 | prerelease=0
|
111 |
|
112 |
|
113 |
|
114 |
|
115 | echo $release | grep -q '-' && prerelease=1
|
116 |
|
117 | if [ $prerelease -eq 1 ]; then
|
118 | echo Making a PRE-RELEASE
|
119 | fi
|
120 |
|
121 | if [ -z "$skip_changelog" ]; then
|
122 | if ! command -v update_changelog >/dev/null 2>&1; then
|
123 | echo "release.sh requires github-changelog-generator. Try:" >&2
|
124 | echo " pip install git+https://github.com/matrix-org/github-changelog-generator.git" >&2
|
125 | exit 1
|
126 | fi
|
127 | fi
|
128 |
|
129 |
|
130 |
|
131 |
|
132 |
|
133 | curbranch=$(git symbolic-ref --short HEAD)
|
134 | if [[ "$curbranch" != release* ]]; then
|
135 | echo "Creating release branch"
|
136 | git checkout -b "$rel_branch"
|
137 | else
|
138 | echo "Using current branch ($curbranch) for release"
|
139 | rel_branch=$curbranch
|
140 | fi
|
141 |
|
142 | if [ -z "$skip_changelog" ]; then
|
143 | echo "Generating changelog"
|
144 | update_changelog -f "$changelog_file" "$release"
|
145 | read -p "Edit $changelog_file manually, or press enter to continue " REPLY
|
146 |
|
147 | if [ -n "$(git ls-files --modified $changelog_file)" ]; then
|
148 | echo "Committing updated changelog"
|
149 | git commit "$changelog_file" -m "Prepare changelog for $tag"
|
150 | fi
|
151 | fi
|
152 | latest_changes=`mktemp`
|
153 | cat "${changelog_file}" | `dirname $0`/scripts/changelog_head.py > "${latest_changes}"
|
154 |
|
155 | set -x
|
156 |
|
157 |
|
158 | echo "yarn version"
|
159 |
|
160 |
|
161 |
|
162 |
|
163 |
|
164 | yarn version --no-git-tag-version --new-version "$release"
|
165 |
|
166 |
|
167 | if [[ -f yarn.lock && `git status --porcelain yarn.lock | grep '^ M'` ]];
|
168 | then
|
169 | pkglock='yarn.lock'
|
170 | else
|
171 | pkglock=''
|
172 | fi
|
173 | git commit package.json $pkglock -m "$tag"
|
174 |
|
175 |
|
176 |
|
177 | signing_id=
|
178 | if [ -f release_config.yaml ]; then
|
179 | signing_id=`cat release_config.yaml | python -c "import yaml; import sys; print yaml.load(sys.stdin)['signing_id']"`
|
180 | fi
|
181 |
|
182 |
|
183 |
|
184 |
|
185 |
|
186 |
|
187 |
|
188 |
|
189 |
|
190 | assets=''
|
191 | dodist=0
|
192 | jq -e .scripts.dist package.json 2> /dev/null || dodist=$?
|
193 | if [ $dodist -eq 0 ]; then
|
194 | projdir=`pwd`
|
195 | builddir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
|
196 | echo "Building distribution copy in $builddir"
|
197 | pushd "$builddir"
|
198 | git clone "$projdir" .
|
199 | git checkout "$rel_branch"
|
200 |
|
201 |
|
202 |
|
203 |
|
204 | yarn cache clean
|
205 | yarn install
|
206 |
|
207 |
|
208 | DIST_VERSION="$tag" yarn dist
|
209 |
|
210 | popd
|
211 |
|
212 | for i in "$builddir"/dist/*; do
|
213 | assets="$assets -a $i"
|
214 | if [ -n "$signing_id" ]
|
215 | then
|
216 | gpg -u "$signing_id" --armor --output "$i".asc --detach-sig "$i"
|
217 | assets="$assets -a $i.asc"
|
218 | fi
|
219 | done
|
220 | fi
|
221 |
|
222 | if [ -n "$signing_id" ]; then
|
223 |
|
224 |
|
225 | GIT_COMMITTER_EMAIL="$signing_id" GPG_TTY=`tty` git tag -u "$signing_id" -F "${latest_changes}" "$tag"
|
226 | else
|
227 | git tag -a -F "${latest_changes}" "$tag"
|
228 | fi
|
229 |
|
230 |
|
231 | git push origin "$rel_branch" "$tag"
|
232 |
|
233 | if [ -n "$signing_id" ]; then
|
234 |
|
235 |
|
236 |
|
237 |
|
238 |
|
239 |
|
240 |
|
241 |
|
242 |
|
243 |
|
244 |
|
245 |
|
246 | source_sigfile="${tag}-src.tar.gz.asc"
|
247 |
|
248 | tarfile="$tag.tar.gz"
|
249 | gh_project_url=$(git remote get-url origin |
|
250 | sed -e 's#^git@github\.com:#https://github.com/#' \
|
251 | -e 's#^git\+ssh://git@github\.com/#https://github.com/#' \
|
252 | -e 's/\.git$//')
|
253 | project_name="${gh_project_url##*/}"
|
254 | curl -L "${gh_project_url}/archive/${tarfile}" -o "${tarfile}"
|
255 |
|
256 |
|
257 | if ! cmp --silent <(gunzip -c $tarfile) \
|
258 | <(git archive --format tar --prefix="${project_name}-${release}/" "$tag"); then
|
259 |
|
260 |
|
261 |
|
262 | cat >&2 <<EOF
|
263 | !!!!!!!!!!!!!!!!!
|
264 | !!!! WARNING !!!!
|
265 |
|
266 | Mismatch between our own tarfile and that generated by github: not signing
|
267 | source tarball.
|
268 |
|
269 | To resolve, determine if $tarfile is correct, and if so sign it with gpg and
|
270 | attach it to the release as $source_sigfile.
|
271 |
|
272 | !!!!!!!!!!!!!!!!!
|
273 | EOF
|
274 | else
|
275 | gpg -u "$signing_id" --armor --output "$source_sigfile" --detach-sig "$tarfile"
|
276 | assets="$assets -a $source_sigfile"
|
277 | fi
|
278 | fi
|
279 |
|
280 | hubflags=''
|
281 | if [ $prerelease -eq 1 ]; then
|
282 | hubflags='-p'
|
283 | fi
|
284 |
|
285 | release_text=`mktemp`
|
286 | echo "$tag" > "${release_text}"
|
287 | echo >> "${release_text}"
|
288 | cat "${latest_changes}" >> "${release_text}"
|
289 | hub release create $hubflags $assets -F "${release_text}" "$tag"
|
290 |
|
291 | if [ $dodist -eq 0 ]; then
|
292 | rm -rf "$builddir"
|
293 | fi
|
294 | rm "${release_text}"
|
295 | rm "${latest_changes}"
|
296 |
|
297 |
|
298 |
|
299 |
|
300 |
|
301 | npm publish --tag next
|
302 | if [ $prerelease -eq 0 ]; then
|
303 |
|
304 | package=$(cat package.json | jq -er .name)
|
305 | npm dist-tag add "$package@$release" latest
|
306 | fi
|
307 |
|
308 | if [ -z "$skip_jsdoc" ]; then
|
309 | echo "generating jsdocs"
|
310 | yarn gendoc
|
311 |
|
312 | echo "copying jsdocs to gh-pages branch"
|
313 | git checkout gh-pages
|
314 | git pull
|
315 | cp -a ".jsdoc/matrix-js-sdk/$release" .
|
316 | perl -i -pe 'BEGIN {$rel=shift} $_ =~ /^<\/ul>/ && print
|
317 | "<li><a href=\"${rel}/index.html\">Version ${rel}</a></li>\n"' \
|
318 | $release index.html
|
319 | git add "$release"
|
320 | git commit --no-verify -m "Add jsdoc for $release" index.html "$release"
|
321 | fi
|
322 |
|
323 |
|
324 | if [ $prerelease -eq 1 ]; then
|
325 | git checkout "$rel_branch"
|
326 | exit 0
|
327 | fi
|
328 |
|
329 |
|
330 | echo "updating master branch"
|
331 | git checkout master
|
332 | git pull
|
333 | git merge "$rel_branch"
|
334 |
|
335 |
|
336 | git push origin master
|
337 | if [ -z "$skip_jsdoc" ]; then
|
338 | git push origin gh-pages
|
339 | fi
|
340 |
|
341 |
|
342 | git checkout develop
|
343 | git pull
|
344 | git merge master
|
345 | git push origin develop
|