diff --git a/src/cmd/opm.os b/src/cmd/opm.os index dc91f2d..86e4744 100644 --- a/src/cmd/opm.os +++ b/src/cmd/opm.os @@ -42,6 +42,11 @@ НСтр("ru='Скачать файл пакета и файлы зависимостей'; |en='Download package and dependencies'"), Новый КомандаOpm_Download); + + Приложение.ДобавитьКоманду("show s", + НСтр("ru='Показать информацию об установленном пакете'; + |en='Show installed package info'"), + Новый КомандаOpm_Show); Приложение.Запустить(АргументыКоманднойСтроки); 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_Show.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_Show.os" new file mode 100644 index 0000000..b841244 --- /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_Show.os" @@ -0,0 +1,147 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Прикладной интерфейс + +Процедура ОписаниеКоманды(Знач КомандаПриложения) Экспорт + + КомандаПриложения.Опция("l local", Ложь, "Искать в локально установленных пакетах"); + КомандаПриложения.Опция("r regex", Ложь, "Строка поиска будет использоваться как регулярное выражение"); + + КомандаПриложения.Аргумент("PACKAGE", "", "Строка поиска пакета") + .ТМассивСтрок() + .Обязательный(Истина); + +КонецПроцедуры + +Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт + + УстановкаВЛокальныйКаталог = КомандаПриложения.ЗначениеОпции("local"); + ИспользоватьРегулярныеВыражения = КомандаПриложения.ЗначениеОпции("regex"); + МассивПоисковыхЗапросов = КомандаПриложения.ЗначениеАргумента("PACKAGE"); + + ШаблоныПоиска = Новый Массив; + + Для Каждого мТекстЗапроса Из МассивПоисковыхЗапросов Цикл + + Если ИспользоватьРегулярныеВыражения Тогда + + РегулярноеВыражение = Новый РегулярноеВыражение(мТекстЗапроса); + РегулярноеВыражение.ИгнорироватьРегистр = Истина; + + ШаблоныПоиска.Добавить(РегулярноеВыражение); + + Иначе + ШаблоныПоиска.Добавить(ВРЕГ(СокрЛП(мТекстЗапроса))); + КонецЕсли; + + КонецЦикла; + + Если УстановкаВЛокальныйКаталог Тогда + ПутьККаталогуПакетов = ОбъединитьПути(ТекущийКаталог(), КонстантыOpm.ЛокальныйКаталогУстановкиПакетов); + КэшУстановленныхПакетов = Новый КэшУстановленныхПакетов(ПутьККаталогуПакетов); + Иначе + КэшУстановленныхПакетов = КэшУстановленныхПакетовГлобальныхПакетов(); + КонецЕсли; + + УстановленныеПакеты = КэшУстановленныхПакетов.ПолучитьУстановленныеПакеты(); + + КоличествоНайденныхПакетов = 0; + Для Каждого УстановленныйПакет Из УстановленныеПакеты Цикл + ИмяПакета = УстановленныйПакет.Ключ; + Для Каждого мШаблонПоиска Из ШаблоныПоиска Цикл + + Если Совпадает(мШаблонПоиска, ИмяПакета) Тогда + КоличествоНайденныхПакетов = КоличествоНайденныхПакетов + 1; + ВывестиИнформациюОПакете(УстановленныйПакет.Значение); + Прервать; + КонецЕсли; + + КонецЦикла; + + КонецЦикла; + + Сообщить(СтрШаблон("Найдено пакетов: %1", КоличествоНайденныхПакетов)); + +КонецПроцедуры + +Функция Совпадает(Знач ОбъектСравнения, Знач СтрокаПоиска) + + Если ТипЗнч(ОбъектСравнения) = Тип("РегулярноеВыражение") Тогда + Возврат ОбъектСравнения.Совпадает(СтрокаПоиска); + Иначе + Возврат ВРЕГ(СокрЛП(СтрокаПоиска)) = ОбъектСравнения; + КонецЕсли; + +КонецФункции + +Процедура ВывестиИнформациюОПакете(Знач УстановленныйПакет) + + Сообщить(СтрШаблон("Каталог: %1", УстановленныйПакет.КаталогПакета)); + Если УстановленныйПакет.Свойство("Перекрывает") Тогда + + Для Каждого мПакет Из УстановленныйПакет.Перекрывает Цикл + Сообщить(СтрШаблон(" ! Перекрывает: %1", мПакет.КаталогПакета)); + КонецЦикла; + + КонецЕсли; + + ОписаниеПакета = УстановленныйПакет.МетаданныеПакета; + Если ТипЗнч(ОписаниеПакета) <> Тип("Булево") Тогда + + + Свойства = ОписаниеПакета.Свойства(); + Для Каждого мСвойство Из Свойства Цикл + Сообщить(СтрШаблон(" %1: %2", мСвойство.Ключ, мСвойство.Значение)); + КонецЦикла; + + Зависимости = ОписаниеПакета.Зависимости(); + Зависимости.Сортировать("ДляРазработки"); + Для Каждого мЗависимость Из Зависимости Цикл + + Префикс = ?(мЗависимость.ДляРазработки, "Разработка зависит от", "Зависит от"); + СтрокаВерсииЗависимости = СтрокаВерсииЗависимости(мЗависимость); + + Сообщить(СтрШаблон(" %1 %2%3", Префикс, мЗависимость.ИмяПакета, СтрокаВерсииЗависимости)); + + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + +Функция СтрокаВерсииЗависимости(Знач мЗависимость) + + Подстроки = Новый Массив; + + Если ЗначениеЗаполнено(мЗависимость.МинимальнаяВерсия) Тогда + Подстроки.Добавить(">=" + мЗависимость.МинимальнаяВерсия); + КонецЕсли; + + Если ЗначениеЗаполнено(мЗависимость.МаксимальнаяВерсия) Тогда + Подстроки.Добавить("<=" + мЗависимость.МаксимальнаяВерсия); + КонецЕсли; + + Если ЗначениеЗаполнено(Подстроки) Тогда + Возврат " (" + СтрСоединить(Подстроки, ", ") + ")"; + КонецЕсли; + + Возврат ""; + +КонецФункции + +Функция КэшУстановленныхПакетовГлобальныхПакетов() + + ПутьККаталогуПакетов = ПолучитьЗначениеСистемнойНастройки("lib.system"); + КэшУстановленныхПакетов = Новый КэшУстановленныхПакетов(ПутьККаталогуПакетов); + + ДополнительныеКаталоги = ПолучитьЗначениеСистемнойНастройки("lib.additional"); + Если ЗначениеЗаполнено(ДополнительныеКаталоги) Тогда + + Для Каждого мКаталогПоиска Из СтрРазделить(ДополнительныеКаталоги, ";") Цикл + КэшУстановленныхПакетов.ДобавитьКаталогБиблиотек(СокрЛП(мКаталогПоиска)); + КонецЦикла; + + КонецЕсли; + + Возврат КэшУстановленныхПакетов; + +КонецФункции diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\321\215\321\210\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\213\321\205\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\321\215\321\210\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\213\321\205\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" index f2338de..54db500 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\321\215\321\210\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\213\321\205\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\321\215\321\210\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\213\321\205\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" @@ -42,20 +42,20 @@ УстановленаКорректнаяВерсия = Истина; ИначеЕсли ОписаниеЗависимости.МинимальнаяВерсия = ВерсияSNAPSHOT И УстановленнаяВерсия <> ВерсияSNAPSHOT Тогда УстановленаКорректнаяВерсия = Ложь; - Иначе - Если ОписаниеЗависимости.МинимальнаяВерсия = Неопределено Тогда - УстановленаКорректнаяВерсия = Истина; - Иначе - Попытка - // Сначала пытаемся использовать семвер - РезультатСравнения = Версии.СравнитьВерсии(УстановленнаяВерсия, ОписаниеЗависимости.МинимальнаяВерсия); - Исключение - // Если семвер не может обработать версию (например, 4-значную), используем модуль РаботаСВерсиями - РезультатСравнения = РаботаСВерсиями.СравнитьВерсии(УстановленнаяВерсия, ОписаниеЗависимости.МинимальнаяВерсия); - КонецПопытки; - - УстановленаКорректнаяВерсия = РезультатСравнения >= 0; - КонецЕсли; + Иначе + Если ОписаниеЗависимости.МинимальнаяВерсия = Неопределено Тогда + УстановленаКорректнаяВерсия = Истина; + Иначе + Попытка + // Сначала пытаемся использовать семвер + РезультатСравнения = Версии.СравнитьВерсии(УстановленнаяВерсия, ОписаниеЗависимости.МинимальнаяВерсия); + Исключение + // Если семвер не может обработать версию (например, 4-значную), используем модуль РаботаСВерсиями + РезультатСравнения = РаботаСВерсиями.СравнитьВерсии(УстановленнаяВерсия, ОписаниеЗависимости.МинимальнаяВерсия); + КонецПопытки; + + УстановленаКорректнаяВерсия = РезультатСравнения >= 0; + КонецЕсли; КонецЕсли; Лог.Отладка("Пакет установлен: " + ПакетУстановлен); @@ -104,12 +104,11 @@ КонецПроцедуры Процедура ДобавитьУстановленныйПакет(Знач ФайлКаталога) + + ИмяПакета = ФайлКаталога.Имя; - ПутьКФайлуМетаданных = ОбъединитьПути(ФайлКаталога.ПолноеИмя, КонстантыOpm.ИмяФайлаМетаданныхПакета); - ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных); - Если ФайлМетаданных.Существует() Тогда - МетаОписаниеПакета = РаботаСПакетами.ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных); - Иначе + МетаОписаниеПакета = НайтиМетаОписаниеПакета(ФайлКаталога); + Если МетаОписаниеПакета = Неопределено Тогда // @deprecated МетаОписаниеПакета = Истина; КонецЕсли; @@ -118,10 +117,49 @@ СтруктураДанных.Вставить("МетаданныеПакета", МетаОписаниеПакета); СтруктураДанных.Вставить("КаталогПакета", ФайлКаталога.ПолноеИмя); - УстановленныеПакеты.Вставить(ФайлКаталога.Имя, СтруктураДанных); + УжеДобавленныйПакет = УстановленныеПакеты.Получить(ИмяПакета); + Если УжеДобавленныйПакет <> Неопределено Тогда + + СтруктураДанных.Вставить("Перекрывает", Новый Массив); + СтруктураДанных.Перекрывает.Добавить(УжеДобавленныйПакет); + + Если УжеДобавленныйПакет.Свойство("Перекрывает") Тогда + + Для Каждого мПакет Из УжеДобавленныйПакет.Перекрывает Цикл + СтруктураДанных.Перекрывает.Добавить(мПакет); + КонецЦикла; + + УжеДобавленныйПакет.Удалить("Перекрывает"); + + КонецЕсли; + + КонецЕсли; + + УстановленныеПакеты.Вставить(ИмяПакета, СтруктураДанных); КонецПроцедуры +Функция НайтиМетаОписаниеПакета(Знач ФайлКаталога) + + ПутьКФайлуМетаданных = ОбъединитьПути(ФайлКаталога.ПолноеИмя, КонстантыOpm.ИмяФайлаМетаданныхПакета); + ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных); + Если ФайлМетаданных.Существует() Тогда + Возврат РаботаСПакетами.ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных); + КонецЕсли; + + ПутьКФайлуМетаданных = ОбъединитьПути(ФайлКаталога.ПолноеИмя, КонстантыOpm.ИмяФайлаКонфигурацииБиблиотеки); + ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных); + Если ФайлМетаданных.Существует() Тогда + ОписаниеПакета = Новый ОписаниеПакета(); + ОписаниеПакета.Имя(ФайлКаталога.Имя); + ОписаниеПакета.Версия("<НЕТ>"); + Возврат ОписаниеПакета; + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + Функция ПолучитьПутьКФайлуМетаданныхБиблиотеки(ИмяПакета) Экспорт ПутьКФайлуМетаданных = ""; @@ -140,10 +178,10 @@ Возврат ПутьКФайлуМетаданных; -КонецФункции - - - +КонецФункции + + + Процедура ПриСозданииОбъекта(КаталогПоискаБиблиотек = "") Лог = Логирование.ПолучитьЛог("oscript.app.opm"); @@ -162,4 +200,3 @@ КонецЕсли; КонецПроцедуры - diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\261\320\276\321\200\321\211\320\270\320\272\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\241\320\261\320\276\321\200\321\211\320\270\320\272\320\237\320\260\320\272\320\265\321\202\320\260.os" index 55abcbb..16bb622 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\261\320\276\321\200\321\211\320\270\320\272\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\241\320\261\320\276\321\200\321\211\320\270\320\272\320\237\320\260\320\272\320\265\321\202\320\260.os" @@ -126,9 +126,9 @@ Возврат; КонецЕсли; - Лог.Информация("Формирую определения модулей пакета (lib.config)"); + Лог.Информация("Формирую определения модулей пакета (%1)", КонстантыOpm.ИмяФайлаКонфигурацииБиблиотеки); - ПутьКонфигурацииПакета = ОбъединитьПути(ВремКаталогСборки, "lib.config"); + ПутьКонфигурацииПакета = ОбъединитьПути(ВремКаталогСборки, КонстантыOpm.ИмяФайлаКонфигурацииБиблиотеки); Запись = Новый ЗаписьXML; Запись.ОткрытьФайл(ПутьКонфигурацииПакета); Запись.ЗаписатьОбъявлениеXML(); diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\201\321\202\320\260\320\275\321\202\321\213Opm.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\201\321\202\320\260\320\275\321\202\321\213Opm.os" index c37a94a..1636df6 100644 --- "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\201\321\202\320\260\320\275\321\202\321\213Opm.os" +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\201\321\202\320\260\320\275\321\202\321\213Opm.os" @@ -11,12 +11,14 @@ Перем ИмяЛога Экспорт; Перем ВерсияПродукта Экспорт; Перем ИмяФайлаНастроек Экспорт; +Перем ИмяФайлаКонфигурацииБиблиотеки Экспорт; /////////////////////////////////////////////////////////////// ИмяФайлаСпецификацииПакета = "packagedef"; ИмяФайлаСодержимогоПакета = "content.zip"; ИмяФайлаМетаданныхПакета = "opm-metadata.xml"; +ИмяФайлаКонфигурацииБиблиотеки = "lib.config"; СерверУдаленногоХранилища = "http://hub.oscript.io"; РесурсПубликацииПакетов = "/push"; ПутьВХранилище = "/download/";