Add release script documenting the release procedure
[tig] / contrib / release.sh
1 #!/bin/sh
2 #
3 # Script for preparing a release or updating the release branch.
4 # Usage: $0 version
5 #
6 # Copyright (c) 2009 Jonas Fonseca <fonseca@diku.dk>
7 #
8 # This program is free software; you can redistribute it and/or
9 # modify it under the terms of the GNU General Public License as
10 # published by the Free Software Foundation; either version 2 of
11 # the License, or (at your option) any later version.
12 #
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 # GNU General Public License for more details.
17
18 set -e
19 set -x
20
21 VERSION="$1"
22
23 TAG="tig-$VERSION"
24 TITLE="$TAG\n$(echo "$TAG" | sed 's/./-/g')"
25
26 # Require a clean repository.
27 git update-index --refresh
28 git diff-index --quiet HEAD
29
30 if test -n "$VERSION"; then
31         # Get a sane starting point.
32         test "$(git symbolic-ref HEAD)" = "refs/heads/master" ||
33                 git checkout master
34
35         # Update files which should reference the version.
36         echo "$VERSION" > VERSION
37         perl -pi -e 's/^tig master.*/@@TITLE@@/ms' NEWS
38         perl -pi -e "s/^@@TITLE@@.*/$TITLE/" NEWS
39
40         # Check for typos.
41         make spell-check
42
43         # Last review.
44         $EDITOR NEWS
45
46         # Create release commit and tag.
47         git commit -a -m "$TAG"
48         git tag -s -m "tig version $VERSION" "$TAG"
49
50         # Prepare release announcement file.
51         ./contrib/announcement.sh "$TAG" > "$TAG.txt"
52
53         # Set version for the Makefile
54         export DIST_VERSION="$VERSION"
55 else
56         # Get meaningful version for the update message.
57         TAG="$(git describe)"
58 fi
59
60 # Update the release branch.
61 git checkout release
62 HEAD="$(git rev-parse release)"
63 git merge master
64 if test -n "$(git rev-list -1 release ^$HEAD)"; then
65         make distclean doc-man doc-html sysconfdir=++SYSCONFDIR++
66         git commit -a -m "Update for version $TAG"
67 fi
68
69 if test -n "$VERSION"; then
70         # Create the tarball.
71         make dist
72 fi
73
74 # Done.
75 git checkout master