From 132bf98a68faf4be7d075a9f6de2e269ef19105e Mon Sep 17 00:00:00 2001 From: Egor Ivanov Date: Wed, 6 May 2026 00:58:28 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=D0=A1=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B1=D0=B0=D1=82=D0=BD=D0=B8=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=B2=20UTF8NoBOM=20=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=20=D1=87?= =?UTF-8?q?=D1=82=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC=20-=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=BA=D0=BB=D1=8E=D1=87=D0=B0=D0=B5=D0=BC=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=B4=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D1=83,=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=81=D0=BB=D0=B5=20-=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0?= =?UTF-8?q?=D1=89=D0=B0=D0=B5=D0=BC=20=D1=82=D1=83=20=D1=87=D1=82=D0=BE=20?= =?UTF-8?q?=D0=B1=D1=8B=D0=BB=D0=B0=20=D0=B4=D0=BE=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D1=83=D1=81=D0=BA=D0=B0=20=D0=B1=D0=B0=D1=82=D0=BD=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packagedef | 2 +- ...20\260\320\272\320\265\321\202\320\260.os" | 7 +- tests/bat-launcher-test.os | 70 +++++++++++++++++++ 3 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 tests/bat-launcher-test.os diff --git a/packagedef b/packagedef index da97cfd..92e5b8f 100644 --- a/packagedef +++ b/packagedef @@ -13,7 +13,7 @@ Константы_ЛокальнаяВерсия = ЗагрузитьСценарий(ПутьКСценариюКонстант); ВерсияПродукта = Константы_ЛокальнаяВерсия.ВерсияПродукта; Иначе - ВерсияПродукта = "1.6.5"; + ВерсияПродукта = "1.6.6"; КонецЕсли; Описание.Имя("opm") diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260\320\237\320\260\320\272\320\265\321\202\320\260.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260\320\237\320\260\320\272\320\265\321\202\320\260.os" index 3cd7f63..35caef8 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260\320\237\320\260\320\272\320\265\321\202\320\260.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260\320\237\320\260\320\272\320\265\321\202\320\260.os" @@ -294,8 +294,13 @@ Процедура СоздатьСкриптЗапуска(Знач ИмяСкриптаЗапуска, Знач ПутьФайлаПриложения, Знач Каталог) Экспорт Если ЭтоWindows Тогда - ФайлЗапуска = Новый ЗаписьТекста(ОбъединитьПути(Каталог, ИмяСкриптаЗапуска + ".bat"), "cp866"); + ФайлЗапуска = Новый ЗаписьТекста(ОбъединитьПути(Каталог, ИмяСкриптаЗапуска + ".bat"), КодировкаТекста.UTF8NoBOM); + // Запоминаем текущую кодировку консоли, переключаем на UTF-8 для корректной работы с кириллицей в путях + ФайлЗапуска.ЗаписатьСтроку("@for /f ""tokens=2 delims=:."" %%a in ('chcp') do @set ""_opm_cp=%%a"""); + ФайлЗапуска.ЗаписатьСтроку("@chcp 65001 > nul"); ФайлЗапуска.ЗаписатьСтроку("@call oscript """ + ПутьФайлаПриложения + """ %*"); + // Восстанавливаем кодировку консоли, чтобы не нарушать работу других команд после вызова батника + ФайлЗапуска.ЗаписатьСтроку("@chcp %_opm_cp% > nul"); ФайлЗапуска.ЗаписатьСтроку("@exit /b %ERRORLEVEL%"); ФайлЗапуска.Закрыть(); КонецЕсли; diff --git a/tests/bat-launcher-test.os b/tests/bat-launcher-test.os new file mode 100644 index 0000000..4212282 --- /dev/null +++ b/tests/bat-launcher-test.os @@ -0,0 +1,70 @@ +#Использовать "../src/core" +#Использовать asserts +#Использовать fs +#Использовать tempfiles + +// Тесты для воспроизведения issue #265: +// BUG: Генерирует нерабочие `.bat` при кириллице в пути проекта (Windows) +// https://github.com/oscript-library/opm/issues/265 + +Перем юТест; +Перем мВременныеФайлы; + +Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт + + юТест = Тестирование; + + ИменаТестов = Новый Массив; + + СИ = Новый СистемнаяИнформация(); + Если Найти(СИ.ВерсияОС, "Windows") > 0 Тогда + ИменаТестов.Добавить("ТестДолжен_НеСодержатьАбсолютныйКириллицкийПутьВBatФайлеПриЛокальнойУстановке"); + КонецЕсли; + + Возврат ИменаТестов; + +КонецФункции + +Процедура ПередЗапускомТеста() Экспорт +КонецПроцедуры + +Процедура ПослеЗапускаТеста() Экспорт + мВременныеФайлы.Удалить(); +КонецПроцедуры + +// Воспроизводит issue #265: +// При локальной установке (`opm install -l`) в каталоге с кириллицей в пути +// `.bat`-файл запуска записывается в кодировке cp866, но современные окружения +// (chcp 65001, UTF-8 терминалы) читают его как UTF-8, из-за чего кириллица +// в пути к скрипту искажается и батник перестаёт работать. +// +// Ожидаемое поведение: bat-файл должен быть записан в UTF-8, чтобы путь +// с кириллицей сохранялся корректно независимо от кодовой страницы консоли. +Процедура ТестДолжен_НеСодержатьАбсолютныйКириллицкийПутьВBatФайлеПриЛокальнойУстановке() Экспорт + + КаталогBin = мВременныеФайлы.СоздатьКаталог(); + + // Путь, содержащий кириллицу — типичный случай из issue #265 + КириллицкийПутьКСкрипту = "C:\КириллицаПроект\Новая папка\oscript_modules\testapp\testapp.os"; + + Установщик = Новый УстановкаПакета; + Установщик.УстановитьРежимУстановкиПакета(РежимУстановкиПакетов.Локально); + Установщик.СоздатьСкриптЗапуска("testapp", КириллицкийПутьКСкрипту, КаталогBin); + + ПутьКBatФайлу = ОбъединитьПути(КаталогBin, "testapp.bat"); + + // Читаем файл как UTF-8 — именно так его читает cmd.exe при chcp 65001, + // а также большинство современных инструментов и терминалов. + // Если файл записан в cp866, кириллица будет искажена при таком чтении. + Чтение = Новый ЧтениеТекста(ПутьКBatФайлу, КодировкаТекста.UTF8); + СодержимоеBat = Чтение.Прочитать(); + Чтение.Закрыть(); + + // При корректной кодировке (UTF-8) кириллица в пути должна сохраниться. + // Если файл записан в cp866, этот тест упадёт — путь окажется искажён. + Ожидаем.Что(СодержимоеBat, "Bat-файл должен корректно кодировать кириллицу в пути (UTF-8)") + .Содержит("КириллицаПроект"); + +КонецПроцедуры + +мВременныеФайлы = Новый МенеджерВременныхФайлов; From 040e478da89fc68f4ff6fd5101b485265eb46762 Mon Sep 17 00:00:00 2001 From: Egor Ivanov Date: Wed, 6 May 2026 01:00:25 +0300 Subject: [PATCH 2/3] =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/bat-launcher-test.os | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/tests/bat-launcher-test.os b/tests/bat-launcher-test.os index 4212282..77811ca 100644 --- a/tests/bat-launcher-test.os +++ b/tests/bat-launcher-test.os @@ -32,19 +32,12 @@ мВременныеФайлы.Удалить(); КонецПроцедуры -// Воспроизводит issue #265: -// При локальной установке (`opm install -l`) в каталоге с кириллицей в пути -// `.bat`-файл запуска записывается в кодировке cp866, но современные окружения -// (chcp 65001, UTF-8 терминалы) читают его как UTF-8, из-за чего кириллица -// в пути к скрипту искажается и батник перестаёт работать. -// -// Ожидаемое поведение: bat-файл должен быть записан в UTF-8, чтобы путь -// с кириллицей сохранялся корректно независимо от кодовой страницы консоли. + Процедура ТестДолжен_НеСодержатьАбсолютныйКириллицкийПутьВBatФайлеПриЛокальнойУстановке() Экспорт КаталогBin = мВременныеФайлы.СоздатьКаталог(); - // Путь, содержащий кириллицу — типичный случай из issue #265 + КириллицкийПутьКСкрипту = "C:\КириллицаПроект\Новая папка\oscript_modules\testapp\testapp.os"; Установщик = Новый УстановкаПакета; @@ -53,15 +46,11 @@ ПутьКBatФайлу = ОбъединитьПути(КаталогBin, "testapp.bat"); - // Читаем файл как UTF-8 — именно так его читает cmd.exe при chcp 65001, - // а также большинство современных инструментов и терминалов. - // Если файл записан в cp866, кириллица будет искажена при таком чтении. Чтение = Новый ЧтениеТекста(ПутьКBatФайлу, КодировкаТекста.UTF8); СодержимоеBat = Чтение.Прочитать(); Чтение.Закрыть(); - // При корректной кодировке (UTF-8) кириллица в пути должна сохраниться. - // Если файл записан в cp866, этот тест упадёт — путь окажется искажён. + Ожидаем.Что(СодержимоеBat, "Bat-файл должен корректно кодировать кириллицу в пути (UTF-8)") .Содержит("КириллицаПроект"); From a8407ebfa3dcf2f46958df96570e8388416fc9d4 Mon Sep 17 00:00:00 2001 From: Egor Ivanov Date: Wed, 6 May 2026 01:14:58 +0300 Subject: [PATCH 3/3] fix erorrlevel propagation --- ...320\260\320\237\320\260\320\272\320\265\321\202\320\260.os" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260\320\237\320\260\320\272\320\265\321\202\320\260.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260\320\237\320\260\320\272\320\265\321\202\320\260.os" index 35caef8..cd71339 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260\320\237\320\260\320\272\320\265\321\202\320\260.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260\320\237\320\260\320\272\320\265\321\202\320\260.os" @@ -299,9 +299,10 @@ ФайлЗапуска.ЗаписатьСтроку("@for /f ""tokens=2 delims=:."" %%a in ('chcp') do @set ""_opm_cp=%%a"""); ФайлЗапуска.ЗаписатьСтроку("@chcp 65001 > nul"); ФайлЗапуска.ЗаписатьСтроку("@call oscript """ + ПутьФайлаПриложения + """ %*"); + ФайлЗапуска.ЗаписатьСтроку("@set _opm_err=%ERRORLEVEL%"); // Восстанавливаем кодировку консоли, чтобы не нарушать работу других команд после вызова батника ФайлЗапуска.ЗаписатьСтроку("@chcp %_opm_cp% > nul"); - ФайлЗапуска.ЗаписатьСтроку("@exit /b %ERRORLEVEL%"); + ФайлЗапуска.ЗаписатьСтроку("@exit /b %_opm_err%"); ФайлЗапуска.Закрыть(); КонецЕсли;