-
Notifications
You must be signed in to change notification settings - Fork 25
/
release.sh
executable file
·148 lines (115 loc) · 3.21 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
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
136
137
138
139
140
141
142
143
144
145
146
147
148
#!/usr/bin/env bash
#
# This script creates a new release and is therefore not meant to be
# used by anyone but the project manager. It will therefore remain
# undocumented and may assume some specific environment.
abort_release()
{
echo "Aborting."
exit 1
}
display_crate_version()
{
local crate_name="$1"
local crate_version
crate_version=$(grep "^version" "${crate_name}/Cargo.toml" | cut -d '"' -f2)
echo "Current version for crate ${crate_name}: ${crate_version}"
}
update_crate_version()
{
local crate_name="$1"
local new_version="$2"
sed -i "s/^version = .*/version = \"${new_version}\"/" "${crate_name}/Cargo.toml"
}
display_man_date()
{
local man_name="$1"
local man_date
man_date=$(grep ".Dd" "man/en/${man_name}" | sed "s/\.Dd //")
echo "Current date for ${man_name}: ${man_date}"
}
update_man_date()
{
local man_name="$1"
local new_date="$2"
sed -i "s/\.Dd .*/\.Dd ${new_date}/" "man/en/${man_name}"
}
update_changelog()
{
local new_version="$1"
local new_date=$(date "+%Y-%m-%d")
sed -i "s/\[Unreleased\]/\[${new_version}\] - ${new_date}/" "CHANGELOG.md"
}
check_working_directory()
{
local status
status=$(git status --untracked-files="no" --porcelain="2")
if [[ "$status" != "" ]]; then
echo "Unable to create a new release while the working directory is not clean."
abort_release
fi
}
commit_new_version()
{
local new_version="$1"
git add --update
git commit -m "ACMEd v${new_version}"
git tag -m "ACMEd v${new_version}" "v${new_version}"
echo
echo "Version ${new_version} has been committed and tagged."
echo "If everything is correct, you can publish if using:"
echo " git push"
echo " git push origin v${new_version}"
}
release_new_version()
{
local new_version="$1"
local current_date="$2"
local confirm_git_diff
update_crate_version "acme_common" "${new_version}"
update_crate_version "acmed" "${new_version}"
update_crate_version "tacd" "${new_version}"
update_man_date "acmed.8" "${current_date}"
update_man_date "acmed.toml.5" "${current_date}"
update_man_date "tacd.8" "${current_date}"
update_changelog "${new_version}"
cargo update
git diff
echo
echo -n "Does everything seems ok? [y|N] "
read -r confirm_git_diff
case "${confirm_git_diff}" in
y|Y) commit_new_version "${new_version}";;
*)
git restore "."
abort_release
;;
esac
}
main()
{
local new_version
local confirm_release
check_working_directory
display_crate_version "acme_common"
display_crate_version "acmed"
display_crate_version "tacd"
echo
display_man_date "acmed.8"
display_man_date "acmed.toml.5"
display_man_date "tacd.8"
echo
echo -n "Enter the new version: "
read -r new_version
export LC_TIME="en_US.UTF-8"
current_date=$(date "+%b %d, %Y")
echo
echo "You are about to release version ${new_version} on ${current_date}"
echo -n "Are you sure? [y/N] "
read -r confirm_release
case "${confirm_release}" in
y|Y) release_new_version "${new_version}" "${current_date}";;
*) abort_release;;
esac
}
main