-
Notifications
You must be signed in to change notification settings - Fork 0
/
update.jq
126 lines (104 loc) · 2.65 KB
/
update.jq
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
# Run a pipeline and return "null" in case of error instead of failing
#
# Example:
#
# input:
# [1, "nope"] | opt(tonumber)
#
# output:
# [1, null]
#
def opt(f):
. as $in
| try f catch $in
;
# Convert a semver string to a semver object
#
# Example:
#
# input:
# "1.20.3" | to_semver"
#
# output:
# {
# major: 1,
# minor: 20,
# patch: 3,
# release: "1.20.3",
# release_group: [1, 20]
# release_semver: [1, 20, 3]
# }
#
# See: https://stackoverflow.com/a/75770668/1081818
def to_semver:
. as $in
| sub("\\+.*$"; "")
| capture("^(?<v>[^-]+)(?:-(?<p>.*))?$")
# [0] is semver data [1] is overflow/unparsed
| [.v, .p // empty]
# make "1.20.3" into ["1", "20", "3"]
| map(split(".")
# make ["1", "20", "3"] into [1, 20, 3]
| map(opt(tonumber)))
| .[1] |= (. // {})
# Construct the result output
| {
major: .[0][0],
minor: .[0][1],
# go1.20 is same as 1.20.0, Go omits patch version from a new minor series,
# so we're going to set "0" as the default
patch: (.[0][2] // 0),
# preserve the original input semver value
release: $in,
}
# Compute group and semver slices for sorting and filtering and merge with previous step
| . += {
# used to group releases in the same group together
release_group: [
.major,
.minor
],
# used to sort releases within a group by semver rather than number/string
release_semver: [
.major,
.minor,
.patch
],
}
;
# Release transformation pipeline
[
.[]
# we only care about stable releases
| select(.stable == true)
# remove the "go" string prefix from release names
| .version[2:]
# cast releases to semver
| to_semver
# remove releases older than configured
| select(.release_group >= ($config.minimum_release_group | to_semver).release_group)
]
# put all (X.Y) releases are in the same slice
| group_by(.release_group)
# select N most recent releases per group
| map(.[:$config.number_of_releases_per_group])
# merge additional releases from config file
| . + [
(
$config.additional_releases
| map(to_semver)
)
]
# remove the nested release group slice from output
| flatten
# ensure that [$config.additional_releases] additions doesn't duplicate existing entries
| unique
# sort each release group by semver semantics and not numberically or by string
#
# Example: [1.18.9, 1.18.10]
#
| sort_by(.release_semver)
# extract the releases we want to support
| map(.release)
# print releases as a string
| join("\n")