File: release.sh

package info (click to toggle)
node-katex 0.10.2%2Bdfsg-8
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 10,320 kB
  • sloc: javascript: 21,248; perl: 2,884; python: 390; sh: 329; makefile: 109
file content (228 lines) | stat: -rwxr-xr-x 7,353 bytes parent folder | download
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