@@ -26,171 +26,6 @@ source_helper_file() {
2626 fi
2727}
2828
29- # Lists remote release branches for a specific major version (e.g., release/8.*)
30- git_ls_remote_major_release_version_branches () {
31- local remote=" $1 "
32- local major_version=" $2 "
33- execute_command --no-std -- git ls-remote --heads " $remote " " release/$major_version .*"
34- if [ -z " $last_cmd_stdout " ]; then
35- console_output 0 red " Error: No release branches found for major_version=$major_version "
36- return 1
37- fi
38- echo " $last_cmd_stdout "
39- }
40-
41- # Lists remote tags for a specific major version (e.g., v8.*)
42- git_ls_remote_tags () {
43- local remote=" $1 "
44- local major_version=" $2 "
45- execute_command --no-std -- git ls-remote --refs --tags " $remote " " refs/tags/v$major_version .*"
46- if [ -z " $last_cmd_stdout " ]; then
47- console_output 0 red " Error: No tags found for major_version=$major_version "
48- return 1
49- fi
50- echo " $last_cmd_stdout "
51- }
52-
53- # Filters and sorts release branches by major version in reverse version order
54- filter_major_release_version_branches () {
55- local major_version=" $1 "
56- while read -r line; do
57- local ref=" $( echo " $line " | awk ' {print $2}' ) "
58- local commit=" $( echo " $line " | awk ' {print $1}' ) "
59- if echo " $ref " | grep -q " release/$major_version \.[0-9][0-9]*$" ; then
60- echo " $ref $commit "
61- fi
62- done | sort -Vr
63- }
64-
65- # Sorts version tags in reverse version order for a specific major version
66- # stdin: commit ref (git ls-remote)
67- # stdout: version commit (vX.X.X sha1) - sorted by version
68- sort_version_tags () {
69- local major_version=" $1 "
70- local version_tag commit ref
71- while read -r commit ref; do
72- version_tag=" $( echo " $ref " | grep -o " v$major_version \.[0-9][0-9]*\.[0-9][0-9]*.*" || :) "
73- if [ -z " $version_tag " ]; then
74- console_output 2 red " Incorrect reference format: $ref "
75- return 1
76- fi
77- printf " %s %s\n" " $version_tag " " $commit "
78- done | sort -Vr
79- }
80-
81- # Filters out end-of-life (EOL) versions by skipping entire minor version series marked with -eol suffix
82- # stdin: version commit (vX.X.X sha1) - must be sorted by version
83- # stdout: version commit (vX.X.X sha1)
84- filter_out_eol_versions () {
85- local major_version=" $1 "
86- local version_tag commit
87- local last_minor=" " skip_minor=" " minors=" "
88- local major minor patch suffix
89- local versions
90-
91- mapfile -t versions
92- for line in " ${versions[@]} " ; do
93- read -r version_tag commit < <( echo " $line " )
94- IFS=: read -r major minor patch suffix < <( redis_version_split " $version_tag " )
95-
96- if [ " $minor " != " $last_minor " ] && [ -n " $last_minor " ]; then
97- if [ -z " $skip_minor " ]; then
98- printf " %s" " $minors "
99- else
100- console_output 2 gray " Skipping minor version $major_version .$last_minor .* due to EOL"
101- fi
102- minors=" "
103- skip_minor=" "
104- fi
105- last_minor=" $minor "
106-
107- printf -v minors " %s%s\n" " $minors " " $version_tag $commit "
108-
109- if echo " $suffix " | grep -qi " -eol$" ; then
110- skip_minor=" $minor "
111- fi
112- done
113- if [ -z " $skip_minor " ]; then
114- printf " %s" " $minors "
115- else
116- console_output 2 gray " Skipping minor version $major_version .$last_minor .* due to EOL"
117- fi
118- }
119-
120- # Filters Redis versions to keep only the latest patch version (and optionally the latest milestone) for each minor version
121- # stdin: version commit (vX.X.X sha1) - must be sorted by version
122- # stdout: version commit (vX.X.X sha1)
123- filter_actual_major_redis_versions () {
124- local major_version=" $1 "
125- local last_minor=" " last_is_milestone=" "
126- local ref commit version_tag
127- console_output 2 gray " filter_actual_major_redis_versions"
128- while read -r version_tag commit; do
129- local major minor patch suffix is_milestone
130- IFS=: read -r major minor patch suffix < <( redis_version_split " $version_tag " )
131-
132- if [ -n " $suffix " ]; then
133- is_milestone=1
134- else
135- is_milestone=" "
136- fi
137-
138- if [ " $last_minor " = " $minor " ] && [ " $last_is_milestone " = " $is_milestone " ]; then
139- console_output 2 gray " Skipping $version_tag , already have minor=$last_minor is_milestone=$last_is_milestone "
140- continue
141- fi
142- last_minor=" $minor "
143- last_is_milestone=" $is_milestone "
144-
145- console_output 2 gray " $version_tag $commit "
146- echo " $version_tag $commit "
147- done
148- }
149-
150- # Gets and filters actual Redis versions (tags) from a remote repository for a major version
151- get_actual_major_redis_versions () {
152- local remote=" $1 "
153- local major_version=" $2 "
154- execute_command git_ls_remote_tags " $remote " " $major_version " \
155- | execute_command sort_version_tags " $major_version " \
156- | execute_command filter_out_eol_versions " $major_version " \
157- | execute_command filter_actual_major_redis_versions " $major_version "
158- }
159-
160- # Fetches unshallow refs from a remote repository for the provided list of references
161- git_fetch_unshallow_refs () {
162- local remote=" $1 "
163- local refs_to_fetch=" "
164- while read -r line; do
165- local ref=" $( echo " $line " | awk ' {print $1}' ) "
166- refs_to_fetch=" $refs_to_fetch $ref "
167- done
168- # shellcheck disable=SC2086
169- execute_command --no-std -- git_fetch_unshallow " $remote " $refs_to_fetch
170- }
171-
172- # Extracts the distribution name from a Dockerfile's FROM statement (supports Alpine and Debian)
173- extract_distro_name_from_dockerfile () {
174- local base_img
175- base_img=" $( grep -m1 -i ' ^from' | awk ' {print $2}' ) "
176-
177- increase_indent_level
178- console_output 2 gray " Extracting distro from dockerfile"
179-
180- if echo " $base_img " | grep -q ' alpine:' ; then
181- distro=" $( echo " $base_img " | tr -d ' :' ) "
182- elif echo " $base_img " | grep -q ' debian:' ; then
183- distro=" $( echo " ${base_img// -slim/ } " | awk -F: ' {print $2}' ) "
184- else
185- console_output 0 red " Error: Unknown base image $base_img "
186- decrease_indent_level
187- return 1
188- fi
189- console_output 2 gray " distro=$distro "
190- decrease_indent_level
191- echo " $distro "
192- }
193-
19429# Splits a Redis version string into major:minor:patch:suffix components
19530redis_version_split () {
19631 local version
@@ -209,129 +44,6 @@ redis_version_split() {
20944 printf " %s:%s:%s:%s\n" " $major " " $minor " " $patch " " $suffix "
21045}
21146
212- # Shows a file from a specific git reference (commit/branch/tag)
213- git_show_file_from_ref () {
214- local ref=$1
215- local file=$2
216- execute_command git show " $ref :$file "
217- }
218-
219- # Generates a comma-separated list of Docker tags for a Redis version and distribution
220- # args: redis_version distro_names is_latest is_default
221- # is_latest empty for non-latest, otherwise latest
222- # is_default 1 for default distro, otherwise not default
223- generate_tags_list () {
224- local redis_version=$1
225- local distro_names=$2
226- local is_latest=$3
227- local is_default=$4
228-
229- local tags versions
230-
231- local major minor patch suffix
232- IFS=: read -r major minor patch suffix < <( redis_version_split " $redis_version " )
233-
234- local mainline_version
235- mainline_version=" $major .$minor "
236-
237- versions=(" $redis_version " )
238- # generate mainline version tag only for GA releases, e.g 8.2 and 8.2-distro
239- # tags will be generated only for 8.2.1 but not for 8.2.1-m01
240- if [ -z " $suffix " ]; then
241- versions+=(" $mainline_version " )
242- fi
243- if [ " $is_latest " != " " ]; then
244- versions+=(" $major " )
245- fi
246-
247- if [ " $is_default " = 1 ]; then
248- tags=(" ${versions[@]} " )
249- fi
250-
251- for distro_name in $distro_names ; do
252- for v in " ${versions[@]} " ; do
253- tags+=(" $v -$distro_name " )
254- done
255- done
256-
257- if [ " $is_latest " != " " ]; then
258- if [ " $is_default " = 1 ]; then
259- tags+=(" latest" )
260- fi
261- # shellcheck disable=SC2206
262- tags+=($distro_names )
263- fi
264- # shellcheck disable=SC2001
265- echo " $( IFS=, ; echo " ${tags[*]} " | sed ' s/,/, /g' ) "
266- }
267-
268- # Generates stackbrew library content (for specific major version)
269- # stdin: commit redis_version distro distro_version (sha1 vX.X.X alpine alpine3.21)
270- generate_stackbrew_library () {
271- local commit redis_version distro distro_version
272- local is_latest=" " is_latest_unset=1 is_default
273-
274- local stackbrew_content=" "
275-
276- mapfile -t releases
277- for line in " ${releases[@]} " ; do
278- read -r commit redis_version distro distro_version < <( echo " $line " )
279-
280- local major minor patch suffix
281- IFS=: read -r major minor patch suffix < <( redis_version_split " $redis_version " )
282-
283- # assigning latest to the first non milestone (empty suffix) version from top
284- if [ " $is_latest_unset " = 1 ]; then
285- if [ -z " $suffix " ]; then
286- is_latest=" $minor "
287- is_latest_unset=" "
288- fi
289- elif [ " $is_latest " != " $minor " ]; then
290- is_latest=" "
291- fi
292-
293- if echo " $distro " | grep -q ' alpine' ; then
294- is_default=" "
295- distro_names=" $distro $distro_version "
296- else
297- is_default=1
298- distro_names=" $distro_version "
299- fi
300-
301- local tags
302- tags=$( generate_tags_list " $redis_version " " $distro_names " " $is_latest " " $is_default " )
303- printf -v stackbrew_content " %s%s\n" " $stackbrew_content " " $tags "
304- done
305- printf %s " $stackbrew_content "
306- console_output 2 gray " $stackbrew_content "
307- }
308-
309- # Prepares a list of releases with commit, Redis version, distro, and distro version information
310- # stdin: redis_version commit
311- prepare_releases_list () {
312- local redis_version commit
313- local debug_output=" " version_line
314- while read -r redis_version commit; do
315- for distro in debian alpine; do
316- local dockerfile distro_version redis_version
317- dockerfile=$( git_show_file_from_ref " $commit " " $distro /Dockerfile" )
318- console_output 3 gray " $dockerfile "
319-
320- distro_version=$( echo " $dockerfile " | extract_distro_name_from_dockerfile)
321- # validate version
322- redis_version_split " $redis_version " > /dev/null
323-
324- printf -v version_line " %s %s %s %s\n" " $commit " " $redis_version " " $distro " " $distro_version "
325- printf " %s" " $version_line "
326- printf -v debug_output " %s%s" " $debug_output " " $version_line "
327- done
328- done
329- console_output 2 gray " Final Releases list:"
330- increase_indent_level
331- console_output 2 gray " $debug_output "
332- decrease_indent_level
333- }
334-
33547slack_format_docker_image_urls_message () {
33648 # Parse the image URLs from JSON array
33749 jq --arg release_tag " $1 " --arg footer " $2 " '
0 commit comments