From 723ad34066a1be694222279d74539df3c7580bd6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 7 Feb 2026 10:49:27 +0000 Subject: [PATCH 1/6] Initial plan From 6162bfb9ccd2dd12a4f318a110e448786f334314 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 7 Feb 2026 10:55:34 +0000 Subject: [PATCH 2/6] feat: add opm uninstall command to remove installed packages Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com> --- src/cmd/opm.os | 1 + ...0\320\275\320\264\320\260Opm_Uninstall.os" | 25 ++++++ ...20\265\321\202\320\260\320\274\320\270.os" | 80 +++++++++++++++++++ tests/uninstall-test.os | 60 ++++++++++++++ 4 files changed, 166 insertions(+) create mode 100644 "src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Opm_Uninstall.os" create mode 100644 tests/uninstall-test.os diff --git a/src/cmd/opm.os b/src/cmd/opm.os index dc91f2d..47ade2e 100644 --- a/src/cmd/opm.os +++ b/src/cmd/opm.os @@ -36,6 +36,7 @@ Приложение.ДобавитьКоманду("p push", НСтр("ru='Отправить пакет в хаб пакетов';en='Send the package to the package hub'"), Новый КомандаOpm_Push); Приложение.ДобавитьКоманду("r run", НСтр("ru='Выполнить произвольную задачу';en='Run a task'"), Новый КомандаOpm_Run); Приложение.ДобавитьКоманду("test", НСтр("ru='Выполнить тестирование проекта';en='Run project testing'"), Новый КомандаOpm_Test); + Приложение.ДобавитьКоманду("un uninstall", НСтр("ru='Удалить установленный пакет';en='Uninstall a package'"), Новый КомандаOpm_Uninstall); Приложение.ДобавитьКоманду("u update", НСтр("ru='Обновить пакет';en='Update package'"), Новый КомандаOpm_Update); Приложение.ДобавитьКоманду("version", НСтр("ru='Вывести версию продукта';en='show application version'"), Новый КомандаOpm_Version); Приложение.ДобавитьКоманду("dl download", diff --git "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Opm_Uninstall.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Opm_Uninstall.os" new file mode 100644 index 0000000..fa93900 --- /dev/null +++ "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Opm_Uninstall.os" @@ -0,0 +1,25 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Прикладной интерфейс + +Процедура ОписаниеКоманды(Знач КомандаПриложения) Экспорт + + КомандаПриложения.Опция("l local", Ложь, "Удалить пакет из локального каталога oscript_modules"); + + КомандаПриложения.Аргумент("PACKAGE", "", "Имя пакета для удаления") + .Обязательный(); + +КонецПроцедуры + +Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт + + УдалениеИзЛокальногоКаталога = КомандаПриложения.ЗначениеОпции("local"); + ИмяПакета = КомандаПриложения.ЗначениеАргумента("PACKAGE"); + + РежимУстановки = РежимУстановкиПакетов.Глобально; + Если УдалениеИзЛокальногоКаталога Тогда + РежимУстановки = РежимУстановкиПакетов.Локально; + КонецЕсли; + + РаботаСПакетами.УдалитьПакет(ИмяПакета, РежимУстановки); + +КонецПроцедуры diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\320\260\320\272\320\265\321\202\320\260\320\274\320\270.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\320\260\320\272\320\265\321\202\320\260\320\274\320\270.os" index bf36600..f8b3f1e 100644 --- "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\320\260\320\272\320\265\321\202\320\260\320\274\320\270.os" +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\320\260\320\272\320\265\321\202\320\260\320\274\320\270.os" @@ -235,6 +235,86 @@ КонецФункции +Процедура УдалитьПакет(Знач ИмяПакета, Знач РежимУстановки) Экспорт + + КэшПакетов = ПолучитьУстановленныеПакеты(РежимУстановки); + УстановленныеПакеты = КэшПакетов.ПолучитьУстановленныеПакеты(); + + ДанныеПакета = УстановленныеПакеты.Получить(ИмяПакета); + Если ДанныеПакета = Неопределено Тогда + ВызватьИсключение СтрШаблон("Пакет '%1' не установлен", ИмяПакета); + КонецЕсли; + + КаталогПакета = ДанныеПакета.КаталогПакета; + + // Удалить скрипты запуска, если есть метаданные с исполняемыми файлами + МетаданныеПакета = ДанныеПакета.МетаданныеПакета; + Если ТипЗнч(МетаданныеПакета) <> Тип("Булево") Тогда + УдалитьСкриптыЗапуска(МетаданныеПакета, ИмяПакета, РежимУстановки); + КонецЕсли; + + // Удалить каталог пакета + Лог.Отладка("Удаляю каталог пакета: %1", КаталогПакета); + УдалитьФайлы(КаталогПакета); + + ОбщегоНазначенияOpm.СообщениеПользователю(Лог, "Пакет удалён: %1", ИмяПакета); + +КонецПроцедуры + +Процедура УдалитьСкриптыЗапуска(Знач МетаданныеПакета, Знач ИмяПакета, Знач РежимУстановки) + + СИ = Новый СистемнаяИнформация(); + ЭтоWindows = Найти(НРег(СИ.ВерсияОС), "windows") > 0; + + ИсполняемыеФайлы = МетаданныеПакета.ИсполняемыеФайлы(); + Если ИсполняемыеФайлы.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Если РежимУстановки = РежимУстановкиПакетов.Локально Тогда + КаталогСкриптов = ОбъединитьПути(КонстантыOpm.ЛокальныйКаталогУстановкиПакетов, "bin"); + Иначе + КаталогСкриптов = ?(ЭтоWindows, КаталогПрограммы(), ПолучитьКаталогСкриптовLinux()); + Если НЕ ПустаяСтрока(ПолучитьПеременнуюСреды("OSCRIPTBIN")) Тогда + КаталогСкриптов = ПолучитьПеременнуюСреды("OSCRIPTBIN"); + КонецЕсли; + КонецЕсли; + + Для Каждого ФайлПриложения Из ИсполняемыеФайлы Цикл + + ИмяСкриптаЗапуска = ?(ПустаяСтрока(ФайлПриложения.ИмяПриложения), ИмяПакета, ФайлПриложения.ИмяПриложения); + + Если ЭтоWindows Тогда + ПутьКСкрипту = ОбъединитьПути(КаталогСкриптов, ИмяСкриптаЗапуска + ".bat"); + Если ФС.ФайлСуществует(ПутьКСкрипту) Тогда + Лог.Отладка("Удаляю скрипт запуска: %1", ПутьКСкрипту); + УдалитьФайлы(ПутьКСкрипту); + КонецЕсли; + КонецЕсли; + + ПутьКСкрипту = ОбъединитьПути(КаталогСкриптов, ИмяСкриптаЗапуска); + Если ФС.ФайлСуществует(ПутьКСкрипту) Тогда + Лог.Отладка("Удаляю скрипт запуска: %1", ПутьКСкрипту); + УдалитьФайлы(ПутьКСкрипту); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Функция ПолучитьКаталогСкриптовLinux() + + ТекстовыйДокумент = Новый ТекстовыйДокумент(); + Попытка + ТекстовыйДокумент.Записать("/usr/bin/opm-check-temp.txt"); + УдалитьФайлы("/usr/bin/opm-check-temp.txt"); + Возврат "/usr/bin"; + Исключение + Возврат "/usr/local/bin"; + КонецПопытки; + +КонецФункции + Функция ПолучитьКаталогСистемныхБиблиотек() СистемныеБиблиотеки = ОбъединитьПути(КаталогПрограммы(), ПолучитьЗначениеСистемнойНастройки("lib.system")); diff --git a/tests/uninstall-test.os b/tests/uninstall-test.os new file mode 100644 index 0000000..83b6181 --- /dev/null +++ b/tests/uninstall-test.os @@ -0,0 +1,60 @@ +#Использовать "../src/core" +#Использовать asserts +#Использовать fs +#Использовать tempfiles + +Перем юТест; +Перем мВременныеФайлы; + +Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт + + юТест = Тестирование; + + ИменаТестов = Новый Массив; + + ИменаТестов.Добавить("ТестДолжен_УдалитьУстановленныйПакет"); + + Возврат ИменаТестов; + +КонецФункции + +Процедура ПередЗапускомТеста() Экспорт +КонецПроцедуры + +Процедура ПослеЗапускаТеста() Экспорт + мВременныеФайлы.Удалить(); + ПутьККаталогу = ОбъединитьПути(ТекущийКаталог(), "oscript_modules", "test"); + Если ФС.КаталогСуществует(ПутьККаталогу) Тогда + УдалитьФайлы(ПутьККаталогу); + КонецЕсли; +КонецПроцедуры + +Процедура ТестДолжен_УдалитьУстановленныйПакет() Экспорт + + // Собираем тестовый пакет + Сборщик = Новый СборщикПакета; + КаталогСборки = мВременныеФайлы.СоздатьКаталог(); + + Сборщик.СобратьПакет( + ОбъединитьПути(ТекущийСценарий().Каталог, "testpackage", "testpackage-0.3.1"), + Неопределено, КаталогСборки); + + ФайлПакета = Новый Файл(ОбъединитьПути(КаталогСборки, "test-0.3.1.ospx")); + + // Устанавливаем пакет локально + Установщик = Новый МенеджерУстановкиПакетов(); + Установщик.УстановитьРежимУстановкиПакетов(РежимУстановкиПакетов.Локально); + Установщик.УстановитьПакетИзАрхива(ФайлПакета.ПолноеИмя, Истина); + + ПутьКПакету = ОбъединитьПути(КонстантыOpm.ЛокальныйКаталогУстановкиПакетов, "test"); + Ожидаем.Что(ФС.КаталогСуществует(ПутьКПакету), "Каталог пакета должен существовать после установки").ЭтоИстина(); + + // Удаляем пакет + РаботаСПакетами.УдалитьПакет("test", РежимУстановкиПакетов.Локально); + + // Проверяем, что каталог пакета удалён + Ожидаем.Что(ФС.КаталогСуществует(ПутьКПакету), "Каталог пакета не должен существовать после удаления").ЭтоЛожь(); + +КонецПроцедуры + +мВременныеФайлы = Новый МенеджерВременныхФайлов; From 341f6904394ceee1c92ca7bee71f0fd9faf50dce Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 7 Feb 2026 11:06:51 +0000 Subject: [PATCH 3/6] revert command name back to 'un uninstall' per industry convention Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com> --- tests/uninstall-test.os | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/tests/uninstall-test.os b/tests/uninstall-test.os index 83b6181..15ed46f 100644 --- a/tests/uninstall-test.os +++ b/tests/uninstall-test.os @@ -12,7 +12,8 @@ ИменаТестов = Новый Массив; - ИменаТестов.Добавить("ТестДолжен_УдалитьУстановленныйПакет"); + ИменаТестов.Добавить("ТестДолжен_УдалитьЛокальноУстановленныйПакет"); + ИменаТестов.Добавить("ТестДолжен_УдалитьГлобальноУстановленныйПакет"); Возврат ИменаТестов; @@ -29,9 +30,8 @@ КонецЕсли; КонецПроцедуры -Процедура ТестДолжен_УдалитьУстановленныйПакет() Экспорт +Функция СобратьТестовыйПакет() - // Собираем тестовый пакет Сборщик = Новый СборщикПакета; КаталогСборки = мВременныеФайлы.СоздатьКаталог(); @@ -39,7 +39,13 @@ ОбъединитьПути(ТекущийСценарий().Каталог, "testpackage", "testpackage-0.3.1"), Неопределено, КаталогСборки); - ФайлПакета = Новый Файл(ОбъединитьПути(КаталогСборки, "test-0.3.1.ospx")); + Возврат Новый Файл(ОбъединитьПути(КаталогСборки, "test-0.3.1.ospx")); + +КонецФункции + +Процедура ТестДолжен_УдалитьЛокальноУстановленныйПакет() Экспорт + + ФайлПакета = СобратьТестовыйПакет(); // Устанавливаем пакет локально Установщик = Новый МенеджерУстановкиПакетов(); @@ -57,4 +63,25 @@ КонецПроцедуры +Процедура ТестДолжен_УдалитьГлобальноУстановленныйПакет() Экспорт + + ФайлПакета = СобратьТестовыйПакет(); + + // Устанавливаем пакет глобально + Установщик = Новый МенеджерУстановкиПакетов(); + Установщик.СоздаватьФайлыЗапуска(Ложь); + Установщик.УстановитьПакетИзАрхива(ФайлПакета.ПолноеИмя); + + КаталогСистемныхБиблиотек = ОбъединитьПути(КаталогПрограммы(), ПолучитьЗначениеСистемнойНастройки("lib.system")); + ПутьКПакету = ОбъединитьПути(КаталогСистемныхБиблиотек, "test"); + Ожидаем.Что(ФС.КаталогСуществует(ПутьКПакету), "Каталог пакета должен существовать после глобальной установки").ЭтоИстина(); + + // Удаляем пакет глобально + РаботаСПакетами.УдалитьПакет("test", РежимУстановкиПакетов.Глобально); + + // Проверяем, что каталог пакета удалён + Ожидаем.Что(ФС.КаталогСуществует(ПутьКПакету), "Каталог пакета не должен существовать после глобального удаления").ЭтоЛожь(); + +КонецПроцедуры + мВременныеФайлы = Новый МенеджерВременныхФайлов; From 61f56d77ee256aea8526f7efb7a1ab29373e0e40 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 7 Feb 2026 11:13:32 +0000 Subject: [PATCH 4/6] =?UTF-8?q?fix:=20use=20=D0=9A=D0=B0=D1=82=D0=B0=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3=D0=9F=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC?= =?UTF-8?q?=D1=8B()=20for=20global=20script=20directory=20on=20all=20platf?= =?UTF-8?q?orms?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com> --- ...20\265\321\202\320\260\320\274\320\270.os" | 28 ++++--------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\320\260\320\272\320\265\321\202\320\260\320\274\320\270.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\320\260\320\272\320\265\321\202\320\260\320\274\320\270.os" index f8b3f1e..d261b1f 100644 --- "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\320\260\320\272\320\265\321\202\320\260\320\274\320\270.os" +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\320\260\320\272\320\265\321\202\320\260\320\274\320\270.os" @@ -263,9 +263,6 @@ Процедура УдалитьСкриптыЗапуска(Знач МетаданныеПакета, Знач ИмяПакета, Знач РежимУстановки) - СИ = Новый СистемнаяИнформация(); - ЭтоWindows = Найти(НРег(СИ.ВерсияОС), "windows") > 0; - ИсполняемыеФайлы = МетаданныеПакета.ИсполняемыеФайлы(); Если ИсполняемыеФайлы.Количество() = 0 Тогда Возврат; @@ -274,7 +271,7 @@ Если РежимУстановки = РежимУстановкиПакетов.Локально Тогда КаталогСкриптов = ОбъединитьПути(КонстантыOpm.ЛокальныйКаталогУстановкиПакетов, "bin"); Иначе - КаталогСкриптов = ?(ЭтоWindows, КаталогПрограммы(), ПолучитьКаталогСкриптовLinux()); + КаталогСкриптов = КаталогПрограммы(); Если НЕ ПустаяСтрока(ПолучитьПеременнуюСреды("OSCRIPTBIN")) Тогда КаталогСкриптов = ПолучитьПеременнуюСреды("OSCRIPTBIN"); КонецЕсли; @@ -284,12 +281,10 @@ ИмяСкриптаЗапуска = ?(ПустаяСтрока(ФайлПриложения.ИмяПриложения), ИмяПакета, ФайлПриложения.ИмяПриложения); - Если ЭтоWindows Тогда - ПутьКСкрипту = ОбъединитьПути(КаталогСкриптов, ИмяСкриптаЗапуска + ".bat"); - Если ФС.ФайлСуществует(ПутьКСкрипту) Тогда - Лог.Отладка("Удаляю скрипт запуска: %1", ПутьКСкрипту); - УдалитьФайлы(ПутьКСкрипту); - КонецЕсли; + ПутьКСкрипту = ОбъединитьПути(КаталогСкриптов, ИмяСкриптаЗапуска + ".bat"); + Если ФС.ФайлСуществует(ПутьКСкрипту) Тогда + Лог.Отладка("Удаляю скрипт запуска: %1", ПутьКСкрипту); + УдалитьФайлы(ПутьКСкрипту); КонецЕсли; ПутьКСкрипту = ОбъединитьПути(КаталогСкриптов, ИмяСкриптаЗапуска); @@ -302,19 +297,6 @@ КонецПроцедуры -Функция ПолучитьКаталогСкриптовLinux() - - ТекстовыйДокумент = Новый ТекстовыйДокумент(); - Попытка - ТекстовыйДокумент.Записать("/usr/bin/opm-check-temp.txt"); - УдалитьФайлы("/usr/bin/opm-check-temp.txt"); - Возврат "/usr/bin"; - Исключение - Возврат "/usr/local/bin"; - КонецПопытки; - -КонецФункции - Функция ПолучитьКаталогСистемныхБиблиотек() СистемныеБиблиотеки = ОбъединитьПути(КаталогПрограммы(), ПолучитьЗначениеСистемнойНастройки("lib.system")); From a001f81b1fc2cb8744b248148455810b4c219319 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 7 Feb 2026 11:19:24 +0000 Subject: [PATCH 5/6] test: add coverage for launch script deletion and error on missing package Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com> --- tests/uninstall-test.os | 101 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 97 insertions(+), 4 deletions(-) diff --git a/tests/uninstall-test.os b/tests/uninstall-test.os index 15ed46f..91774f3 100644 --- a/tests/uninstall-test.os +++ b/tests/uninstall-test.os @@ -14,6 +14,9 @@ ИменаТестов.Добавить("ТестДолжен_УдалитьЛокальноУстановленныйПакет"); ИменаТестов.Добавить("ТестДолжен_УдалитьГлобальноУстановленныйПакет"); + ИменаТестов.Добавить("ТестДолжен_УдалитьЛокальныеСкриптыЗапуска"); + ИменаТестов.Добавить("ТестДолжен_УдалитьГлобальныеСкриптыЗапуска"); + ИменаТестов.Добавить("ТестДолжен_ВыброситьИсключениеДляНеустановленногоПакета"); Возврат ИменаТестов; @@ -24,10 +27,16 @@ Процедура ПослеЗапускаТеста() Экспорт мВременныеФайлы.Удалить(); - ПутьККаталогу = ОбъединитьПути(ТекущийКаталог(), "oscript_modules", "test"); - Если ФС.КаталогСуществует(ПутьККаталогу) Тогда - УдалитьФайлы(ПутьККаталогу); - КонецЕсли; + + МассивКаталогов = Новый Массив; + МассивКаталогов.Добавить(ОбъединитьПути(ТекущийКаталог(), "oscript_modules", "test")); + МассивКаталогов.Добавить(ОбъединитьПути(ТекущийКаталог(), "oscript_modules", "testapp")); + + Для Каждого ПутьККаталогу Из МассивКаталогов Цикл + Если ФС.КаталогСуществует(ПутьККаталогу) Тогда + УдалитьФайлы(ПутьККаталогу); + КонецЕсли; + КонецЦикла; КонецПроцедуры Функция СобратьТестовыйПакет() @@ -43,6 +52,19 @@ КонецФункции +Функция СобратьТестовыйПакетСПриложением() + + Сборщик = Новый СборщикПакета; + КаталогСборки = мВременныеФайлы.СоздатьКаталог(); + + Сборщик.СобратьПакет( + ОбъединитьПути(ТекущийСценарий().Каталог, "testpackage", "testpackage-with-app"), + Неопределено, КаталогСборки); + + Возврат Новый Файл(ОбъединитьПути(КаталогСборки, "testapp-1.0.0.ospx")); + +КонецФункции + Процедура ТестДолжен_УдалитьЛокальноУстановленныйПакет() Экспорт ФайлПакета = СобратьТестовыйПакет(); @@ -84,4 +106,75 @@ КонецПроцедуры +Процедура ТестДолжен_УдалитьЛокальныеСкриптыЗапуска() Экспорт + + ФайлПакета = СобратьТестовыйПакетСПриложением(); + + // Устанавливаем пакет локально с файлами запуска + Установщик = Новый МенеджерУстановкиПакетов(); + Установщик.УстановитьРежимУстановкиПакетов(РежимУстановкиПакетов.Локально); + Установщик.УстановитьПакетИзАрхива(ФайлПакета.ПолноеИмя, Истина); + + КаталогСкриптов = ОбъединитьПути(КонстантыOpm.ЛокальныйКаталогУстановкиПакетов, "bin"); + ПутьКПакету = ОбъединитьПути(КонстантыOpm.ЛокальныйКаталогУстановкиПакетов, "testapp"); + + Ожидаем.Что(ФС.КаталогСуществует(ПутьКПакету), "Каталог пакета должен существовать после установки").ЭтоИстина(); + + // Проверяем, что скрипт запуска создан (sh-скрипт на Linux) + ПутьКСкрипту = ОбъединитьПути(КаталогСкриптов, "testapp"); + Ожидаем.Что(ФС.ФайлСуществует(ПутьКСкрипту), "Скрипт запуска должен существовать после установки").ЭтоИстина(); + + // Удаляем пакет + РаботаСПакетами.УдалитьПакет("testapp", РежимУстановкиПакетов.Локально); + + // Проверяем, что каталог пакета удалён + Ожидаем.Что(ФС.КаталогСуществует(ПутьКПакету), "Каталог пакета не должен существовать после удаления").ЭтоЛожь(); + + // Проверяем, что скрипт запуска удалён + Ожидаем.Что(ФС.ФайлСуществует(ПутьКСкрипту), "Скрипт запуска не должен существовать после удаления").ЭтоЛожь(); + +КонецПроцедуры + +Процедура ТестДолжен_УдалитьГлобальныеСкриптыЗапуска() Экспорт + + ФайлПакета = СобратьТестовыйПакетСПриложением(); + + // Устанавливаем пакет глобально с файлами запуска + Установщик = Новый МенеджерУстановкиПакетов(); + Установщик.УстановитьПакетИзАрхива(ФайлПакета.ПолноеИмя); + + КаталогСистемныхБиблиотек = ОбъединитьПути(КаталогПрограммы(), ПолучитьЗначениеСистемнойНастройки("lib.system")); + ПутьКПакету = ОбъединитьПути(КаталогСистемныхБиблиотек, "testapp"); + + Ожидаем.Что(ФС.КаталогСуществует(ПутьКПакету), "Каталог пакета должен существовать после глобальной установки").ЭтоИстина(); + + // Проверяем, что скрипт запуска создан + КаталогСкриптов = КаталогПрограммы(); + ПутьКСкрипту = ОбъединитьПути(КаталогСкриптов, "testapp"); + Ожидаем.Что(ФС.ФайлСуществует(ПутьКСкрипту), "Скрипт запуска должен существовать после глобальной установки").ЭтоИстина(); + + // Удаляем пакет глобально + РаботаСПакетами.УдалитьПакет("testapp", РежимУстановкиПакетов.Глобально); + + // Проверяем, что каталог пакета удалён + Ожидаем.Что(ФС.КаталогСуществует(ПутьКПакету), "Каталог пакета не должен существовать после глобального удаления").ЭтоЛожь(); + + // Проверяем, что скрипт запуска удалён + Ожидаем.Что(ФС.ФайлСуществует(ПутьКСкрипту), "Скрипт запуска не должен существовать после глобального удаления").ЭтоЛожь(); + +КонецПроцедуры + +Процедура ТестДолжен_ВыброситьИсключениеДляНеустановленногоПакета() Экспорт + + ИсключениеВыброшено = Ложь; + Попытка + РаботаСПакетами.УдалитьПакет("несуществующий-пакет", РежимУстановкиПакетов.Локально); + Исключение + ИсключениеВыброшено = Истина; + КонецПопытки; + + Ожидаем.Что(ИсключениеВыброшено, "Должно быть выброшено исключение для неустановленного пакета").ЭтоИстина(); + +КонецПроцедуры + мВременныеФайлы = Новый МенеджерВременныхФайлов; From 14a14ab0233ea870e0ca4f80e54b2d0619b16a4e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 7 Feb 2026 11:21:45 +0000 Subject: [PATCH 6/6] test: create test package with executable dynamically instead of fixture Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com> --- tests/uninstall-test.os | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/tests/uninstall-test.os b/tests/uninstall-test.os index 91774f3..1584b95 100644 --- a/tests/uninstall-test.os +++ b/tests/uninstall-test.os @@ -54,12 +54,27 @@ Функция СобратьТестовыйПакетСПриложением() + КаталогИсходников = мВременныеФайлы.СоздатьКаталог(); + + // Создаём исходники тестового пакета с исполняемым файлом + КаталогПриложения = ОбъединитьПути(КаталогИсходников, "folder"); + СоздатьКаталог(КаталогПриложения); + + ЗаписьТекста = Новый ЗаписьТекста(ОбъединитьПути(КаталогПриложения, "main.os")); + ЗаписьТекста.ЗаписатьСтроку("Сообщить(""Привет"");"); + ЗаписьТекста.Закрыть(); + + ЗаписьТекста = Новый ЗаписьТекста(ОбъединитьПути(КаталогИсходников, "packagedef")); + ЗаписьТекста.ЗаписатьСтроку("Описание.Имя(""testapp"")"); + ЗаписьТекста.ЗаписатьСтроку(" .Версия(""1.0.0"")"); + ЗаписьТекста.ЗаписатьСтроку(" .ВключитьФайл(""folder"")"); + ЗаписьТекста.ЗаписатьСтроку(" .ИсполняемыйФайл(""folder/main.os"");"); + ЗаписьТекста.Закрыть(); + Сборщик = Новый СборщикПакета; КаталогСборки = мВременныеФайлы.СоздатьКаталог(); - Сборщик.СобратьПакет( - ОбъединитьПути(ТекущийСценарий().Каталог, "testpackage", "testpackage-with-app"), - Неопределено, КаталогСборки); + Сборщик.СобратьПакет(КаталогИсходников, Неопределено, КаталогСборки); Возврат Новый Файл(ОбъединитьПути(КаталогСборки, "testapp-1.0.0.ospx"));