@@ -7,6 +7,17 @@ public enum ToolchainVersion: Sendable {
77 case main
88 case release( major: Int , minor: Int , patch: String ? = nil )
99
10+ /// Constructs a release-snapshot branch, normalizing the patch component
11+ /// to match the swift.org URL scheme:
12+ /// - from Swift 6.4 onward, snapshots live under `/install/dev/X.Y.x/...`,
13+ /// - on older releases are passed through as-is.
14+ public static func releaseNormalized( major: Int , minor: Int , patch: String ? ) -> Self {
15+ if patch == nil , ( major, minor) >= ( 6 , 4 ) {
16+ return . release( major: major, minor: minor, patch: " x " )
17+ }
18+ return . release( major: major, minor: minor, patch: patch)
19+ }
20+
1021 public var description : String {
1122 switch self {
1223 case . main:
@@ -145,7 +156,7 @@ public enum ToolchainVersion: Sendable {
145156 throw SwiftlyError ( message: " invalid release snapshot version: \( string) " )
146157 }
147158 let patch = match. output. 3 . map ( String . init)
148- self = ToolchainVersion ( snapshotBranch: . release ( major: major, minor: minor, patch: patch) , date: String ( match. output. 4 ) )
159+ self = ToolchainVersion ( snapshotBranch: . releaseNormalized ( major: major, minor: minor, patch: patch) , date: String ( match. output. 4 ) )
149160 } else if string == " xcode " {
150161 self = ToolchainVersion . xcodeVersion
151162 } else {
@@ -477,7 +488,7 @@ struct ReleaseSnapshotParser: ToolchainSelectorParser {
477488 }
478489
479490 let patch = match. output. 3 . map ( String . init)
480- return . snapshot( branch: . release ( major: major, minor: minor, patch: patch) , date: match. output. 4 . map ( String . init) )
491+ return . snapshot( branch: . releaseNormalized ( major: major, minor: minor, patch: patch) , date: match. output. 4 . map ( String . init) )
481492 }
482493}
483494
0 commit comments