in powershell-agent/src/main/java/jetbrains/buildServer/powershell/agent/PowerShellInfoProvider.java [165:227]
public PowerShellInfo selectTool(@Nullable final PowerShellBitness bit,
@Nullable final String version,
@Nullable final PowerShellEdition edition) {
// filter by edition
List<PowerShellInfo> availableShells = new ArrayList<>(myHolder.getShells().values());
if (edition != null) {
availableShells = CollectionsUtil.filterCollection(availableShells, data -> edition.equals(data.getEdition()));
}
// filter by version
if (version != null) {
availableShells = CollectionsUtil.filterCollection(availableShells, data -> VersionComparatorUtil.compare(data.getVersion(), version) >= 0);
}
// filter by bitness
if (bit != null) {
availableShells = CollectionsUtil.filterCollection(availableShells, data -> data.getBitness().equals(bit));
}
if (availableShells.isEmpty()) {
return null;
}
if (availableShells.size() == 1) {
return availableShells.get(0);
}
// prefer desktop over core
if (edition == null) {
Map<PowerShellEdition, List<PowerShellInfo>> byEdition = new HashMap<>();
for (PowerShellInfo info : availableShells) {
if (!byEdition.containsKey(info.getEdition())) {
byEdition.put(info.getEdition(), new ArrayList<>());
}
byEdition.get(info.getEdition()).add(info);
}
if (byEdition.get(PowerShellEdition.DESKTOP) != null) {
availableShells = byEdition.get(PowerShellEdition.DESKTOP);
} else {
availableShells = byEdition.get(PowerShellEdition.CORE);
}
}
if (availableShells.size() == 1) {
return availableShells.get(0);
}
// prefer 64bit over 32bit
if (bit == null) {
Map<PowerShellBitness, List<PowerShellInfo>> byBits = new HashMap<>();
for (PowerShellInfo info : availableShells) {
if (!byBits.containsKey(info.getBitness())) {
byBits.put(info.getBitness(), new ArrayList<>());
}
byBits.get(info.getBitness()).add(info);
}
if (byBits.containsKey(PowerShellBitness.x64)) {
availableShells = byBits.get(PowerShellBitness.x64);
} else {
availableShells = byBits.get(PowerShellBitness.x86);
}
}
if (availableShells.isEmpty()) {
return null;
}
if (availableShells.size() == 1) {
return availableShells.get(0);
}
return Collections.max(availableShells, (info1, info2) -> VersionComparatorUtil.compare(info1.getVersion(), info2.getVersion()));
}