Skip to content

Commit e29a085

Browse files
fix: address all Copilot review comments on PR #16
- Add null/empty checks for prerelease resolution on all 3 platforms (Linux jq // empty + bash validation, macOS same, Windows null check) - Fix prerelease downgrade detection: force uninstall when same base version but different prerelease labels (MSI can't handle in-place) - Fix inconsistent regex escaping: -preview|-rc (not -preview|\-rc) - Fix StartsWith over-matching in registry filter: use regex with delimiter-aware boundary instead of string prefix match - Extract major version dynamically for install path (not hardcoded 7) - Add GITHUB_PATH updates for Linux/macOS preview builds - Add null check in test workflow prerelease resolution
1 parent 8688e56 commit e29a085

File tree

2 files changed

+52
-10
lines changed

2 files changed

+52
-10
lines changed

.github/workflows/Action-Test.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,11 @@ jobs:
5353
'Authorization' = "Bearer $($env:GITHUB_TOKEN)"
5454
'X-GitHub-Api-Version' = '2022-11-28'
5555
}
56-
$requested = ($releases | Where-Object { $_.prerelease -eq $true } | Select-Object -First 1).tag_name.TrimStart('v')
56+
$latestPrerelease = $releases | Where-Object { $_.prerelease -eq $true } | Select-Object -First 1
57+
if (-not $latestPrerelease) {
58+
throw "No prerelease releases found for PowerShell/PowerShell."
59+
}
60+
$requested = $latestPrerelease.tag_name.TrimStart('v')
5761
Write-Host "Resolved 'prerelease' → $requested"
5862
}
5963
# When empty / 'null' / 'latest' → resolve to latest stable release

action.yml

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,12 @@ runs:
5151
-H "Authorization: Bearer $GITHUB_TOKEN" \
5252
-H "X-GitHub-Api-Version: 2022-11-28" \
5353
https://api.github.com/repos/PowerShell/PowerShell/releases |
54-
jq -r '[.[] | select(.prerelease == true)] | .[0].tag_name' | sed 's/^v//'
54+
jq -r '[.[] | select(.prerelease == true)] | (.[0].tag_name // empty)' | sed 's/^v//'
5555
)
56+
if [[ -z "$REQUESTED_VERSION" ]]; then
57+
echo "Error: No prerelease PowerShell releases found when resolving latest prerelease."
58+
exit 1
59+
fi
5660
echo "Latest prerelease PowerShell version detected: $REQUESTED_VERSION"
5761
else
5862
REQUESTED_VERSION=$(
@@ -115,6 +119,17 @@ runs:
115119
fi
116120
echo "Installation complete. PowerShell [$REQUESTED_VERSION] is now available."
117121
122+
# For prerelease builds, add the install directory to GITHUB_PATH so subsequent
123+
# `shell: pwsh` steps resolve to the version we just installed.
124+
if [[ "$REQUESTED_VERSION" == *-* ]]; then
125+
MAJOR_VERSION=$(echo "$REQUESTED_VERSION" | cut -d'.' -f1)
126+
INSTALL_DIR="/opt/microsoft/powershell/${MAJOR_VERSION}-preview"
127+
if [[ -d "$INSTALL_DIR" ]]; then
128+
echo "Adding install directory to GITHUB_PATH: $INSTALL_DIR"
129+
echo "$INSTALL_DIR" >> "$GITHUB_PATH"
130+
fi
131+
fi
132+
118133
- name: Install PowerShell (macOS)
119134
if: runner.os == 'macOS'
120135
shell: bash
@@ -139,8 +154,12 @@ runs:
139154
-H "Authorization: Bearer $GITHUB_TOKEN" \
140155
-H "X-GitHub-Api-Version: 2022-11-28" \
141156
https://api.github.com/repos/PowerShell/PowerShell/releases |
142-
jq -r '[.[] | select(.prerelease == true)] | .[0].tag_name' | sed 's/^v//'
157+
jq -r '[.[] | select(.prerelease == true)] | (.[0].tag_name // empty)' | sed 's/^v//'
143158
)
159+
if [[ -z "$REQUESTED_VERSION" ]]; then
160+
echo "Error: No prerelease PowerShell releases found when resolving latest prerelease."
161+
exit 1
162+
fi
144163
echo "Latest prerelease PowerShell version detected: $REQUESTED_VERSION"
145164
else
146165
REQUESTED_VERSION=$(
@@ -190,6 +209,17 @@ runs:
190209
sudo installer -pkg "$PKG_NAME" -target /
191210
echo "Installation complete. PowerShell [$REQUESTED_VERSION] is now available."
192211
212+
# For prerelease builds, add the install directory to GITHUB_PATH so subsequent
213+
# `shell: pwsh` steps resolve to the version we just installed.
214+
if [[ "$REQUESTED_VERSION" == *-* ]]; then
215+
MAJOR_VERSION=$(echo "$REQUESTED_VERSION" | cut -d'.' -f1)
216+
INSTALL_DIR="/usr/local/microsoft/powershell/${MAJOR_VERSION}-preview"
217+
if [[ -d "$INSTALL_DIR" ]]; then
218+
echo "Adding install directory to GITHUB_PATH: $INSTALL_DIR"
219+
echo "$INSTALL_DIR" >> "$GITHUB_PATH"
220+
fi
221+
fi
222+
193223
- name: Install PowerShell (Windows)
194224
if: runner.os == 'Windows'
195225
shell: powershell
@@ -213,7 +243,12 @@ runs:
213243
}
214244
if ($env:PRERELEASE -eq 'true') {
215245
$releases = Invoke-RestMethod -Uri 'https://api.github.com/repos/PowerShell/PowerShell/releases' -Headers $headers
216-
$latest = ($releases | Where-Object { $_.prerelease -eq $true } | Select-Object -First 1).tag_name.TrimStart('v')
246+
$latestRelease = $releases | Where-Object { $_.prerelease -eq $true } | Select-Object -First 1
247+
if (-not $latestRelease) {
248+
Write-Host "Error: No prerelease PowerShell releases are available from GitHub."
249+
exit 1
250+
}
251+
$latest = $latestRelease.tag_name.TrimStart('v')
217252
Write-Host "Latest prerelease PowerShell version detected: $latest"
218253
} else {
219254
$latest = (Invoke-RestMethod -Uri 'https://api.github.com/repos/PowerShell/PowerShell/releases/latest' -Headers $headers).tag_name.TrimStart('v')
@@ -252,8 +287,10 @@ runs:
252287
Write-Host "Downgrade detected: $detected → $($env:REQUESTED_VERSION)"
253288
$isDowngrade = $true
254289
} elseif ($detectedVersion -eq $requestedVersion -and $detected -ne $env:REQUESTED_VERSION) {
255-
# Same base version but different prerelease label, treat as a reinstall
256-
Write-Host "Version change detected (same base, different label): $detected → $($env:REQUESTED_VERSION)"
290+
# Same base version but different prerelease label — MSI installers cannot
291+
# handle cross-prerelease changes in-place, so force uninstall first.
292+
Write-Host "Prerelease version change detected (same base, different label): $detected → $($env:REQUESTED_VERSION)"
293+
$isDowngrade = $true
257294
} else {
258295
Write-Host "Upgrade detected: $detected → $($env:REQUESTED_VERSION)"
259296
}
@@ -272,14 +309,14 @@ runs:
272309
'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
273310
)
274311
275-
$isDetectedPreview = $detected -match '-preview|\-rc'
312+
$isDetectedPreview = $detected -match '-preview|-rc'
276313
$pwshEntries = Get-ItemProperty -Path $regPaths -ErrorAction SilentlyContinue |
277314
Where-Object {
278315
$_.Publisher -eq 'Microsoft Corporation' -and
279316
$_.DisplayName -like 'PowerShell 7*' -and
280317
$(if ($isDetectedPreview) { $_.DisplayName -like '*Preview*' } else { $_.DisplayName -notlike '*Preview*' }) -and
281318
$_.DisplayVersion -and
282-
$_.DisplayVersion.StartsWith(($detected -split '-')[0])
319+
($_.DisplayVersion -match "^$([regex]::Escape(($detected -split '-')[0]))([.\-]|$)" -or $_.DisplayVersion -eq ($detected -split '-')[0])
283320
}
284321
285322
$targetEntry = $pwshEntries | Select-Object -First 1
@@ -337,10 +374,11 @@ runs:
337374
# resolve to the version we just installed — even for preview builds whose
338375
# install directory (7-preview) is not on the runner's default PATH.
339376
$isPrerelease = $env:REQUESTED_VERSION -match '-'
377+
$majorVersion = ($env:REQUESTED_VERSION -split '[.\-]')[0]
340378
$installDir = if ($isPrerelease) {
341-
"$env:ProgramFiles\PowerShell\7-preview"
379+
"$env:ProgramFiles\PowerShell\$majorVersion-preview"
342380
} else {
343-
"$env:ProgramFiles\PowerShell\7"
381+
"$env:ProgramFiles\PowerShell\$majorVersion"
344382
}
345383
if (Test-Path $installDir) {
346384
Write-Host "Adding install directory to GITHUB_PATH: $installDir"

0 commit comments

Comments
 (0)