fix: install.ps1 не мог прочитать версию любого релизного PowerShell 7 - #13
Merged
Conversation
ProductVersion у pwsh.exe выглядит как '7.6.4 SHA: <hash>+<hash>' - хеш отделён ПРОБЕЛОМ, а код отрезал суффикс по дефису, поэтому приведение к [version] бросало и версия становилась null. Теперь читаются числовые поля ProductMajorPart/MinorPart/BuildPart - разбирать нечего. Разбор был сломан с самого начала: до 2.22 форма if ($pwshVersion -and ...) пропускала сравнение вместо того, чтобы о нём сообщить, и установщик три релиза работал вообще без проверки версии. Fail-closed из 2.22 не сломал ничего - он это обнажил. Единственным стражем был греп-тест: он проверял ФОРМУ кода и ни разу его не выполнял, поэтому 702 зелёных теста ничего не заметили. Добавлен поведенческий тест, выполняющий выражение самого install.ps1 против реального pwsh.exe. Проверено мутацией: со старым выражением он краснеет, а греп-тест рядом остаётся зелёным. Фикс живой сразу после попадания в main: one-liner берёт install.ps1 из ветки, а не из ассета релиза. get.ps1 не затронут - он читает $PSVersionTable.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Симптом
Пользователь на машине с PowerShell 7.6.4 запустил one-liner установки и получил отказ:
Причина
pwsh.exeотдаётProductVersionкак7.6.4 SHA: 929d27f4...+929d27f4...- хеш коммита отделён пробелом. Код отрезал суффикс по дефису (это покрывает только preview-сборки вида7.7.0-preview.2), хеш оставался, приведение к[version]бросало, версия становилась$null.Воспроизведено локально на 7.6.4:
Cannot convert value "7.6.4 SHA: ..." to type "System.Version".Что это значит на самом деле
Разбор был сломан всегда. До v2.22 условие
if ($pwshVersion -and $pwshVersion -lt '7.1')при$nullпросто пропускало сравнение, и установщик три релиза работал вообще без проверки версии. Fail-closed из v2.22 ничего не сломал - он обнажил дыру, которую fail-open прикрывал.Исправление
Читаются числовые поля
ProductMajorPart/ProductMinorPart/ProductBuildPart- там нет строки, которую можно разобрать неверно.major = 0по-прежнему трактуется как нечитаемая версия и остаётся fail-closed.Почему не поймали 702 теста
Единственным стражем был греп-тест: он проверял ФОРМУ кода (
if (-not $pwshVersion)есть, старой fail-open формы нет) и ни разу не выполнял выражение.Добавлен поведенческий тест: он достаёт присваивание
$pwshVersionизinstall.ps1через AST и выполняет его против реальногоpwsh.exeна машине тестов, затем проверяет, что результат проходит планку 7.1.Проверено мутацией: со старым выражением поведенческий тест краснеет, а греп-тест рядом остаётся зелёным. Ровно та разница, из-за которой дефект прожил три релиза.
702 -> 704 теста.
Область
get.ps1не затронут: он работает уже внутри PowerShell и читает$PSVersionTable.WinClean.ps1не менялся, релиз и PSGallery не требуются.install.ps1изmain, а не из ассета релиза.