22* Licensed to the .NET Foundation under one or more agreements.
33* The .NET Foundation licenses this file to you under the MIT license.
44*--------------------------------------------------------------------------------------------*/
5- import { DotnetVersionSpecRequirement } from '../DotnetVersionSpecRequirement' ;
65import { IDotnetFindPathContext } from '../IDotnetFindPathContext' ;
76import { CommandExecutor } from '../Utils/CommandExecutor' ;
87import { ICommandExecutor } from '../Utils/ICommandExecutor' ;
@@ -26,14 +25,12 @@ export class DotnetConditionValidator implements IDotnetConditionValidator
2625 public async dotnetMeetsRequirement ( dotnetExecutablePath : string , requirement : IDotnetFindPathContext ) : Promise < boolean >
2726 {
2827 const availableRuntimes = await this . getRuntimes ( dotnetExecutablePath ) ;
29- const requestedMajorMinor = versionUtils . getMajorMinor ( requirement . acquireContext . version , this . workerContext . eventStream , this . workerContext ) ;
3028 const hostArch = await this . getHostArchitecture ( dotnetExecutablePath , requirement ) ;
3129
3230 if ( availableRuntimes . some ( ( runtime ) =>
3331 {
34- const availableVersion = versionUtils . getMajorMinor ( runtime . version , this . workerContext . eventStream , this . workerContext ) ;
3532 return runtime . mode === requirement . acquireContext . mode && this . stringArchitectureMeetsRequirement ( hostArch , requirement . acquireContext . architecture ) &&
36- this . stringVersionMeetsRequirement ( availableVersion , requestedMajorMinor , requirement . versionSpecRequirement ) ;
33+ this . stringVersionMeetsRequirement ( runtime . version , requirement . acquireContext . version , requirement ) ;
3734 } ) )
3835 {
3936 return true ;
@@ -44,16 +41,15 @@ export class DotnetConditionValidator implements IDotnetConditionValidator
4441 if ( availableSDKs . some ( ( sdk ) =>
4542 {
4643 // The SDK includes the Runtime, ASP.NET Core Runtime, and Windows Desktop Runtime. So, we don't need to check the mode.
47- const availableVersion = versionUtils . getMajorMinor ( sdk . version , this . workerContext . eventStream , this . workerContext ) ;
48- return this . stringArchitectureMeetsRequirement ( hostArch , requirement . acquireContext . architecture ) && this . stringVersionMeetsRequirement ( availableVersion , requestedMajorMinor , requirement . versionSpecRequirement ) ;
44+ return this . stringArchitectureMeetsRequirement ( hostArch , requirement . acquireContext . architecture ) && this . stringVersionMeetsRequirement ( sdk . version , requirement . acquireContext . version , requirement ) ;
4945 } ) )
5046 {
5147 return true ;
5248 }
5349 else
5450 {
5551 this . workerContext . eventStream . post ( new DotnetFindPathDidNotMeetCondition ( `${ dotnetExecutablePath } did NOT satisfy the conditions: hostArch: ${ hostArch } , requiredArch: ${ requirement . acquireContext . architecture } ,
56- required version: ${ requestedMajorMinor } ` ) ) ;
52+ required version: ${ requirement . acquireContext . version } , required mode: ${ requirement . acquireContext . mode } ` ) ) ;
5753 }
5854 }
5955
@@ -136,29 +132,51 @@ Please set the PATH to a dotnet host that matches the architecture ${requirement
136132 return os . platform ( ) === 'win32' ? ( await this . executor ! . tryFindWorkingCommand ( [ CommandExecutor . makeCommand ( 'chcp' , [ '65001' ] ) ] ) ) !== null : false ;
137133 }
138134
139- private stringVersionMeetsRequirement ( availableVersion : string , requestedVersion : string , requirement : DotnetVersionSpecRequirement ) : boolean
135+ private stringVersionMeetsRequirement ( availableVersion : string , requestedVersion : string , requirement : IDotnetFindPathContext ) : boolean
140136 {
141137 const availableMajor = Number ( versionUtils . getMajor ( availableVersion , this . workerContext . eventStream , this . workerContext ) ) ;
142138 const requestedMajor = Number ( versionUtils . getMajor ( requestedVersion , this . workerContext . eventStream , this . workerContext ) ) ;
139+ const requestedPatchStr : string | null = requirement . acquireContext . mode !== 'sdk' ? versionUtils . getRuntimePatchVersionString ( requestedVersion , this . workerContext . eventStream , this . workerContext )
140+ : versionUtils . getSDKCompleteBandAndPatchVersionString ( requestedVersion , this . workerContext . eventStream , this . workerContext ) ;
141+ const requestedPatch = requestedPatchStr ? Number ( requestedPatchStr ) : null ;
143142
144143 if ( availableMajor === requestedMajor )
145144 {
146145 const availableMinor = Number ( versionUtils . getMinor ( availableVersion , this . workerContext . eventStream , this . workerContext ) ) ;
147146 const requestedMinor = Number ( versionUtils . getMinor ( requestedVersion , this . workerContext . eventStream , this . workerContext ) ) ;
148147
149- switch ( requirement )
148+ if ( availableMinor === requestedMinor && requestedPatch )
150149 {
151- case 'equal' :
152- return availableMinor === requestedMinor ;
153- case 'greater_than_or_equal' :
154- return availableMinor >= requestedMinor ;
155- case 'less_than_or_equal' :
156- return availableMinor <= requestedMinor ;
150+ const availablePatchStr : string | null = requirement . acquireContext . mode !== 'sdk' ? versionUtils . getRuntimePatchVersionString ( availableVersion , this . workerContext . eventStream , this . workerContext )
151+ : versionUtils . getSDKCompleteBandAndPatchVersionString ( availableVersion , this . workerContext . eventStream , this . workerContext ) ;
152+ const availablePatch = availablePatchStr ? Number ( availablePatchStr ) : null ;
153+ switch ( requirement . versionSpecRequirement )
154+ {
155+ case 'equal' :
156+ return availablePatch === requestedPatch ;
157+ case 'greater_than_or_equal' :
158+ // the 'availablePatch' must exist, since the version is from --list-runtimes or --list-sdks.
159+ return availablePatch ! >= requestedPatch ;
160+ case 'less_than_or_equal' :
161+ return availablePatch ! <= requestedPatch ;
162+ }
163+ }
164+ else
165+ {
166+ switch ( requirement . versionSpecRequirement )
167+ {
168+ case 'equal' :
169+ return availableMinor === requestedMinor ;
170+ case 'greater_than_or_equal' :
171+ return availableMinor >= requestedMinor ;
172+ case 'less_than_or_equal' :
173+ return availableMinor <= requestedMinor ;
174+ }
157175 }
158176 }
159177 else
160178 {
161- switch ( requirement )
179+ switch ( requirement . versionSpecRequirement )
162180 {
163181 case 'equal' :
164182 return false ;
0 commit comments