summaryrefslogtreecommitdiffstats
path: root/release.sh
blob: 2199eac2cf40bc469b72a0411d37c783ecd6d28e (plain)
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
#!/bin/bash

usage() {
    echo "release.sh: VERSION"
    echo ""
    echo "The script does all necessary steps to create a new release."
    echo ""
    echo "Note: The version number needs to be exactly"
    echo "      '^v[\d]+.[\d]+(-rc[0-9]+)?$'"
    echo ""
    echo "example:"
    echo "  release.sh v2.1-rc0     # v2.1 release candidate 0 -> sets the project "
    echo "                          # version to '1.1' and sets the tag"
    echo "  release.sh v2.1-rc1     # v2.1 release canditate 1 -> only sets the tag"
    echo "  release.sh v2.1         # v2.1 release -> sets the final tag"
}

VERSION=$1

if [ -z "$VERSION" ] ; then
    usage
    exit 1
fi

new_ver=""
rc=""

re='^v([0-9]+\.[0-9]+)(-rc[0-9]+)?$'
if [[ "$VERSION" =~ $re ]]; then
    echo "Valid version $VERSION string"
    new_ver=${BASH_REMATCH[1]}
    rc=${BASH_REMATCH[2]}
else
    echo "Invalid version string $VERSION"
    echo ""
    usage
    exit 1
fi

if [[ -n $(git status -s) ]]; then
    echo "tree is dirty. abort."
    exit 1
fi

if [ "$(git rev-parse --abbrev-ref HEAD)" != "master" ] ; then
    echo "currently not on master branch. abort."
    exit 1
fi

# update all docs
doc_dir=""
if [ -d "Documentation" ]; then
    doc_dir="Documentation"
elif [ -d "doc" ]; then
    doc_dir="doc"
else
    echo "documenation directory not found"
    exit 1
fi

./$doc_dir/update-docs.sh
git add $doc_dir
git commit -s -m "Regenerate all documentation" \
              -m "Regenerate documentation for $VERSION release"

# update meson.build
old_ver=$(sed -n "0,/[ \t]\+version: /s/[ \t]\+version: '\([0-9]\+.[0-9]\+\)',$/\1/p" meson.build)
if [ "$old_ver" != "$new_ver" ]; then
    # Only update project version once, that is either
    # - for the first RC phase or
    # - for the release when there was no RC
    sed -i -e "0,/[ \t]version: /s/\([ \t]version: \).*/\1\'$new_ver\',/" meson.build
    git add meson.build
fi

git commit -s -m "Release $VERSION"
git tag -s -m "Release $VERSION" "$VERSION"
git push --dry-run origin "$VERSION"^{}:master tag "$VERSION"

read -p "All good? Ready to push changes to remote? [Yy]" -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
    git push origin "$VERSION"^{}:master tag "$VERSION"
fi