fix(install): qualify Windows archive extraction - #652
Conversation
Use the Microsoft.PowerShell.Archive cmdlet explicitly so modules such as Pscx cannot shadow the installer extraction command. Add a focused Windows regression test for both installer variants.\n\nFixes slackapi#651.
|
Thanks for the contribution! Before we can merge this, we need @codywilliamson to sign the Salesforce Inc. Contributor License Agreement. |
zimeg
left a comment
There was a problem hiding this comment.
@codywilliamson Super appreciate this changeset landing here! I'm finding it continues to work as we hope and the tests are nice to confirm this.
Before merging I'm hoping to make a few small changes to tests and CI so we can keep this confidence high 🏆
|
|
||
| delay 0.3 "Extracting the executable to:`n $slack_cli_new_binary_path" | ||
| Expand-Archive "$($slack_cli_dir)\slack_cli.zip" -DestinationPath "$($slack_cli_dir)" -Force | ||
| Microsoft.PowerShell.Archive\Expand-Archive "$($slack_cli_dir)\slack_cli.zip" -DestinationPath "$($slack_cli_dir)" -Force |
There was a problem hiding this comment.
🌟 praise: Thanks for making this step more stable!
The prior Windows test only lint-checked the AST for the qualified Expand-Archive call, then exercised a re-implemented extraction snippet that shadowed a *function* named Expand-Archive — it never ran the installer, so it could not catch the module-command shadow that slackapi#651 actually hit (Pscx's Expand-Archive winning unqualified resolution). Rework it to mirror the Unix install-test.sh pattern: for each Windows installer (release + dev), keep the AST guard, then actually invoke the installer and assert the aliased binary lands and reports a version. Move install tests out of the macOS-only lint-test job into a dedicated install-tests job with an OS matrix (macos/ubuntu/windows) so all three platforms' installers are exercised on every PR. Unix runs make test-install; Windows runs the reworked script. Co-Authored-By: Claude <svc-devxp-claude@slack-corp.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #652 +/- ##
==========================================
+ Coverage 72.55% 72.58% +0.02%
==========================================
Files 239 239
Lines 20229 20229
==========================================
+ Hits 14677 14683 +6
+ Misses 4277 4274 -3
+ Partials 1275 1272 -3 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
The Windows install test's real end-to-end run hangs in CI: after extraction, install-windows.ps1's post-install courtesy check runs `& slack _fingerprint | Tee-Object -Variable | Out-Null`, which blocks under pwsh 7 on current Windows runner images (a native-command pipeline with no console never returns). Confirmed against two CI runs -- a cold install hung for 12 min then cancelled, while an older-image run of the same installer completed -- so the hang tracks the runner image/pwsh build, not this branch's change, and is independent of the install alias. Revert the Windows leg to a static AST guard: parse each installer and assert it calls Microsoft.PowerShell.Archive\Expand-Archive exactly once (the slackapi#651 fix). This verifies the regression is present without running the installer, so the check is fast and can't hang. The installer's _fingerprint hang is a real pre-existing bug tracked separately. Co-Authored-By: Claude <svc-devxp-claude@slack-corp.com>
Per review on slackapi#652: the guard checked `Count -ne 1`, which breaks the moment an installer legitimately extracts more than once and points its error at the count rather than the qualification. Invert it to the actual invariant -- every *Expand-Archive command must be the qualified Microsoft.PowerShell.Archive\Expand-Archive form, and at least one must exist so a removed extraction can't pass vacuously. Co-Authored-By: Claude <svc-devxp-claude@slack-corp.com>
Drop the two explanatory comment blocks; keep the issue reference as a trailing comment on the $qualifiedCommand line. Logic unchanged. Co-Authored-By: Claude <svc-devxp-claude@slack-corp.com>
|
@codywilliamson Thanks once more for sending this in! I'm hoping in follow up changes we can strengthen CI coverage of this installation script but for now let's fix this issue so I will merge the PR. |
Changelog
The Windows installer now extracts the CLI reliably when another PowerShell module defines
Expand-Archive.Summary
PowerShell resolves an unqualified command name before binding its parameters. When Pscx 3.3.2 is loaded, the installer selects Pscx's
Expand-Archive, which does not accept-DestinationPath; the ZIP downloads successfully, but extraction and the PATH update never happen. Both release and development installers now addressMicrosoft.PowerShell.Archiveexplicitly.Fixes #651.
The regression test is the part worth the closest review. It keeps the change dependency-free: it parses both mirrored installers to require the qualified command, then performs a real extraction while a same-named function shadows unqualified command resolution.
Testing
Both commands pass locally.
go test ./...was also attempted with the repository-requested Go 1.26.6 toolchain on Windows/386, but unrelated command packages simultaneously reached the suite's 11-minute watchdog. The pull request's macOS Go suite remains the authoritative repository-wide check.Notes
The CLI runtime and non-Windows installers are unchanged. The added Windows job runs only the focused, Pester-free installer regression.
Requirements