Skip to content
Draft
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/cmd/opm.os
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Comment thread
nixel2007 marked this conversation as resolved.
Приложение.ДобавитьКоманду("u update", НСтр("ru='Обновить пакет';en='Update package'"), Новый КомандаOpm_Update);
Приложение.ДобавитьКоманду("version", НСтр("ru='Вывести версию продукта';en='show application version'"), Новый КомандаOpm_Version);
Приложение.ДобавитьКоманду("dl download",
Expand Down
25 changes: 25 additions & 0 deletions src/cmd/Классы/КомандаOpm_Uninstall.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// Прикладной интерфейс

Процедура ОписаниеКоманды(Знач КомандаПриложения) Экспорт

КомандаПриложения.Опция("l local", Ложь, "Удалить пакет из локального каталога oscript_modules");

КомандаПриложения.Аргумент("PACKAGE", "", "Имя пакета для удаления")
.Обязательный();

КонецПроцедуры

Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт

УдалениеИзЛокальногоКаталога = КомандаПриложения.ЗначениеОпции("local");
ИмяПакета = КомандаПриложения.ЗначениеАргумента("PACKAGE");

РежимУстановки = РежимУстановкиПакетов.Глобально;
Если УдалениеИзЛокальногоКаталога Тогда
РежимУстановки = РежимУстановкиПакетов.Локально;
КонецЕсли;

РаботаСПакетами.УдалитьПакет(ИмяПакета, РежимУстановки);

КонецПроцедуры
80 changes: 80 additions & 0 deletions src/core/Модули/РаботаСПакетами.os
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,86 @@

КонецФункции

Процедура УдалитьПакет(Знач ИмяПакета, Знач РежимУстановки) Экспорт

КэшПакетов = ПолучитьУстановленныеПакеты(РежимУстановки);
УстановленныеПакеты = КэшПакетов.ПолучитьУстановленныеПакеты();

ДанныеПакета = УстановленныеПакеты.Получить(ИмяПакета);
Если ДанныеПакета = Неопределено Тогда
ВызватьИсключение СтрШаблон("Пакет '%1' не установлен", ИмяПакета);
КонецЕсли;

КаталогПакета = ДанныеПакета.КаталогПакета;

// Удалить скрипты запуска, если есть метаданные с исполняемыми файлами
МетаданныеПакета = ДанныеПакета.МетаданныеПакета;
Если ТипЗнч(МетаданныеПакета) <> Тип("Булево") Тогда
УдалитьСкриптыЗапуска(МетаданныеПакета, ИмяПакета, РежимУстановки);
КонецЕсли;

// Удалить каталог пакета
Лог.Отладка("Удаляю каталог пакета: %1", КаталогПакета);
УдалитьФайлы(КаталогПакета);

ОбщегоНазначенияOpm.СообщениеПользователю(Лог, "Пакет удалён: %1", ИмяПакета);

КонецПроцедуры

Процедура УдалитьСкриптыЗапуска(Знач МетаданныеПакета, Знач ИмяПакета, Знач РежимУстановки)

СИ = Новый СистемнаяИнформация();
ЭтоWindows = Найти(НРег(СИ.ВерсияОС), "windows") > 0;

ИсполняемыеФайлы = МетаданныеПакета.ИсполняемыеФайлы();
Если ИсполняемыеФайлы.Количество() = 0 Тогда
Возврат;
КонецЕсли;

Если РежимУстановки = РежимУстановкиПакетов.Локально Тогда
КаталогСкриптов = ОбъединитьПути(КонстантыOpm.ЛокальныйКаталогУстановкиПакетов, "bin");
Иначе
КаталогСкриптов = ?(ЭтоWindows, КаталогПрограммы(), ПолучитьКаталогСкриптовLinux());
Если НЕ ПустаяСтрока(ПолучитьПеременнуюСреды("OSCRIPTBIN")) Тогда
КаталогСкриптов = ПолучитьПеременнуюСреды("OSCRIPTBIN");
КонецЕсли;
КонецЕсли;

Для Каждого ФайлПриложения Из ИсполняемыеФайлы Цикл

ИмяСкриптаЗапуска = ?(ПустаяСтрока(ФайлПриложения.ИмяПриложения), ИмяПакета, ФайлПриложения.ИмяПриложения);

Если ЭтоWindows Тогда
ПутьКСкрипту = ОбъединитьПути(КаталогСкриптов, ИмяСкриптаЗапуска + ".bat");
Если ФС.ФайлСуществует(ПутьКСкрипту) Тогда
Лог.Отладка("Удаляю скрипт запуска: %1", ПутьКСкрипту);
УдалитьФайлы(ПутьКСкрипту);
КонецЕсли;
КонецЕсли;

ПутьКСкрипту = ОбъединитьПути(КаталогСкриптов, ИмяСкриптаЗапуска);
Если ФС.ФайлСуществует(ПутьКСкрипту) Тогда
Лог.Отладка("Удаляю скрипт запуска: %1", ПутьКСкрипту);
УдалитьФайлы(ПутьКСкрипту);
КонецЕсли;

КонецЦикла;

КонецПроцедуры

Функция ПолучитьКаталогСкриптовLinux()
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot скрипты ставятся в тот же каталог, где лежит исполняемый файл oscript

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Исправил — теперь для глобального режима используется КаталогПрограммы() на всех платформах. Удалил ПолучитьКаталогСкриптовLinux() с эвристикой /usr/bin vs /usr/local/bin (61f56d7).


ТекстовыйДокумент = Новый ТекстовыйДокумент();
Попытка
ТекстовыйДокумент.Записать("/usr/bin/opm-check-temp.txt");
УдалитьФайлы("/usr/bin/opm-check-temp.txt");
Возврат "/usr/bin";
Исключение
Возврат "/usr/local/bin";
КонецПопытки;

КонецФункции

Функция ПолучитьКаталогСистемныхБиблиотек()

СистемныеБиблиотеки = ОбъединитьПути(КаталогПрограммы(), ПолучитьЗначениеСистемнойНастройки("lib.system"));
Expand Down
60 changes: 60 additions & 0 deletions tests/uninstall-test.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
#Использовать "../src/core"
#Использовать asserts
#Использовать fs
#Использовать tempfiles

Перем юТест;
Перем мВременныеФайлы;

Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт

юТест = Тестирование;

ИменаТестов = Новый Массив;

ИменаТестов.Добавить("ТестДолжен_УдалитьУстановленныйПакет");

Возврат ИменаТестов;

КонецФункции

Процедура ПередЗапускомТеста() Экспорт
КонецПроцедуры

Процедура ПослеЗапускаТеста() Экспорт
мВременныеФайлы.Удалить();
ПутьККаталогу = ОбъединитьПути(ТекущийКаталог(), "oscript_modules", "test");
Если ФС.КаталогСуществует(ПутьККаталогу) Тогда
УдалитьФайлы(ПутьККаталогу);
КонецЕсли;
КонецПроцедуры

Процедура ТестДолжен_УдалитьУстановленныйПакет() Экспорт
Comment thread
nixel2007 marked this conversation as resolved.
Outdated

// Собираем тестовый пакет
Сборщик = Новый СборщикПакета;
КаталогСборки = мВременныеФайлы.СоздатьКаталог();

Сборщик.СобратьПакет(
ОбъединитьПути(ТекущийСценарий().Каталог, "testpackage", "testpackage-0.3.1"),
Неопределено, КаталогСборки);

ФайлПакета = Новый Файл(ОбъединитьПути(КаталогСборки, "test-0.3.1.ospx"));

// Устанавливаем пакет локально
Установщик = Новый МенеджерУстановкиПакетов();
Установщик.УстановитьРежимУстановкиПакетов(РежимУстановкиПакетов.Локально);
Установщик.УстановитьПакетИзАрхива(ФайлПакета.ПолноеИмя, Истина);

ПутьКПакету = ОбъединитьПути(КонстантыOpm.ЛокальныйКаталогУстановкиПакетов, "test");
Ожидаем.Что(ФС.КаталогСуществует(ПутьКПакету), "Каталог пакета должен существовать после установки").ЭтоИстина();

// Удаляем пакет
РаботаСПакетами.УдалитьПакет("test", РежимУстановкиПакетов.Локально);

// Проверяем, что каталог пакета удалён
Ожидаем.Что(ФС.КаталогСуществует(ПутьКПакету), "Каталог пакета не должен существовать после удаления").ЭтоЛожь();

КонецПроцедуры

мВременныеФайлы = Новый МенеджерВременныхФайлов;
Loading