4 (helps to) prepare a new VimFx release.
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`.
12 inspired by https://drewdevault.com/2019/10/12/how-to-fuck-up-releases.html
15 # shadowable defaults:
16 : "${devel=origin/master}"
17 : "${release=upstream/master}"
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}"
31 last_version
=$
(awk -F\" '$2 == "version" { print $4 ; exit }' package.json
)
33 echo "$last_version" |
34 awk -F.
-vOFS=.
'{ $ver++; while(ver++<NF) $ver=0; print $0 }' ver
="$1"
38 patch) next_version
=$
(inc_version
3) ;;
39 minor
) next_version
=$
(inc_version
2) ;;
41 *) die
"Usage: $0 {minor|patch}"
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."
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."
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.";}
67 # make sure local repo is up to date (push to devel and pull from release first)
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%%/*}"
74 # at this point, we should save the current HEAD, so we can restore later on
75 old_head
=$
(git rev-parse HEAD
)
78 npm
--silent run
-- gulp
--silent lint coffee ||
79 die
"linting errors detected, aborting."
81 # update CHANGELOG.md and ask user to confirm changes
82 cat <<EOF | ed -s CHANGELOG.md
84 ### $next_version (`date +%Y-%m-%d`)
88 2r !git log --reverse --format="- "\%s v$last_version..HEAD
91 ${VISUAL:-$EDITOR} CHANGELOG.md
93 # increment version number in package.json
94 sed -i "/\"version\":/s/$last_version/$next_version/" package.json
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"
101 # build xpi for release on github
102 npm
--silent run
-- gulp
--silent xpi
--unlisted
104 printf "continue pushing to upstream repository [y/N]: " >&2
107 [!yY
]) git
reset --hard "$old_head"
108 git tag
--delete "v$next_version"
109 die
"ok, aborting and resetting."
112 # push commits and tags to upstream repo
113 git push
--follow-tags ${release%%/*}
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=" &