New release mechanism.
[monikop.git] / doc / tag-and-release.sh
blob85e706f951e035ceab10f80c519a9d95c1986675
1 #! /bin/bash
3 # Make a new git tag and upload a new release.
4 ######################################################################
5 # The tag's name (a version string like `v1.2.3') and the commit
6 # message come from the topmost entry of ../NEWS. Headlines of those
7 # entries are supposed to start with `* ' and must contain the version
8 # string unquoted and surrounded by whitespace.
10 workdir=`pwd`
12 function latest_NEWS_section {
13 # Extract topmost section from NEWS.
14 sed -nr \
15 -e '/^\* .*v[0-9]+\.[0-9]+\.?[0-9]* .*$/,/(^\* .*v[0-9]+\.[0-9]+\.?[0-9]* .*$)|(^; .*$)/{H}' \
16 -e '${g; s/(\n\* .*v[0-9]+\.[0-9]+\.?[0-9]* .*$)|(\n; .*$)//m2; s/^\n//m1; p}' \
17 $workdir/../NEWS
20 function latest_version_number {
21 # Extract version string from topmost headline in NEWS.
22 latest_NEWS_section | \
23 grep -Eom 1 -e 'v[0-9]+\.[0-9]+\.?[0-9]*'
26 function naked_version_number {
27 # Version string without the leading `v'.
28 version=`latest_version_number`
29 echo ${version#v}
32 # program_version_number <program_file>
33 function program_version_number {
34 grep -Em 1 -e '\$version *=.*v[0-9]+\.[0-9]+\.?[0-9]*.*;' $1 | \
35 grep -Eom 1 -e 'v[0-9]+\.[0-9]+\.?[0-9]*'
38 echo "Tagging `latest_version_number`"
40 if [[ `program_version_number ../monikop` != `latest_version_number` ]]; then
41 echo "Version number mismatch between monikop and NEWS. Aborting."
42 exit
43 elif [[ `program_version_number ../pokinom` != `latest_version_number` ]]; then
44 echo "Version number mismatch between pokinom and NEWS. Aborting."
45 exit
48 if ! git-tag -a -m "`latest_NEWS_section`" `latest_version_number`; then
49 echo "Setting tag `latest_version_number` failed. But maybe things are already in place."
50 else
51 echo "Tagging `latest_version_number` successful."
54 if [[ `git-describe $(latest_version_number)` != `latest_version_number` ]]; then
55 echo "Tag `latest_version_number` missing. Aborting."
56 exit
59 echo "Writing archive ../monikop-`naked_version_number`.tar.gz."
60 if ! (
61 cd ..
62 git-archive \
63 --format=tar \
64 --prefix=monikop-`naked_version_number`/ `latest_version_number` | \
65 gzip > monikop-`naked_version_number`.tar.gz
67 then
68 echo "Unsuccessful. Aborting."
69 exit
72 echo "Writing instruct-ohloh-`naked_version_number`.xml."
73 if ! cat > instruct-ohloh-`naked_version_number`.xml <<EOF
74 <packages>
75 <package name="Monikop">
76 <releases>
77 <release name="`latest_version_number`">
78 <files>
79 <file name="monikop-`naked_version_number`.tar.gz"/>
80 </files>
81 </release>
82 </releases>
83 </package>
84 </packages>
85 EOF
86 then
87 echo "Unsuccessful. Aborting."
88 exit
91 echo "Uploading to upload.ohloh.net."
92 scp ../monikop-`naked_version_number`.tar.gz trebb@upload.ohloh.net:monikop/files &&
93 scp instruct-ohloh-`naked_version_number`.xml trebb@upload.ohloh.net:monikop/instructs
95 exit