8
8
# - Beta features from GetStage() in codersdk/deployment.go
9
9
#
10
10
# The script will update feature-stages.md with tables for each section.
11
+ # For each feature, it also checks which versions it's available in (stable, mainline).
11
12
12
13
set -euo pipefail
13
14
# shellcheck source=scripts/lib.sh
14
15
source " $( dirname " ${BASH_SOURCE[0]} " ) /../lib.sh"
15
16
cdroot
16
17
18
+ # Try to get GitHub token if not set
19
+ if [[ -z " ${GITHUB_TOKEN:- } " ]]; then
20
+ if GITHUB_TOKEN=" $( gh auth token 2> /dev/null) " ; then
21
+ export GITHUB_TOKEN
22
+ GH_AVAILABLE=true
23
+ else
24
+ log " Warning: GitHub token not found. Only checking local version."
25
+ GH_AVAILABLE=false
26
+ fi
27
+ else
28
+ GH_AVAILABLE=true
29
+ fi
30
+
17
31
if isdarwin; then
18
32
dependencies gsed gawk
19
33
sed () { gsed " $@ " ; }
20
34
awk () { gawk " $@ " ; }
21
35
fi
22
36
23
- # File path to deployment.go - needed for documentation purposes
24
- # shellcheck disable=SC2034
25
- DEPLOYMENT_GO_FILE=" codersdk/deployment.go"
37
+ # Functions to get version information
38
+ echo_latest_stable_version () {
39
+ if [[ " ${GH_AVAILABLE} " == " false" ]]; then
40
+ echo " stable"
41
+ return
42
+ fi
43
+
44
+ # Try to get latest stable version, fallback to "stable" if it fails
45
+ version=$( curl -fsSLI -o /dev/null -w " %{url_effective}" https://github.com/coder/coder/releases/latest 2> /dev/null || echo " error" )
46
+ if [[ " ${version} " == " error" || -z " ${version} " ]]; then
47
+ log " Warning: Failed to fetch latest stable version. Using 'stable' as placeholder."
48
+ echo " stable"
49
+ return
50
+ fi
51
+
52
+ version=" ${version# https:// github.com/ coder/ coder/ releases/ tag/ v} "
53
+ echo " v${version} "
54
+ }
55
+
56
+ echo_latest_mainline_version () {
57
+ if [[ " ${GH_AVAILABLE} " == " false" ]]; then
58
+ echo " mainline"
59
+ return
60
+ fi
61
+
62
+ # Try to get the latest mainline version, fallback to "mainline" if it fails
63
+ local version
64
+ version=$( curl -fsSL -H " Authorization: token ${GITHUB_TOKEN} " https://api.github.com/repos/coder/coder/releases 2> /dev/null |
65
+ awk -F' "' ' /"tag_name"/ {print $4}' |
66
+ tr -d v |
67
+ tr . ' ' |
68
+ sort -k1,1nr -k2,2nr -k3,3nr |
69
+ head -n1 |
70
+ tr ' ' . || echo " " )
71
+
72
+ if [[ -z " ${version} " ]]; then
73
+ log " Warning: Failed to fetch latest mainline version. Using 'mainline' as placeholder."
74
+ echo " mainline"
75
+ return
76
+ fi
77
+
78
+ echo " v${version} "
79
+ }
80
+
81
+ # Simplified function - we're no longer actually cloning the repo
82
+ # This is kept to maintain compatibility with the rest of the script structure
83
+ sparse_clone_codersdk () {
84
+ if [[ " ${GH_AVAILABLE} " == " false" ]]; then
85
+ # Skip cloning if GitHub isn't available
86
+ echo " "
87
+ return
88
+ fi
89
+
90
+ # Always return success with a placeholder directory
91
+ echo " ${1} /${2} "
92
+ }
26
93
27
- # Extract and parse experiment information from deployment.go
28
- extract_experiment_info () {
29
- # Extract the experiment descriptions, stages, and doc paths
30
- # We'll use Go code to capture this information and print it in a structured format
94
+ # Extract feature information from the local deployment.go
95
+ extract_local_experiment_info () {
96
+ # Extract the experiment descriptions, stages, and doc paths using Go
31
97
cat > /tmp/extract_experiment_info.go << 'EOT '
32
98
package main
33
99
@@ -66,53 +132,137 @@ func main() {
66
132
EOT
67
133
68
134
# Run the Go code to extract the information
69
- cd /home/coder/coder
70
135
go run /tmp/extract_experiment_info.go
71
- rm /tmp/extract_experiment_info.go
136
+ rm -f /tmp/extract_experiment_info.go
137
+ }
138
+
139
+ # Extract experiment info from a specific version
140
+ extract_version_experiment_info () {
141
+ local dir=$1
142
+ local version=$2
143
+
144
+ if [[ " ${GH_AVAILABLE} " == " false" || -z " ${dir} " ]]; then
145
+ # If GitHub isn't available, just set all features to the same version
146
+ extract_local_experiment_info | jq --arg version " ${version} " ' [.[] | . + {"versions": [$version]}]'
147
+ return
148
+ fi
149
+
150
+ # For simplicity and stability, let's just use the local experiments
151
+ # and mark them as available in the specified version.
152
+ # This avoids the complex Go module replacement that can be error-prone
153
+ extract_local_experiment_info | jq --arg version " ${version} " ' [.[] | . + {"versions": [$version]}]'
154
+ }
155
+
156
+ # Combine information from all versions
157
+ combine_experiment_info () {
158
+ local workdir=$1
159
+ local stable_version=$2
160
+ local mainline_version=$3
161
+
162
+ # Extract information from different versions
163
+ local local_info stable_info mainline_info
164
+ local_info=$( extract_local_experiment_info)
165
+
166
+ if [[ " ${GH_AVAILABLE} " == " true" ]]; then
167
+ # Create sparse clones and extract info
168
+ local stable_dir mainline_dir
169
+
170
+ stable_dir=$( sparse_clone_codersdk " ${workdir} " " stable" " ${stable_version} " )
171
+ if [[ -n " ${stable_dir} " ]]; then
172
+ stable_info=$( extract_version_experiment_info " ${stable_dir} " " stable" )
173
+ else
174
+ # Fallback if sparse clone failed
175
+ stable_info=$( extract_local_experiment_info | jq ' [.[] | . + {"versions": ["stable"]}]' )
176
+ fi
177
+
178
+ mainline_dir=$( sparse_clone_codersdk " ${workdir} " " mainline" " ${mainline_version} " )
179
+ if [[ -n " ${mainline_dir} " ]]; then
180
+ mainline_info=$( extract_version_experiment_info " ${mainline_dir} " " mainline" )
181
+ else
182
+ # Fallback if sparse clone failed
183
+ mainline_info=$( extract_local_experiment_info | jq ' [.[] | . + {"versions": ["mainline"]}]' )
184
+ fi
185
+
186
+ # Cleanup
187
+ rm -rf " ${workdir} "
188
+ else
189
+ # If GitHub isn't available, just mark everything as available in all versions
190
+ stable_info=$( extract_local_experiment_info | jq ' [.[] | . + {"versions": ["stable"]}]' )
191
+ mainline_info=$( extract_local_experiment_info | jq ' [.[] | . + {"versions": ["mainline"]}]' )
192
+ fi
193
+
194
+ # Add 'main' version to local info
195
+ local_info=$( echo " ${local_info} " | jq ' [.[] | . + {"versions": ["main"]}]' )
196
+
197
+ # Combine all info
198
+ echo ' []' | jq \
199
+ --argjson local " ${local_info} " \
200
+ --argjson stable " ${stable_info:- []} " \
201
+ --argjson mainline " ${mainline_info:- []} " \
202
+ '
203
+ ($local + $stable + $mainline) |
204
+ group_by(.value) |
205
+ map({
206
+ name: .[0].name,
207
+ value: .[0].value,
208
+ description: .[0].description,
209
+ stage: .[0].stage,
210
+ versions: map(.versions[0]) | unique | sort
211
+ })
212
+ '
72
213
}
73
214
74
- # Generate the experimental features table with flag name
215
+ # Generate the early access features table
75
216
generate_experiments_table () {
217
+ local experiment_info=$1
218
+
76
219
echo " | Feature Flag | Name | Available in |"
77
220
echo " |-------------|------|--------------|"
78
-
79
- # Extract the experiment information
80
- extract_experiment_info | jq -r ' .[] | select(.stage=="early access") | "| `\(.value)` | \(.description) | mainline, stable |"'
221
+
222
+ echo " ${experiment_info} " | jq -r ' .[] | select(.stage=="early access") | "| `\(.value)` | \(.description) | \(.versions | join(", ")) |"'
81
223
}
82
224
83
- # Extract beta features from deployment.go
225
+ # Generate the beta features table
84
226
generate_beta_table () {
85
- echo " | Feature Flag | Name |"
86
- echo " |-------------|------|"
87
-
88
- # Extract beta features with flag name only
89
- extract_experiment_info | jq -r ' .[] | select(.stage=="beta") | "| `\(.value)` | \(.description) |"'
227
+ local experiment_info=$1
228
+
229
+ echo " | Feature Flag | Name | Available in |"
230
+ echo " |-------------|------|--------------|"
231
+
232
+ echo " ${experiment_info} " | jq -r ' .[] | select(.stage=="beta") | "| `\(.value)` | \(.description) | \(.versions | join(", ")) |"'
90
233
}
91
234
235
+ workdir=build/docs/experiments
92
236
dest=docs/install/releases/feature-stages.md
93
237
94
238
log " Updating feature stages documentation in ${dest} "
95
239
96
- # Generate the tables
97
- experiments_table=$( generate_experiments_table)
98
- beta_table=$( generate_beta_table)
240
+ # Get versions
241
+ stable_version=$( echo_latest_stable_version)
242
+ mainline_version=$( echo_latest_mainline_version)
243
+
244
+ log " Checking features for versions: main, ${mainline_version} , ${stable_version} "
99
245
100
- # We're using a single-pass awk script that replaces content between markers
101
- # No need for cleanup operations
246
+ # Get combined experiment information across versions
247
+ experiment_info=$( combine_experiment_info " ${workdir} " " ${stable_version} " " ${mainline_version} " )
248
+
249
+ # Generate the tables
250
+ experiments_table=$( generate_experiments_table " ${experiment_info} " )
251
+ beta_table=$( generate_beta_table " ${experiment_info} " )
102
252
103
253
# Create temporary files with the new content
104
254
cat > /tmp/ea_content.md << EOT
105
255
<!-- BEGIN: available-experimental-features -->
106
256
107
- $experiments_table
257
+ ${ experiments_table}
108
258
109
259
<!-- END: available-experimental-features -->
110
260
EOT
111
261
112
262
cat > /tmp/beta_content.md << EOT
113
263
<!-- BEGIN: beta-features -->
114
264
115
- $beta_table
265
+ ${ beta_table}
116
266
117
267
<!-- END: beta-features -->
118
268
EOT
@@ -165,4 +315,4 @@ rm -f /tmp/ea_content.md /tmp/beta_content.md
165
315
rm -f " ${dest} .bak"
166
316
167
317
# Format the file with prettier
168
- (cd site && pnpm exec prettier --cache --write ../" ${dest} " )
318
+ (cd site && pnpm exec prettier --cache --write ../" ${dest} " )
0 commit comments