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..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" @@ -235,6 +235,68 @@ КонецФункции +Процедура УдалитьПакет(Знач ИмяПакета, Знач РежимУстановки) Экспорт + + КэшПакетов = ПолучитьУстановленныеПакеты(РежимУстановки); + УстановленныеПакеты = КэшПакетов.ПолучитьУстановленныеПакеты(); + + ДанныеПакета = УстановленныеПакеты.Получить(ИмяПакета); + Если ДанныеПакета = Неопределено Тогда + ВызватьИсключение СтрШаблон("Пакет '%1' не установлен", ИмяПакета); + КонецЕсли; + + КаталогПакета = ДанныеПакета.КаталогПакета; + + // Удалить скрипты запуска, если есть метаданные с исполняемыми файлами + МетаданныеПакета = ДанныеПакета.МетаданныеПакета; + Если ТипЗнч(МетаданныеПакета) <> Тип("Булево") Тогда + УдалитьСкриптыЗапуска(МетаданныеПакета, ИмяПакета, РежимУстановки); + КонецЕсли; + + // Удалить каталог пакета + Лог.Отладка("Удаляю каталог пакета: %1", КаталогПакета); + УдалитьФайлы(КаталогПакета); + + ОбщегоНазначенияOpm.СообщениеПользователю(Лог, "Пакет удалён: %1", ИмяПакета); + +КонецПроцедуры + +Процедура УдалитьСкриптыЗапуска(Знач МетаданныеПакета, Знач ИмяПакета, Знач РежимУстановки) + + ИсполняемыеФайлы = МетаданныеПакета.ИсполняемыеФайлы(); + Если ИсполняемыеФайлы.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Если РежимУстановки = РежимУстановкиПакетов.Локально Тогда + КаталогСкриптов = ОбъединитьПути(КонстантыOpm.ЛокальныйКаталогУстановкиПакетов, "bin"); + Иначе + КаталогСкриптов = КаталогПрограммы(); + Если НЕ ПустаяСтрока(ПолучитьПеременнуюСреды("OSCRIPTBIN")) Тогда + КаталогСкриптов = ПолучитьПеременнуюСреды("OSCRIPTBIN"); + КонецЕсли; + КонецЕсли; + + Для Каждого ФайлПриложения Из ИсполняемыеФайлы Цикл + + ИмяСкриптаЗапуска = ?(ПустаяСтрока(ФайлПриложения.ИмяПриложения), ИмяПакета, ФайлПриложения.ИмяПриложения); + + ПутьКСкрипту = ОбъединитьПути(КаталогСкриптов, ИмяСкриптаЗапуска + ".bat"); + Если ФС.ФайлСуществует(ПутьКСкрипту) Тогда + Лог.Отладка("Удаляю скрипт запуска: %1", ПутьКСкрипту); + УдалитьФайлы(ПутьКСкрипту); + КонецЕсли; + + ПутьКСкрипту = ОбъединитьПути(КаталогСкриптов, ИмяСкриптаЗапуска); + Если ФС.ФайлСуществует(ПутьКСкрипту) Тогда + Лог.Отладка("Удаляю скрипт запуска: %1", ПутьКСкрипту); + УдалитьФайлы(ПутьКСкрипту); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + Функция ПолучитьКаталогСистемныхБиблиотек() СистемныеБиблиотеки = ОбъединитьПути(КаталогПрограммы(), ПолучитьЗначениеСистемнойНастройки("lib.system")); diff --git a/tests/uninstall-test.os b/tests/uninstall-test.os new file mode 100644 index 0000000..1584b95 --- /dev/null +++ b/tests/uninstall-test.os @@ -0,0 +1,195 @@ +#Использовать "../src/core" +#Использовать asserts +#Использовать fs +#Использовать tempfiles + +Перем юТест; +Перем мВременныеФайлы; + +Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт + + юТест = Тестирование; + + ИменаТестов = Новый Массив; + + ИменаТестов.Добавить("ТестДолжен_УдалитьЛокальноУстановленныйПакет"); + ИменаТестов.Добавить("ТестДолжен_УдалитьГлобальноУстановленныйПакет"); + ИменаТестов.Добавить("ТестДолжен_УдалитьЛокальныеСкриптыЗапуска"); + ИменаТестов.Добавить("ТестДолжен_УдалитьГлобальныеСкриптыЗапуска"); + ИменаТестов.Добавить("ТестДолжен_ВыброситьИсключениеДляНеустановленногоПакета"); + + Возврат ИменаТестов; + +КонецФункции + +Процедура ПередЗапускомТеста() Экспорт +КонецПроцедуры + +Процедура ПослеЗапускаТеста() Экспорт + мВременныеФайлы.Удалить(); + + МассивКаталогов = Новый Массив; + МассивКаталогов.Добавить(ОбъединитьПути(ТекущийКаталог(), "oscript_modules", "test")); + МассивКаталогов.Добавить(ОбъединитьПути(ТекущийКаталог(), "oscript_modules", "testapp")); + + Для Каждого ПутьККаталогу Из МассивКаталогов Цикл + Если ФС.КаталогСуществует(ПутьККаталогу) Тогда + УдалитьФайлы(ПутьККаталогу); + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +Функция СобратьТестовыйПакет() + + Сборщик = Новый СборщикПакета; + КаталогСборки = мВременныеФайлы.СоздатьКаталог(); + + Сборщик.СобратьПакет( + ОбъединитьПути(ТекущийСценарий().Каталог, "testpackage", "testpackage-0.3.1"), + Неопределено, КаталогСборки); + + Возврат Новый Файл(ОбъединитьПути(КаталогСборки, "test-0.3.1.ospx")); + +КонецФункции + +Функция СобратьТестовыйПакетСПриложением() + + КаталогИсходников = мВременныеФайлы.СоздатьКаталог(); + + // Создаём исходники тестового пакета с исполняемым файлом + КаталогПриложения = ОбъединитьПути(КаталогИсходников, "folder"); + СоздатьКаталог(КаталогПриложения); + + ЗаписьТекста = Новый ЗаписьТекста(ОбъединитьПути(КаталогПриложения, "main.os")); + ЗаписьТекста.ЗаписатьСтроку("Сообщить(""Привет"");"); + ЗаписьТекста.Закрыть(); + + ЗаписьТекста = Новый ЗаписьТекста(ОбъединитьПути(КаталогИсходников, "packagedef")); + ЗаписьТекста.ЗаписатьСтроку("Описание.Имя(""testapp"")"); + ЗаписьТекста.ЗаписатьСтроку(" .Версия(""1.0.0"")"); + ЗаписьТекста.ЗаписатьСтроку(" .ВключитьФайл(""folder"")"); + ЗаписьТекста.ЗаписатьСтроку(" .ИсполняемыйФайл(""folder/main.os"");"); + ЗаписьТекста.Закрыть(); + + Сборщик = Новый СборщикПакета; + КаталогСборки = мВременныеФайлы.СоздатьКаталог(); + + Сборщик.СобратьПакет(КаталогИсходников, Неопределено, КаталогСборки); + + Возврат Новый Файл(ОбъединитьПути(КаталогСборки, "testapp-1.0.0.ospx")); + +КонецФункции + +Процедура ТестДолжен_УдалитьЛокальноУстановленныйПакет() Экспорт + + ФайлПакета = СобратьТестовыйПакет(); + + // Устанавливаем пакет локально + Установщик = Новый МенеджерУстановкиПакетов(); + Установщик.УстановитьРежимУстановкиПакетов(РежимУстановкиПакетов.Локально); + Установщик.УстановитьПакетИзАрхива(ФайлПакета.ПолноеИмя, Истина); + + ПутьКПакету = ОбъединитьПути(КонстантыOpm.ЛокальныйКаталогУстановкиПакетов, "test"); + Ожидаем.Что(ФС.КаталогСуществует(ПутьКПакету), "Каталог пакета должен существовать после установки").ЭтоИстина(); + + // Удаляем пакет + РаботаСПакетами.УдалитьПакет("test", РежимУстановкиПакетов.Локально); + + // Проверяем, что каталог пакета удалён + Ожидаем.Что(ФС.КаталогСуществует(ПутьКПакету), "Каталог пакета не должен существовать после удаления").ЭтоЛожь(); + +КонецПроцедуры + +Процедура ТестДолжен_УдалитьГлобальноУстановленныйПакет() Экспорт + + ФайлПакета = СобратьТестовыйПакет(); + + // Устанавливаем пакет глобально + Установщик = Новый МенеджерУстановкиПакетов(); + Установщик.СоздаватьФайлыЗапуска(Ложь); + Установщик.УстановитьПакетИзАрхива(ФайлПакета.ПолноеИмя); + + КаталогСистемныхБиблиотек = ОбъединитьПути(КаталогПрограммы(), ПолучитьЗначениеСистемнойНастройки("lib.system")); + ПутьКПакету = ОбъединитьПути(КаталогСистемныхБиблиотек, "test"); + Ожидаем.Что(ФС.КаталогСуществует(ПутьКПакету), "Каталог пакета должен существовать после глобальной установки").ЭтоИстина(); + + // Удаляем пакет глобально + РаботаСПакетами.УдалитьПакет("test", РежимУстановкиПакетов.Глобально); + + // Проверяем, что каталог пакета удалён + Ожидаем.Что(ФС.КаталогСуществует(ПутьКПакету), "Каталог пакета не должен существовать после глобального удаления").ЭтоЛожь(); + +КонецПроцедуры + +Процедура ТестДолжен_УдалитьЛокальныеСкриптыЗапуска() Экспорт + + ФайлПакета = СобратьТестовыйПакетСПриложением(); + + // Устанавливаем пакет локально с файлами запуска + Установщик = Новый МенеджерУстановкиПакетов(); + Установщик.УстановитьРежимУстановкиПакетов(РежимУстановкиПакетов.Локально); + Установщик.УстановитьПакетИзАрхива(ФайлПакета.ПолноеИмя, Истина); + + КаталогСкриптов = ОбъединитьПути(КонстантыOpm.ЛокальныйКаталогУстановкиПакетов, "bin"); + ПутьКПакету = ОбъединитьПути(КонстантыOpm.ЛокальныйКаталогУстановкиПакетов, "testapp"); + + Ожидаем.Что(ФС.КаталогСуществует(ПутьКПакету), "Каталог пакета должен существовать после установки").ЭтоИстина(); + + // Проверяем, что скрипт запуска создан (sh-скрипт на Linux) + ПутьКСкрипту = ОбъединитьПути(КаталогСкриптов, "testapp"); + Ожидаем.Что(ФС.ФайлСуществует(ПутьКСкрипту), "Скрипт запуска должен существовать после установки").ЭтоИстина(); + + // Удаляем пакет + РаботаСПакетами.УдалитьПакет("testapp", РежимУстановкиПакетов.Локально); + + // Проверяем, что каталог пакета удалён + Ожидаем.Что(ФС.КаталогСуществует(ПутьКПакету), "Каталог пакета не должен существовать после удаления").ЭтоЛожь(); + + // Проверяем, что скрипт запуска удалён + Ожидаем.Что(ФС.ФайлСуществует(ПутьКСкрипту), "Скрипт запуска не должен существовать после удаления").ЭтоЛожь(); + +КонецПроцедуры + +Процедура ТестДолжен_УдалитьГлобальныеСкриптыЗапуска() Экспорт + + ФайлПакета = СобратьТестовыйПакетСПриложением(); + + // Устанавливаем пакет глобально с файлами запуска + Установщик = Новый МенеджерУстановкиПакетов(); + Установщик.УстановитьПакетИзАрхива(ФайлПакета.ПолноеИмя); + + КаталогСистемныхБиблиотек = ОбъединитьПути(КаталогПрограммы(), ПолучитьЗначениеСистемнойНастройки("lib.system")); + ПутьКПакету = ОбъединитьПути(КаталогСистемныхБиблиотек, "testapp"); + + Ожидаем.Что(ФС.КаталогСуществует(ПутьКПакету), "Каталог пакета должен существовать после глобальной установки").ЭтоИстина(); + + // Проверяем, что скрипт запуска создан + КаталогСкриптов = КаталогПрограммы(); + ПутьКСкрипту = ОбъединитьПути(КаталогСкриптов, "testapp"); + Ожидаем.Что(ФС.ФайлСуществует(ПутьКСкрипту), "Скрипт запуска должен существовать после глобальной установки").ЭтоИстина(); + + // Удаляем пакет глобально + РаботаСПакетами.УдалитьПакет("testapp", РежимУстановкиПакетов.Глобально); + + // Проверяем, что каталог пакета удалён + Ожидаем.Что(ФС.КаталогСуществует(ПутьКПакету), "Каталог пакета не должен существовать после глобального удаления").ЭтоЛожь(); + + // Проверяем, что скрипт запуска удалён + Ожидаем.Что(ФС.ФайлСуществует(ПутьКСкрипту), "Скрипт запуска не должен существовать после глобального удаления").ЭтоЛожь(); + +КонецПроцедуры + +Процедура ТестДолжен_ВыброситьИсключениеДляНеустановленногоПакета() Экспорт + + ИсключениеВыброшено = Ложь; + Попытка + РаботаСПакетами.УдалитьПакет("несуществующий-пакет", РежимУстановкиПакетов.Локально); + Исключение + ИсключениеВыброшено = Истина; + КонецПопытки; + + Ожидаем.Что(ИсключениеВыброшено, "Должно быть выброшено исключение для неустановленного пакета").ЭтоИстина(); + +КонецПроцедуры + +мВременныеФайлы = Новый МенеджерВременныхФайлов;