# run would otherwise read as success. $global: because a bare assignment
# would make a local copy that the native call then does not update.
$global:LASTEXITCODE = $null
- try { $version = (& $cand -V 2>&1 | Select-Object -First 1) } catch { }
+ # Collect ALL the output, THEN take its first line. Piped straight into
+ # `Select-Object -First 1`, which is how this used to read, PowerShell
+ # stops the pipeline the moment ssh.exe prints its banner - before it
+ # has exited - kills it, and the exit code comes back -1 instead of 0.
+ # Measured under Windows PowerShell 5.1 against a healthy
+ # C:\Tools\rsync\ssh.exe: 19 of 20 runs reported -1 that way, 0 of 20
+ # once collected first. So this check usually judged the fast client
+ # broken and handed git the in-box one it exists to avoid.
+ # setup-windows-with-uac.ps1 fixed the same trap in its own ssh.exe
+ # check (see DRAIN THE OUTPUT there); this copy was missed.
+ try { $sshOut = @(& $cand -V 2>&1); $version = $sshOut[0] } catch { }
finally { $ErrorActionPreference = $prevEap }
if ($LASTEXITCODE -eq 0) { $winSsh = $cand; break }
$why = if ($null -eq $LASTEXITCODE) { 'it would not start' } else { "exit $LASTEXITCODE" }