summaryrefslogtreecommitdiff
path: root/build-aux/create-release.sh
blob: 7c61c6b1dfa4088251a40e8c5cf656afd2812e8c (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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/bin/bash
set -e

# Usage: create_release.sh [optional next version]

meson_file="meson.build"
metainfo_file="data/org.gnome.Nautilus.metainfo.xml.in.in"
news_file="NEWS"

### Version ###

meson_version=$(grep " version: '" ${meson_file} | cut -d\' -f2 | head -n 1)
release_version=${1:-"${meson_version}"}

current_branch=$(git rev-parse --abbrev-ref HEAD)
latest_commit=$(git rev-parse HEAD)
previous_tag=$(git describe --tags --abbrev=0)

# Calculate next version
IFS='.' read -r major minor patch <<< "${release_version}"
case "$minor" in
	"alpha")
		next_version="${major}.beta"
		;;
	"beta")
		next_version="${major}.rc"
		;;
	"rc")
		next_version="${major}.0"
		;;
	*)
		if [[ ! "$minor" =~ ^[0-9]+$ ]]; then
			echo "Error: Don't know how to handle version '${release_version}'"
			exit 1
		elif [[ ${current_branch} = "main" ]] ; then
			# if branch is main increase major number
			next_version="$((major+1)).alpha"
		else
			# otherwise increase minor
			next_version="${major}.$((minor + 1))"
		fi
		;;
esac

### Commits ###

bump_commit_msg="Post[\ -]release version bump"
translation_filter="^Update.*translation\$"
commits=$(git log \
	--pretty=format:"%h %s (%an)" \
	${previous_tag}..${latest_commit} \
	--invert-grep --grep="${bump_commit_msg}" --grep="${translation_filter}")
t10n_commits=$(git log --pretty=oneline \
	${previous_tag}..${latest_commit} \
	--grep="${translation_filter}")

num_commits=$(echo "${commits}" | sed '/^\s*$/d' | wc -l)
num_t10n_commits=$(echo "${t10n_commits}" | sed '/^\s*$/d' | wc -l)

meson_version_str=""
if [ ! ${release_version} = ${meson_version} ] ; then
	meson_version_str=" (meson has ${meson_version})"
fi
echo "Creating release ${release_version}${meson_version_str} (Bumping to ${next_version})"
echo "on top of commit ${latest_commit}"
echo ""
echo "There were ${num_commits} code change(s) and ${num_t10n_commits} translation change(s) since ${previous_tag}."
echo ""

### NEWS ###

header="Major Changes in ${release_version}"
underline=$(printf '%*s\n' "${#header}" '' | tr ' ' '=')
translations=""
if [ ! ${num_t10n_commits} = 0 ] ; then
	translations="* Translation updates (GNOME Translation Project contributors)"
fi
news_update="\
${header}
${underline}
* Enhancements:
- 

* Bugfixes:
- 

* Cleanups:
- 

${commits}

${translations}
"

echo "${news_update}" | cat - NEWS > temp && mv temp NEWS

echo "Edit the NEWS file then continue with [Enter]"
read

release_notes=$(git diff --unified=0 --color=never NEWS | grep -E '^\+[^+]' | sed 's/^\+//')

### metainfo.xml ###

date=$(date --iso-8601)
next_minor="${next_version##*.}"
type=$([[ "$next_minor" =~ ^[1-9][0-9]*$ ]] && echo "stable" || echo "development")
metainfo_release_version=$(echo ${release_version} | sed -E "s/\.([a-z]+)/~\1/")

snapshot="<release version=\"@release-version@\" type=\"snapshot\"\/>"
placeholder="<!--NEXT_RELEASE_PLACEHOLDER-->"
new_entry="<release version=\"${metainfo_release_version}\" type=\"${type}\" date=\"${date}\"\/>"
replace="s/${snapshot}/${placeholder}\n    ${new_entry}/"
sed -i "${replace}" "${metainfo_file}"

### Release commit ###
release_message="Release ${release_version}"
git add "${metainfo_file}" "${news_file}"
git commit -m "${release_message}"
release_commit=$(git rev-parse HEAD)

### Post-Release bump commit ###
sed -ri "s/  version: [^,]*,/  version: '${next_version}',/" "${meson_file}"

replace="s/${placeholder}/${snapshot}/"
sed -i "${replace}" "${metainfo_file}"

git add "${metainfo_file}" "${meson_file}"
git commit -m "Post-release version bump"

### Note about release tagging ###
release_notes="${release_message}
${release_notes}"
echo Release commits created. Tag release with:
echo "git tag -s ${release_version} ${release_commit} -m \"${release_notes}\""
echo "git push --tags"