-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrelease.sh
executable file
·108 lines (90 loc) · 2.8 KB
/
release.sh
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
#!/usr/bin/env bash
# This script performs two separate operations:
# * It creates the release commit and tag
# * It creates Gitlab release from Gitlab CI
set -eu
cd "$(dirname "$0")"
# This should be set to the appropriate project name.
project_name="pySHV"
fail() {
echo "$@" >&2
exit 1
}
in_ci() {
[[ "${GITLAB_CI:-}" == "true" ]]
}
is_semver() {
[[ "$1" =~ ^((0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*))(-((0|[1-9][0-9]*|[0-9]*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9][0-9]*|[0-9]*[a-zA-Z-][0-9a-zA-Z-]*))*))?(\+([0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*))?$ ]]
}
releases() {
sed -nE 's/^## \[([^]]+)\].*/\1/p' CHANGELOG.md
}
# Get the latest changelog.
latest_changelog() {
awk '
BEGIN { flag = 0; }
/^## / && !flag { flag = 1; next; }
/^## / && flag { exit; }
flag { print; }
' CHANGELOG.md
}
################################################################################
if ! in_ci; then
changelog="$(latest_changelog | sed -E 's|^##[#]+ ||;s|^- |* |')"
if [[ -z "$changelog" ]] || [[ "$(releases | head -1)" != "Unreleased" ]]; then
fail "There is no unreleased changelog!"
fi
prev="$(releases | sed -n 2p)"
while true; do
read -rp "New release (previous: $prev): " version
if ! is_semver "$version"; then
echo "Version has to be valid semantic version!"
continue
fi
if git rev-parse "v${version}" >/dev/null 2>&1; then
echo "This version already exists."
continue
fi
break
done
sed -i "0,/^## / s|## \\[Unreleased\\].*|## \\[${version}\\] - $(date +%Y-%m-%d)|" CHANGELOG.md
[[ "$(releases | head -1)" == "$version" ]] || fail "Failed to set version in CHANGELOG.md"
sed -i "0,/^version = / s/^version = .*/version = \"${version}\"/" pyproject.toml
grep -F "version = \"${version}\"" pyproject.toml || fail "Failed to set version in pyproject.toml"
git commit -ve -m "$project_name version $version" -m "$changelog" CHANGELOG.md pyproject.toml
while ! gitlint; do
read -rp "Invalid commit message. Edit again? (Yes/no/force) " response
case "${response,,}" in
"" | y | yes)
git commit --amend
;;
n | no)
git reset --merge HEAD^
exit 1
;;
f | force)
break
;;
esac
done
{ python3 -m build && twine check dist/*; } || {
git reset --merge HEAD^
fail "Invalid pypi release"
}
git tag -s "v${version}" -m "$(git log --format=%B -n 1 HEAD)"
else
[[ "$CI_COMMIT_TAG" =~ ^v ]] ||
fail "This is not a release tag: $CI_COMMIT_TAG"
version="${CI_COMMIT_TAG#v}"
is_semver "$version" ||
fail "Version has to be valid semantic version!"
[[ "$(releases | head -1)" == "$version" ]] ||
fail "The version $version isn't the latest release in CHANGELOG.md "
changelog="$(latest_changelog)"
[[ -n "$changelog" ]] ||
fail "Changelog is empty!"
release-cli create \
--name "Release $version" \
--tag-name "$CI_COMMIT_TAG" \
--description "$changelog"
fi