@@ -180,13 +180,21 @@ const (
180
180
Version2_19 = "2.19.0"
181
181
Version2_20 = "2.20.0"
182
182
Version2_21 = "2.21.0"
183
+ Version2_22 = "2.22.0"
183
184
184
185
MinVersion = Version2_12
185
186
)
186
187
187
188
// versionRegexp matches the first line of "nix --version" output.
188
- // Semantic component sourced from https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
189
- var versionRegexp = regexp .MustCompile (`^(.+) \(.+\) ((?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)(?:-(?P<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)$` )
189
+ //
190
+ // The semantic component is sourced from <https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string>.
191
+ // It's been modified to tolerate Nix prerelease versions, which don't have a
192
+ // hyphen before the prerelease component and contain underscores.
193
+ var versionRegexp = regexp .MustCompile (`^(.+) \(.+\) ((?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)(?:(?:-|pre)(?P<prerelease>(?:0|[1-9]\d*|\d*[_a-zA-Z-][_0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[_a-zA-Z-][_0-9a-zA-Z-]*))*))?(?:\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)$` )
194
+
195
+ // preReleaseRegexp matches Nix prerelease version strings, which are not valid
196
+ // semvers.
197
+ var preReleaseRegexp = regexp .MustCompile (`pre(?P<date>[0-9]+)_(?P<commit>[a-f0-9]{4,40})$` )
190
198
191
199
// VersionInfo contains information about a Nix installation.
192
200
type VersionInfo struct {
@@ -294,7 +302,15 @@ func (v VersionInfo) AtLeast(version string) bool {
294
302
if ! semver .IsValid (version ) {
295
303
panic (fmt .Sprintf ("nix.atLeast: invalid version %q" , version [1 :]))
296
304
}
297
- return semver .Compare ("v" + v .Version , version ) >= 0
305
+ if semver .IsValid ("v" + v .Version ) {
306
+ return semver .Compare ("v" + v .Version , version ) >= 0
307
+ }
308
+
309
+ // If the version isn't a valid semver, check to see if it's a
310
+ // prerelease (e.g., 2.23.0pre20240526_7de033d6) and coerce it to a
311
+ // valid version (2.23.0-pre.20240526+7de033d6) so we can compare it.
312
+ prerelease := preReleaseRegexp .ReplaceAllString (v .Version , "-pre.$date+$commit" )
313
+ return semver .Compare ("v" + prerelease , version ) >= 0
298
314
}
299
315
300
316
// version is the cached output of `nix --version --debug`.
0 commit comments