]> git.gir.st - VimFx.git/blob - release.sh
Better LegacyFox Link
[VimFx.git] / release.sh
1 #!/bin/sh
2
3 :<<'DOCS'
4 (helps to) prepare a new VimFx release.
5
6 note: by default, my (@girst's) pretty idiosyncratic development environment is
7 assumed to be present (i'm pushing unstable commits to a second git-remote and
8 only push 'release-quality' commits to upstream). these are easily overwritten
9 by passing them in the calling environment. alternatively, changes to can be
10 temporarily ignored by git with `git update-index --assume-unchanged FILE`.
11
12 inspired by https://drewdevault.com/2019/10/12/how-to-fuck-up-releases.html
13 DOCS
14
15 # shadowable defaults:
16 : "${devel=origin/master}"
17 : "${release=upstream/master}"
18 : "${git_user=girst}"
19 : "${git_email=girst@users.noreply.github.com}"
20 : "${devel_url=git@git.gir.st:VimFx.git}"
21 : "${release_url=https://github.com/akhodakivskiy/VimFx}"
22
23 set -e
24 export LC_ALL=C
25
26 die() {
27 echo "$@" >&2
28 exit 1
29 }
30
31 last_version=$(awk -F\" '$2 == "version" { print $4 ; exit }' package.json)
32 inc_version() {
33 echo "$last_version" |
34 awk -F. -vOFS=. '{ $ver++; while(ver++<NF) $ver=0; print $0 }' ver="$1"
35 }
36
37 case "$1" in
38 patch) next_version=$(inc_version 3) ;;
39 minor) next_version=$(inc_version 2) ;;
40 major) die "no." ;;
41 *) die "Usage: $0 {minor|patch}"
42 esac
43
44 # make sure my idiosyncratic development setup is present
45 test "$(git config --show user.name | cut -f2)" = "$git_user" ||
46 die "username not set to $git_user, aborting."
47 test "$(git config --show user.email | cut -f2)" = "$git_email" ||
48 die "email not set to $git_email, aborting."
49 git remote show | grep -q "${devel%%/*}" ||
50 die "there is no development remote, aborting."
51 git remote show | grep -q "${release%%/*}" ||
52 die "there is no release remote, aborting."
53 test "$(git remote get-url "${devel%%/*}")" = "$devel_url" ||
54 die "development remote not set up, aborting."
55 test "$(git remote get-url "${release%%/*}")" = "$release_url" ||
56 die "release remote not set up, aborting."
57
58 # make sure we are on the master branch
59 git rev-parse --abbrev-ref HEAD | grep -q '^master$' ||
60 die "not on branch master, aborting."
61
62 # make sure changes are committed. ignores untracked local files (todo-lists).
63 git diff-index HEAD --quiet || {
64 git status --porcelain --untracked-files=no >&2
65 die "uncommited changes found, aborting.";}
66
67 # make sure local repo is up to date (push to devel and pull from release first)
68 git remote update
69 git rev-list "HEAD...$devel" | grep -q . && # rebased?
70 die "local out of date (v. $devel), aborting. consider git push --force-with-lease ${devel%%/*}"
71 git rev-list "HEAD..$release" | grep -q . && # pulled?
72 die "local out of date (v. $release), aborting. consider issuing git pull --rebase ${release%%/*}"
73
74 # at this point, we should save the current HEAD, so we can restore later on
75 old_head=$(git rev-parse HEAD)
76
77 # lint coffee files
78 npm --silent run -- gulp --silent lint coffee ||
79 die "linting errors detected, aborting."
80
81 # update CHANGELOG.md and ask user to confirm changes
82 cat <<EOF | ed -s CHANGELOG.md
83 1i
84 ### $next_version (`date +%Y-%m-%d`)
85
86
87 .
88 2r !git log --reverse --format="- "\%s v$last_version..HEAD
89 wq
90 EOF
91 ${VISUAL:-$EDITOR} CHANGELOG.md
92
93 # increment version number in package.json
94 sed -i "/\"version\":/s/$last_version/$next_version/" package.json
95
96 # commit and tag release
97 git add CHANGELOG.md package.json
98 git commit -m "VimFx v$next_version"
99 git tag "v$next_version"
100
101 # build xpi for release on github
102 npm --silent run -- gulp --silent xpi --unlisted
103
104 printf "continue pushing to upstream repository [y/N]: " >&2
105 read -r confirm
106 case "$confirm" in
107 [!yY]) git reset --hard "$old_head"
108 git tag --delete "v$next_version"
109 die "ok, aborting and resetting."
110 esac
111
112 # push commits and tags to upstream repo
113 git push --follow-tags ${release%%/*}
114
115 # open prepopulated release form (don't forget to upload xpi!)
116 tmpdir=$(mktemp -d) && cp build/VimFx.xpi "$tmpdir" && xdg-open "$tmpdir" &
117 firefox --new-window "https://github.com/akhodakivskiy/VimFx/releases/new?tag=v${next_version}&title=VimFx+v${next_version}&body=" &
Imprint / Impressum