forked from KaTeX/KaTeX
-
Notifications
You must be signed in to change notification settings - Fork 0
/
release.sh
executable file
·228 lines (201 loc) · 7.18 KB
/
release.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
#!/usr/bin/env bash
set -e -o pipefail
shopt -s extglob
VERSION=
NEXT_VERSION=
BRANCH=$(git rev-parse --abbrev-ref HEAD)
ORIGIN=${ORIGIN:-origin}
NARGS=0
DRY_RUN=
PUBLISH=
INSANE=0
# usage [ERROR-MESSAGES...] EXIT-CODE
usage() {
while [[ $# -gt 1 ]]; do
echo "$1" >&2
shift
done
echo "Usage:"
echo "./release.sh [OPTIONS] <VERSION_TO_RELEASE> [NEXT_VERSION]"
echo ""
echo "Options:"
echo " --publish|-p: publish a release."
echo " --dry-run|-n: only print commands, do not execute them."
echo ""
echo "You may omit NEXT_VERSION in order to avoid updating the version field"
echo "of the package.json."
echo ""
echo "Run this on the master branch. This will create a release branch."
echo "Open a pull request and after it gets merged, run with --publish"
echo "option on the master branch."
echo ""
echo "To update SRI hashes, run this again on the generated release branch"
echo ""
echo "Examples:"
echo " When releasing a v0.6.3:"
echo " ./release.sh 0.6.3 0.6.4"
echo " Open a pull request from v0.6.3-release to master."
echo " After it's merged:"
echo " ./release.sh -p 0.6.3"
exit $1
}
while [ $# -gt 0 ]; do
case "$1" in
--dry-run|-n|--just-print)
DRY_RUN=true
git() { echo "git $*"; }
npm() { echo "npm $*"; }
yarn() { echo "yarn $*"; }
;;
--publish|-p)
PUBLISH=true
;;
-h|-\?|--help)
usage 0
;;
-*)
usage "Unknown option: $1" "" 1
;;
*)
case "$NARGS" in
0)
VERSION="$1"
NARGS=1
;;
1)
NEXT_VERSION="$1"
NARGS=2
;;
*)
usage "Too many arguments: $1" "" 1
;;
esac
;;
esac
shift
done
if [[ $NARGS = 0 ]]; then
usage "Missing argument: version number" "" 1
fi
# Some sanity checks up front
if ! command git diff --stat --exit-code HEAD; then
echo "Please make sure you have no uncommitted changes" >&2
: $((++INSANE))
fi
if [[ $BRANCH != @(v*-release|master) ]]; then
echo "'$BRANCH' does not look like a release branch to me" >&2
: $((++INSANE))
fi
if [[ $PUBLISH ]]; then
echo "About to publish $VERSION from $BRANCH. "
elif [[ $BRANCH == @(v*-release) ]]; then
echo "About to update SRI hashes for $BRANCH. "
elif [[ ! $NEXT_VERSION ]]; then
echo "About to release $VERSION from $BRANCH. "
else
echo "About to release $VERSION from $BRANCH and bump to $NEXT_VERSION-pre."
fi
if [[ $INSANE != 0 ]]; then
read -r -p "$INSANE sanity check(s) failed, really proceed? [y/n] " CONFIRM
else
read -r -p "Look good? [y/n] " CONFIRM
fi
if [[ $CONFIRM != "y" ]]; then
exit 1
fi
git checkout "$BRANCH"
git pull
if [[ ! $PUBLISH ]]; then
# Make a release branch
git checkout -B "v$VERSION-release"
# Edit package.json to the right version, as it's inlined (see
# http://stackoverflow.com/a/22084103 for why we need the .bak file to make
# this mac & linux compatible)
sed -i.bak -E 's|"version": "[^"]+",|"version": "'$VERSION'",|' package.json
rm -f package.json.bak
# Build generated files
yarn build
if [[ $BRANCH != @(v*-release) ]]; then
if [ ! -z "$NEXT_VERSION" ]; then
# Edit package.json to the next version
sed -i.bak -E 's|"version": "[^"]+",|"version": "'$NEXT_VERSION'-pre",|' package.json
rm -f package.json.bak
fi
# Edit docs to use CSS from CDN
grep -l '/static/' docs/*.md | xargs sed -i.bak \
's|/static/\([^"]\+\)|https://cdn.jsdelivr.net/npm/katex@./dist/\1" integrity="sha384-\1" crossorigin="anonymous|'
# Update the version number in CDN URLs included in the README and the documentation,
# and regenerate the Subresource Integrity hash for these files.
node update-sri.js "$VERSION" README.md contrib/*/README.md \
docs/*.md docs/*.md.bak website/pages/index.html
# Generate a new version of the docs
pushd website
yarn run version "$VERSION"
popd
# Restore docs to use local built CSS
for file in docs/*.md.bak; do
mv -f "$file" "${file%.bak}"
done
else
# Restore package.json
git checkout package.json
# Regenerate the Subresource Integrity hash in the README and the documentation
node update-sri.js "$VERSION" README.md contrib/*/README.md \
docs/*.md website/pages/index.html website/versioned_docs/version-$VERSION/*.md
fi
# Make the commit and push
git add package.json README.md contrib/*/README.md \
docs website/pages/index.html website/versioned_docs/ \
website/versioned_sidebars/ website/versions.json
if [[ $BRANCH == @(v*-release) ]]; then
git commit -n -m "Update SRI hashes"
elif [[ ! $NEXT_VERSION ]]; then
git commit -n -m "Release v$VERSION"
else
git commit -n -m "Release v$VERSION" -m "Bump $BRANCH to v$NEXT_VERSION-pre"
fi
git push -u "$ORIGIN" "v$VERSION-release"
echo ""
echo "The automatic parts are done!"
echo "Now create a pull request against master from 'v$VERSION-release'"
echo "Visit https://github.com/KaTeX/KaTeX/pulls to open a pull request."
echo "After it gets merged, run './release.sh -p $VERSION'!"
echo "Note that if KaTeX source code is changed after running this script,"
echo "you have to run the release script again."
else
# Make a new detached HEAD
git checkout --detach
# Edit package.json to the right version
sed -i.bak -E 's|"version": "[^"]+",|"version": "'$VERSION'",|' package.json
rm -f package.json.bak
# Build generated files and add them to the repository
git clean -fdx dist
yarn dist
sed -i.bak -E '/^\/dist\/$/d' .gitignore
rm -f .gitignore.bak
# Check Subresource Integrity hashes
node update-sri.js check README.md contrib/*/README.md
# Make the commit and tag, and push them.
git add package.json .gitignore dist/
git commit -n -m "v$VERSION"
git diff --stat --exit-code # check for uncommitted changes
git tag -a "v$VERSION" -m "v$VERSION"
git push "$ORIGIN" "v$VERSION"
# Update npm (cdnjs update automatically)
# Fallback to npm publish, if yarn cannot authenticate, e.g., 2FA
yarn publish --new-version "$VERSION" || npm publish
echo ""
echo "The automatic parts are done!"
echo "Now all that's left is to create the release on GitHub."
echo "Visit https://github.com/KaTeX/KaTeX/releases/new?tag=v$VERSION to edit the release notes."
echo "Don't forget to upload katex.tar.gz and katex.zip to the release!"
fi
git diff --stat --exit-code # check for uncommitted changes
if [[ $DRY_RUN ]]; then
echo ""
echo "This was a dry run."
echo "Operations using git or yarn were printed not executed."
echo "Some files got modified, though, so you might want to undo "
echo "these changes now, e.g. using \`git checkout -- .\` or similar."
echo ""
fi