forked from kubernetes-client/python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathchangelog.sh
More file actions
executable file
·154 lines (132 loc) · 5.21 KB
/
changelog.sh
File metadata and controls
executable file
·154 lines (132 loc) · 5.21 KB
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
149
150
151
152
153
154
#!/bin/bash
# Copyright 2021 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Utilities for parsing/writing the Python client's changelog.
changelog="$(git rev-parse --show-toplevel)/CHANGELOG.md"
function util::changelog::has_release {
local release=$1
return $(grep -q "^# $release$" $changelog)
}
# find_release_start returns the number of the first line of the given release
function util::changelog::find_release_start {
local release=$1
echo $(grep -n "^# $release$" $changelog | head -1 | cut -d: -f1)
}
# find_release_end returns the number of the last line of the given release
function util::changelog::find_release_end {
local release=$1
local release_start=$(util::changelog::find_release_start $release)
local next_release_index=0
local releases=($(grep -n "^# " $changelog | cut -d: -f1))
for i in "${!releases[@]}"; do
if [[ "${releases[$i]}" = "$release_start" ]]; then
next_release_index=$((i+1))
break
fi
done
# return the line before the next release
echo $((${releases[${next_release_index}]}-1))
}
# has_section_in_range returns if the given section exists between start and end
function util::changelog::has_section_in_range {
local section="$1"
local start=$2
local end=$3
local lines=($(grep -n "$section" "$changelog" | cut -d: -f1))
for i in "${!lines[@]}"; do
if [[ ${lines[$i]} -ge $start && ${lines[$i]} -le $end ]]; then
return 0
fi
done
return 1
}
# find_section_in_range returns the number of the first line of the given section
function util::changelog::find_section_in_range {
local section="$1"
local start=$2
local end=$3
local line="0"
local lines=($(grep -n "$section" "$changelog" | cut -d: -f1))
for i in "${!lines[@]}"; do
if [[ ${lines[$i]} -ge $start && ${lines[$i]} -le $end ]]; then
line=${lines[$i]}
break
fi
done
echo $line
}
# write_changelog writes release_notes to section in target_release
function util::changelog::write_changelog {
local target_release="$1"
local section="$2"
local release_notes="$3"
# find the place in the changelog that we want to edit
local line_to_edit="1"
if util::changelog::has_release $target_release; then
# the target release exists
release_first_line=$(util::changelog::find_release_start $target_release)
release_last_line=$(util::changelog::find_release_end $target_release)
if util::changelog::has_section_in_range "$section" "$release_first_line" "$release_last_line"; then
# prepend to existing section
line_to_edit=$(($(util::changelog::find_section_in_range "$section" "$release_first_line" "$release_last_line")+1))
else
# add a new section; plus 4 so that the section is placed below "Kubernetes API Version"
line_to_edit=$(($(util::changelog::find_release_start $target_release)+4))
release_notes="$section\n$release_notes\n"
fi
else
# add a new release
release_notes="# $target_release\n\nKubernetes API Version: To Be Updated\n\n$section\n$release_notes\n"
fi
echo "Writing the following release notes to CHANGELOG line $line_to_edit:"
echo -e $release_notes
# update changelog
sed -i "${line_to_edit}i${release_notes}" $changelog
}
# get_api_version returns the Kubernetes API Version for the given client
# version in the changelog.
function util::changelog::get_k8s_api_version {
local client_version="$1"
local api_version_section="Kubernetes API Version: "
# by default, find the first API version in the first 100 lines if the given
# client version isn't found
local start=0
local end=100
if util::changelog::has_release "$client_version"; then
start=$(util::changelog::find_release_start "$client_version")
end=$(util::changelog::find_release_end "$client_version")
fi
if ! util::changelog::has_section_in_range "$api_version_section" "$start" "$end"; then
echo "error: api version for release $client_version not found"
exit 1
fi
local api_version_line=$(util::changelog::find_section_in_range "$api_version_section" "$start" "$end")
echo $(sed -n ${api_version_line}p $changelog | sed "s/$api_version_section//g")
}
function util::changelog::update_release_api_version {
local release="$1"
local old_release="$2"
local k8s_api_version="$3"
echo "New release: $release"
echo "Old release: $old_release"
if ! util::changelog::has_release v$old_release; then
sed -i "1i# v$release\n\nKubernetes API Version: $k8s_api_version\n\n" $changelog
return 0
fi
start=$(util::changelog::find_release_start v$old_release)
sed -i "${start}s/# v$old_release/# v$release/" $changelog
echo "$start"
echo "$((${start}+2))"
sed -i "$((${start}+2))s/^Kubernetes API Version: .*$/Kubernetes API Version: $k8s_api_version/" $changelog
}