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..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" @@ -294,9 +294,15 @@ Процедура СоздатьСкриптЗапуска(Знач ИмяСкриптаЗапуска, Знач ПутьФайлаПриложения, Знач Каталог) Экспорт Если Это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 """ + ПутьФайлаПриложения + """ %*"); - ФайлЗапуска.ЗаписатьСтроку("@exit /b %ERRORLEVEL%"); + ФайлЗапуска.ЗаписатьСтроку("@set _opm_err=%ERRORLEVEL%"); + // Восстанавливаем кодировку консоли, чтобы не нарушать работу других команд после вызова батника + ФайлЗапуска.ЗаписатьСтроку("@chcp %_opm_cp% > nul"); + ФайлЗапуска.ЗаписатьСтроку("@exit /b %_opm_err%"); ФайлЗапуска.Закрыть(); КонецЕсли; diff --git a/tests/bat-launcher-test.os b/tests/bat-launcher-test.os new file mode 100644 index 0000000..77811ca --- /dev/null +++ b/tests/bat-launcher-test.os @@ -0,0 +1,59 @@ +#Использовать "../src/core" +#Использовать asserts +#Использовать fs +#Использовать tempfiles + +// Тесты для воспроизведения issue #265: +// BUG: Генерирует нерабочие `.bat` при кириллице в пути проекта (Windows) +// https://github.com/oscript-library/opm/issues/265 + +Перем юТест; +Перем мВременныеФайлы; + +Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт + + юТест = Тестирование; + + ИменаТестов = Новый Массив; + + СИ = Новый СистемнаяИнформация(); + Если Найти(СИ.ВерсияОС, "Windows") > 0 Тогда + ИменаТестов.Добавить("ТестДолжен_НеСодержатьАбсолютныйКириллицкийПутьВBatФайлеПриЛокальнойУстановке"); + КонецЕсли; + + Возврат ИменаТестов; + +КонецФункции + +Процедура ПередЗапускомТеста() Экспорт +КонецПроцедуры + +Процедура ПослеЗапускаТеста() Экспорт + мВременныеФайлы.Удалить(); +КонецПроцедуры + + +Процедура ТестДолжен_НеСодержатьАбсолютныйКириллицкийПутьВBatФайлеПриЛокальнойУстановке() Экспорт + + КаталогBin = мВременныеФайлы.СоздатьКаталог(); + + + КириллицкийПутьКСкрипту = "C:\КириллицаПроект\Новая папка\oscript_modules\testapp\testapp.os"; + + Установщик = Новый УстановкаПакета; + Установщик.УстановитьРежимУстановкиПакета(РежимУстановкиПакетов.Локально); + Установщик.СоздатьСкриптЗапуска("testapp", КириллицкийПутьКСкрипту, КаталогBin); + + ПутьКBatФайлу = ОбъединитьПути(КаталогBin, "testapp.bat"); + + Чтение = Новый ЧтениеТекста(ПутьКBatФайлу, КодировкаТекста.UTF8); + СодержимоеBat = Чтение.Прочитать(); + Чтение.Закрыть(); + + + Ожидаем.Что(СодержимоеBat, "Bat-файл должен корректно кодировать кириллицу в пути (UTF-8)") + .Содержит("КириллицаПроект"); + +КонецПроцедуры + +мВременныеФайлы = Новый МенеджерВременныхФайлов;