From 4f82b4a1389bf88ad3cac4ae4f2cc9fbce7fe8e4 Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Thu, 26 Jun 2025 17:13:34 +0300 Subject: [PATCH 1/8] opm download MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Рекурсивное скачивание пакета с зависимостями. --- src/cmd/opm.os | 4 + ...60\320\275\320\264\320\260Opm_Download.os" | 137 ++++++++++++++++ ...20\272\320\265\321\202\320\276\320\262.os" | 147 ++++++++++++++++++ ...20\272\320\265\321\202\320\276\320\262.os" | 19 ++- ...20\260\320\272\320\265\321\202\320\260.os" | 36 ++++- ...20\272\320\265\321\202\320\276\320\262.os" | 2 + 6 files changed, 334 insertions(+), 11 deletions(-) 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_Download.os" create mode 100644 "src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\321\215\321\210\320\241\320\272\320\260\321\207\320\260\320\275\320\275\321\213\321\205\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" diff --git a/src/cmd/opm.os b/src/cmd/opm.os index bed49fb..dc91f2d 100644 --- a/src/cmd/opm.os +++ b/src/cmd/opm.os @@ -38,6 +38,10 @@ Приложение.ДобавитьКоманду("test", НСтр("ru='Выполнить тестирование проекта';en='Run project testing'"), Новый КомандаOpm_Test); Приложение.ДобавитьКоманду("u update", НСтр("ru='Обновить пакет';en='Update package'"), Новый КомандаOpm_Update); Приложение.ДобавитьКоманду("version", НСтр("ru='Вывести версию продукта';en='show application version'"), Новый КомандаOpm_Version); + Приложение.ДобавитьКоманду("dl download", + НСтр("ru='Скачать файл пакета и файлы зависимостей'; + |en='Download package and dependencies'"), + Новый КомандаOpm_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_Download.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_Download.os" new file mode 100644 index 0000000..4ee0036 --- /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_Download.os" @@ -0,0 +1,137 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Прикладной интерфейс + +Процедура ОписаниеКоманды(Знач КомандаПриложения) Экспорт + + КомандаПриложения.Опция("a all", Ложь, "Установить все пакеты, зарегистрированные в хабе"); + КомандаПриложения.Опция("f file", "", "Указать файл из которого нужно установить пакет. Поддерживает указание маски файла для пакетной установки"); + КомандаПриложения.Опция("u url", "", "Указать прямую интернет-ссылку на файл *.ospx из которого нужно установить пакет"); + + КомандаПриложения.Опция("dev", Ложь, "Признак установки пакетов для разработки"); + КомандаПриложения.Опция("s skip-install-deps", Ложь, "признак пропуска установки зависимых пакетов"); + КомандаПриложения.Опция("d dest", "", "Целевой каталог"); + + ОпцияЗеркала = КомандаПриложения.Опция("m mirror", "", "Указать имя сервера, с которого необходимо ставить пакеты. + | Доступные сервера прописываются в конфигурационном файле opm.cfg, параметр 'СервераПакетов'.") + .ВОкружении("OPM_HUB_MIRROR") + .ТПеречисление(); + + МенеджерПолучения = Новый МенеджерПолученияПакетов(); + Для Каждого ДоступноеЗеркало Из МенеджерПолучения.ИменаДоступныхСерверов() Цикл + ОпцияЗеркала.Перечисление(ДоступноеЗеркало, ДоступноеЗеркало, "Сервер '" + ДоступноеЗеркало + "'"); + КонецЦикла; + + КомандаПриложения.Аргумент("PACKAGE", "", "Имя пакета в хабе. Чтобы установить конкретную версию, используйте ИмяПакета@ВерсияПакета") + .ТМассивСтрок() + .Обязательный(Ложь); + + // КомандаПриложения.Спек = "(-a | --all | -l | --local | -d | --dest )"; + +КонецПроцедуры + +Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт + + УстановкаПакетовРазработчика = КомандаПриложения.ЗначениеОпции("dev"); + УстановкаВсехПакетов = КомандаПриложения.ЗначениеОпции("all"); + КаталогУстановки = КомандаПриложения.ЗначениеОпции("dest"); + ФайлПакетаУстановки = КомандаПриложения.ЗначениеОпции("file"); + ИнтернетСсылкаНаПакет = КомандаПриложения.ЗначениеОпции("url"); + МассивПакетовКУстановке = КомандаПриложения.ЗначениеАргумента("PACKAGE"); + + НеобходимоУстановитьЗависимости = Не КомандаПриложения.ЗначениеОпции("skip-install-deps"); + ИмяСервера = КомандаПриложения.ЗначениеОпции("mirror"); + + РежимУстановки = РежимУстановкиПакетов.Скачивание; + + Если Не ПустаяСтрока(КаталогУстановки) Тогда + ЦелевойКаталог = КаталогУстановки; + Иначе + ЦелевойКаталог = ТекущийКаталог(); + КонецЕсли; + Лог = Логирование.ПолучитьЛог(ПараметрыПриложенияOpm.ИмяЛогаСистемы()); + + Лог.Отладка("УстановкаПакетовРазработчика: %1", УстановкаПакетовРазработчика); + Лог.Отладка("УстановкаВсехПакетов: %1", УстановкаВсехПакетов); + Лог.Отладка("КаталогУстановки: %1", КаталогУстановки); + Лог.Отладка("ФайлПакетаУстановки: %1", ФайлПакетаУстановки); + Лог.Отладка("ИнтернетСсылкаНаПакет: %1", ИнтернетСсылкаНаПакет); + Лог.Отладка("МассивПакетовКУстановке: %1", МассивПакетовКУстановке.Количество()); + Лог.Отладка("НеобходимоУстановитьЗависимости: %1", НеобходимоУстановитьЗависимости); + + НастройкаУстановки = РаботаСПакетами.ПолучитьНастройкуУстановки(); + НастройкаУстановки.УстанавливатьЗависимости = НеобходимоУстановитьЗависимости; + НастройкаУстановки.УстанавливатьЗависимостиРазработчика = УстановкаПакетовРазработчика; + НастройкаУстановки.СоздаватьФайлыЗапуска = Ложь; + НастройкаУстановки.ИмяСервера = ИмяСервера; + + Если УстановкаВсехПакетов Тогда + РаботаСПакетами.УстановитьВсеПакетыИзОблака(РежимУстановки, ЦелевойКаталог, НастройкаУстановки); + ИначеЕсли ПустаяСтрока(ФайлПакетаУстановки) И ПустаяСтрока(ИнтернетСсылкаНаПакет) И МассивПакетовКУстановке.Количество() = 0 Тогда + РаботаСПакетами.УстановитьПакетыПоОписаниюПакета(РежимУстановки, ЦелевойКаталог, НастройкаУстановки); + ИначеЕсли НЕ ПустаяСтрока(ФайлПакетаУстановки) Тогда + + РазобранныйАдрес = СтрРазделить(ФайлПакетаУстановки, ПолучитьРазделительПути()); + Путь = "."; + Маска = ФайлПакетаУстановки; + Если РазобранныйАдрес.Количество() > 1 Тогда // отделим последнюю секцию как имя файла, а остальное опять соберем в строку пути + + Маска = РазобранныйАдрес[РазобранныйАдрес.Количество() - 1]; + РазобранныйАдрес.Удалить(РазобранныйАдрес.Количество() - 1); + Путь = СтрСоединить(РазобранныйАдрес, ПолучитьРазделительПути()); + + КонецЕсли; + + ФайлыПоМаске = НайтиФайлы(Путь, Маска); + Для Каждого ФайлПакета Из ФайлыПоМаске Цикл + + РаботаСПакетами.УстановитьПакетИзФайла(ФайлПакета.ПолноеИмя, РежимУстановки, ЦелевойКаталог, НастройкаУстановки); + + КонецЦикла; + + ИначеЕсли НЕ ПустаяСтрока(ИнтернетСсылкаНаПакет) Тогда + + позСервер = СтрНайти(ИнтернетСсылкаНаПакет, "/", , , 3); + Сервер = Лев(ИнтернетСсылкаНаПакет, позСервер-1); + Адрес = Сред(ИнтернетСсылкаНаПакет, позСервер); + Если Нрег(Лев(Сервер, 5)) = "https" Тогда + Порт = 443; + Иначе + Порт = 80; + КонецЕсли; + + Соединение = Новый HTTPСоединение(Сервер, Порт); + Запрос = Новый HTTPЗапрос(Адрес); + Ответ = Соединение.Получить(Запрос); + ДД = Ответ.ПолучитьТелоКакДвоичныеДанные(); + ИмяВременногоФайла = ПолучитьИмяВременногоФайла("ospx"); + ДД.Записать(ИмяВременногоФайла); + + РаботаСПакетами.УстановитьПакетИзФайла(ИмяВременногоФайла, РежимУстановки, ЦелевойКаталог, НастройкаУстановки); + + УдалитьФайлы(ИмяВременногоФайла); + + Иначе + + Для каждого ИмяПакета Из МассивПакетовКУстановке Цикл + + Если ЭтоФайлПакета(ИмяПакета) Тогда + + РаботаСПакетами.УстановитьПакетИзФайла(ИмяПакета, РежимУстановки, ЦелевойКаталог, НастройкаУстановки); + + Иначе + + РаботаСПакетами.УстановитьПакетИзОблака(ИмяПакета, РежимУстановки, ЦелевойКаталог, НастройкаУстановки); + + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + +Функция ЭтоФайлПакета(Знач ИмяПакета) + + Возврат СтрЗаканчиваетсяНа(НРег(ИмяПакета), ".ospx"); + +КонецФункции diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\321\215\321\210\320\241\320\272\320\260\321\207\320\260\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\241\320\272\320\260\321\207\320\260\320\275\320\275\321\213\321\205\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" new file mode 100644 index 0000000..dcc4c57 --- /dev/null +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\321\215\321\210\320\241\320\272\320\260\321\207\320\260\320\275\320\275\321\213\321\205\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" @@ -0,0 +1,147 @@ + +#Использовать fs +#Использовать logos +#Использовать semver + +Перем Лог; + +Перем КаталогПоискаБиблиотек; + +Перем УстановленныеПакеты; + +Функция ПакетУстановлен(Знач ОписаниеЗависимости, Знач КаталогПоискаБиблиотек = "") Экспорт + + Перем УстановленныеПакеты; + УстановленныеПакеты = ПолучитьУстановленныеПакеты(); + + ДанныеПакета = УстановленныеПакеты.Получить(ОписаниеЗависимости.ИмяПакета); + ПакетУстановлен = ДанныеПакета <> Неопределено; + Если ПакетУстановлен И НЕ ПустаяСтрока(КаталогПоискаБиблиотек) Тогда + КаталогБиблиотекПакета = Новый Файл(ОбъединитьПути(ДанныеПакета.КаталогПакета, "..")).ПолноеИмя; + ПакетУстановлен = ФС.ПутиРавны(КаталогБиблиотекПакета, КаталогПоискаБиблиотек); + КонецЕсли; + + ПутьКФайлуМетаданных = ПолучитьПутьКФайлуМетаданныхБиблиотеки(ОписаниеЗависимости.ИмяПакета); + + ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных); + Если ФайлМетаданных.Существует() Тогда + МетаОписаниеПакета = ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных); + УстановленнаяВерсия = МетаОписаниеПакета.Свойства().Версия; + Иначе + // @deprecated + УстановленнаяВерсия = "0"; + КонецЕсли; + Лог.Отладка("ПакетУстановлен: Перед вызовом СравнитьВерсии(ЭтаВерсия = <%1>, БольшеЧемВерсия = <%2>)", УстановленнаяВерсия, ОписаниеЗависимости.МинимальнаяВерсия); + + ВерсияSNAPSHOT = "SNAPSHOT"; + Если ОписаниеЗависимости.МинимальнаяВерсия = ВерсияSNAPSHOT И УстановленнаяВерсия = ВерсияSNAPSHOT Тогда + УстановленаКорректнаяВерсия = Истина; + ИначеЕсли ОписаниеЗависимости.МинимальнаяВерсия = ВерсияSNAPSHOT И УстановленнаяВерсия <> ВерсияSNAPSHOT Тогда + УстановленаКорректнаяВерсия = Ложь; + Иначе + УстановленаКорректнаяВерсия = ОписаниеЗависимости.МинимальнаяВерсия = Неопределено + ИЛИ Версии.СравнитьВерсии(УстановленнаяВерсия, ОписаниеЗависимости.МинимальнаяВерсия) >= 0; + КонецЕсли; + + Лог.Отладка("Пакет установлен: " + ПакетУстановлен); + Лог.Отладка("Установлена корректная версия: " + УстановленаКорректнаяВерсия); + Возврат ПакетУстановлен И УстановленаКорректнаяВерсия; + +КонецФункции + +Процедура Обновить() Экспорт + + УстановленныеПакеты = Новый Соответствие; + НайденныеФайлы = НайтиФайлы(КаталогПоискаБиблиотек, ПолучитьМаскуВсеФайлы()); + + Для Каждого ФайлКаталога Из НайденныеФайлы Цикл + Если ФайлКаталога.ЭтоКаталог() Тогда + + // ДобавитьУстановленныйПакет заменит уже добавленный пакет при совпадении имён + // Соответственно, более поздние каталоги будут иметь приоритет + ДобавитьУстановленныйПакет(ФайлКаталога); + + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Функция ПолучитьУстановленныеПакеты() Экспорт + + Если УстановленныеПакеты = Неопределено Тогда + Обновить(); + КонецЕсли; + + Возврат УстановленныеПакеты; + +КонецФункции + +// Добавляет каталог в список, по которому выполняется поиск библиотек +Процедура ДобавитьКаталогБиблиотек(Знач Каталог) Экспорт + + //МассивКаталоговПоискаБиблиотек.Добавить(Каталог); + +КонецПроцедуры + +Процедура ДобавитьУстановленныйПакет(Знач ФайлКаталога) + + ПутьКФайлуМетаданных = ОбъединитьПути(ФайлКаталога.ПолноеИмя, КонстантыOpm.ИмяФайлаМетаданныхПакета); + ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных); + Если ФайлМетаданных.Существует() Тогда + МетаОписаниеПакета = ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных); + Иначе + // @deprecated + МетаОписаниеПакета = Истина; + КонецЕсли; + + СтруктураДанных = Новый Структура(); + СтруктураДанных.Вставить("МетаданныеПакета", МетаОписаниеПакета); + СтруктураДанных.Вставить("КаталогПакета", ФайлКаталога.ПолноеИмя); + + УстановленныеПакеты.Вставить(ФайлКаталога.Имя, СтруктураДанных); + +КонецПроцедуры + +Функция ПрочитатьМетаданныеПакета(Знач ПутьКФайлуМетаданных) + + Перем Метаданные; + Попытка + Чтение = Новый ЧтениеXML; + Чтение.ОткрытьФайл(ПутьКФайлуМетаданных); + Сериализатор = Новый СериализацияМетаданныхПакета; + Метаданные = Сериализатор.ПрочитатьXML(Чтение); + + Чтение.Закрыть(); + Исключение + Чтение.Закрыть(); + ВызватьИсключение; + КонецПопытки; + + Возврат Метаданные; + +КонецФункции + +Функция ПолучитьПутьКФайлуМетаданныхБиблиотеки(ИмяПакета) Экспорт + + ПутьКФайлуМетаданных = ""; + ВремПутьКФайлуМетаданных = ОбъединитьПути( + КаталогПоискаБиблиотек, + ИмяПакета, + КонстантыOpm.ИмяФайлаМетаданныхПакета + ); + + Лог.Отладка(Новый Файл(ВремПутьКФайлуМетаданных).ПолноеИмя); + Если ФС.ФайлСуществует(ВремПутьКФайлуМетаданных) Тогда + ПутьКФайлуМетаданных = ВремПутьКФайлуМетаданных; + КонецЕсли; + + Возврат ПутьКФайлуМетаданных; + +КонецФункции + +Процедура ПриСозданииОбъекта(Знач ЦелевойКаталогСкачиванияБиблиотек) + + Лог = Логирование.ПолучитьЛог("oscript.app.opm"); + КаталогПоискаБиблиотек = ЦелевойКаталогСкачиванияБиблиотек; + +КонецПроцедуры diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\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\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" index 85c872e..ab4d368 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\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\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" @@ -45,6 +45,8 @@ Иначе Если ТекущийРежимУстановкиПакетов = РежимУстановкиПакетов.Локально Тогда УстановитьКаталогЗависимостей(ПутьККаталогуЛокальнойУстановки); + ИначеЕсли ТекущийРежимУстановкиПакетов = РежимУстановкиПакетов.Скачивание Тогда + УстановитьКаталогЗависимостей(ЦелевойКаталогУстановки); Иначе КаталогСистемныхБиблиотек = ПолучитьКаталогСистемныхБиблиотек(); УстановитьКаталогЗависимостей(КаталогСистемныхБиблиотек); @@ -82,7 +84,10 @@ Если КаталогУстановкиЗависимостей = КаталогСистемныхБиблиотек Тогда УстановитьКаталогЗависимостей(ПутьККаталогуЛокальнойУстановки); КонецЕсли; - + + ИначеЕсли ТекущийРежимУстановкиПакетов = РежимУстановкиПакетов.Скачивание Тогда + УстановитьКаталогЗависимостей(ЦелевойКаталогУстановки); + Иначе УстановитьКаталогЗависимостей(КаталогСистемныхБиблиотек); КонецЕсли; @@ -143,6 +148,9 @@ ИмяКаталогаЛокальныхЗависимостей = КонстантыOpm.ЛокальныйКаталогУстановкиПакетов; ПутьККаталогуЛокальныхЗависимостей = ОбъединитьПути(ПолныйПутьККаталогуУстановки, ИмяПакета, ИмяКаталогаЛокальныхЗависимостей); + Если ТекущийРежимУстановкиПакетов = РежимУстановкиПакетов.Скачивание Тогда + ПутьККаталогуЛокальныхЗависимостей = ПолныйПутьККаталогуУстановки; + КонецЕсли; Если УстанавливатьЗависимости Тогда // Тут надо корректно найти имя пакета в пути @@ -208,7 +216,8 @@ ПутьККаталогуПакетаЗависимостиИсточник = ОбъединитьПути(ПутьККаталогуЛокальныхЗависимостей, Зависимость.ИмяПакета); - Если ФС.КаталогСуществует(ПутьККаталогуПакетаЗависимостиИсточник) Тогда + Если ТекущийРежимУстановкиПакетов <> РежимУстановкиПакетов.Скачивание + И ФС.КаталогСуществует(ПутьККаталогуПакетаЗависимостиИсточник) Тогда ПутьККаталогуПакетаЗависимостиПриемник = ОбъединитьПути(КаталогУстановкиЗависимостей, Зависимость.ИмяПакета); ФС.КопироватьСодержимоеКаталога(ПутьККаталогуПакетаЗависимостиИсточник, ПутьККаталогуПакетаЗависимостиПриемник); @@ -227,7 +236,11 @@ Функция ПолучитьУстановленныеПакеты() - КэшУстановленныхПакетов = Новый КэшУстановленныхПакетов(КаталогУстановкиЗависимостей); + Если ТекущийРежимУстановкиПакетов = РежимУстановкиПакетов.Скачивание Тогда + КэшУстановленныхПакетов = Новый КэшСкачанныхПакетов(ЦелевойКаталогУстановки); + Иначе + КэшУстановленныхПакетов = Новый КэшУстановленныхПакетов(КаталогУстановкиЗависимостей); + КонецЕсли; Возврат КэшУстановленныхПакетов; 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 59eb0df..8354db4 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" @@ -35,8 +35,14 @@ Метаданные = ПрочитатьМетаданныеПакета(ФайлМетаданных); ИмяПакета = Метаданные.Свойства().Имя; + ВерсияПакета = Метаданные.Свойства().Версия; - ОбъектКаталогУстановки = НайтиСоздатьКаталогУстановки(ИмяПакета); + Если мРежимУстановкиПакетов = РежимУстановкиПакетов.Скачивание Тогда + ОбъектКаталогУстановки = НайтиСоздатьКаталогУстановки(ИмяПакета, ВерсияПакета); + Иначе + ОбъектКаталогУстановки = НайтиСоздатьКаталогУстановки(ИмяПакета); + КонецЕсли; + ПутьУстановки = ОбъектКаталогУстановки.ПолноеИмя; Лог.Информация("Устанавливаю пакет " + ИмяПакета); @@ -48,12 +54,19 @@ мЗависимостиВРаботе.Вставить(ИмяПакета, "ВРаботе"); - СтандартнаяОбработка = Истина; - УстановитьФайлыПакета(ОбъектКаталогУстановки, ФайлСодержимого, СтандартнаяОбработка); - Если СтандартнаяОбработка Тогда - СгенерироватьСкриптыЗапускаПриложенийПриНеобходимости(ПутьУстановки, Метаданные); - РаботаСПакетами.СоздатьКонфигурационныеФайлыОСкрипт(ПутьУстановки, Метаданные, мРежимУстановкиПакетов); + + Если мРежимУстановкиПакетов = РежимУстановкиПакетов.Скачивание Тогда + ЦелевоеИмяФайла = ПутьУстановки + ".ospx"; + КопироватьФайл(ФайлАрхива, ЦелевоеИмяФайла); + Иначе + СтандартнаяОбработка = Истина; + УстановитьФайлыПакета(ОбъектКаталогУстановки, ФайлСодержимого, СтандартнаяОбработка); + Если СтандартнаяОбработка Тогда + СгенерироватьСкриптыЗапускаПриложенийПриНеобходимости(ПутьУстановки, Метаданные); + РаботаСПакетами.СоздатьКонфигурационныеФайлыОСкрипт(ПутьУстановки, Метаданные, мРежимУстановкиПакетов); + КонецЕсли; КонецЕсли; + СохранитьФайлМетаданныхПакета(ПутьУстановки, ФайлМетаданных); ЧтениеПакета.Закрыть(); @@ -98,9 +111,16 @@ мЦелевойКаталог = ЦелевойКаталогУстановки; КонецПроцедуры -Функция НайтиСоздатьКаталогУстановки(Знач ИдентификаторПакета) +Функция НайтиСоздатьКаталогУстановки(Знач ИдентификаторПакета, Знач ВерсияПакета = Неопределено) - ОбъектКаталогУстановки = Новый Файл(ОбъединитьПути(мЦелевойКаталог, ИдентификаторПакета)); + Если ВерсияПакета <> Неопределено Тогда + ОбъектКаталогУстановки = Новый Файл(ОбъединитьПути(мЦелевойКаталог, + ИдентификаторПакета, + ИдентификаторПакета + "-" + ВерсияПакета)); + Иначе + ОбъектКаталогУстановки = Новый Файл(ОбъединитьПути(мЦелевойКаталог, ИдентификаторПакета)); + КонецЕсли; + ПутьУстановки = ОбъектКаталогУстановки.ПолноеИмя; Лог.Отладка("Путь установки пакета: " + ПутьУстановки); diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\265\320\266\320\270\320\274\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\265\320\266\320\270\320\274\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" index a385d84..a019112 100644 --- "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\265\320\266\320\270\320\274\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\265\320\266\320\270\320\274\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" @@ -1,8 +1,10 @@ Перем Локально Экспорт; Перем Глобально Экспорт; +Перем Скачивание Экспорт; /////////////////////////////////////////////////////////////// Локально = "Локально"; Глобально = "Глобально"; +Скачивание = "Скачивание"; \ No newline at end of file From 4397e9f684d5594c9b24ed3f05581116444e7dba Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Thu, 26 Jun 2025 18:29:16 +0300 Subject: [PATCH 2/8] =?UTF-8?q?=D0=A4=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=D0=BE?= =?UTF-8?q?=D0=B5=20=D0=B7=D0=B5=D1=80=D0=BA=D0=B0=D0=BB=D0=BE.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\236\321\202\320\262\320\265\321\202.os" | 66 ++++++++++++ ...20\272\320\265\321\202\320\276\320\262.os" | 101 ++++++++++++++++++ ...20\272\320\265\321\202\320\276\320\262.os" | 10 +- tests/fixtures/opm-servers.cfg | 6 ++ 4 files changed, 180 insertions(+), 3 deletions(-) create mode 100644 "src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\271\320\241\320\265\321\200\320\262\320\265\321\200\320\236\321\202\320\262\320\265\321\202.os" create mode 100644 "src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\271\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\271\320\241\320\265\321\200\320\262\320\265\321\200\320\236\321\202\320\262\320\265\321\202.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\271\320\241\320\265\321\200\320\262\320\265\321\200\320\236\321\202\320\262\320\265\321\202.os" new file mode 100644 index 0000000..9e614a4 --- /dev/null +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\271\320\241\320\265\321\200\320\262\320\265\321\200\320\236\321\202\320\262\320\265\321\202.os" @@ -0,0 +1,66 @@ +#Использовать semver + +Перем КодСостояния Экспорт; +Перем ИмяФайла; + +Процедура ПриСозданииОбъекта(Знач ПутьКФайлу) + + ИмяФайла = ПутьКФайлу; + + Файл = Новый Файл(ПутьКФайлу); + Если Файл.Существует() Тогда + КодСостояния = 200; + Иначе + + КодСостояния = 404; + + Если СтрЗаканчиваетсяНа(ПутьКФайлу, ".ospx") Тогда + ПодобратьФайлПакета(Файл.Путь); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +Функция ПолучитьТелоКакДвоичныеДанные() Экспорт + Возврат Новый ДвоичныеДанные(ИмяФайла); +КонецФункции + +Процедура Закрыть() Экспорт + // для совместимости контракта +КонецПроцедуры + +Процедура ПодобратьФайлПакета(Знач КаталогФайловПакета) + + ФайлыПакета = НайтиФайлы(КаталогФайловПакета, "*.ospx"); + + ВыбранныйФайл = Неопределено; + ВыбраннаяВерсия = Неопределено; + + Для Каждого мФайлПакета Из ФайлыПакета Цикл + + Имя = мФайлПакета.ИмяБезРасширения; + Части = СтрРазделить(Имя, "-"); + Если Части.Количество() > 1 Тогда + + ВерсияТекст = Части[Части.ВГраница()]; + ТекущаяВерсия = Версии.ВерсияИзСтроки(ВерсияТекст); + + Если (ВыбраннаяВерсия = Неопределено) + Или (ВыбраннаяВерсия.Сравнить(ТекущаяВерсия) < 0) Тогда + + ВыбраннаяВерсия = ТекущаяВерсия; + ВыбранныйФайл = мФайлПакета; + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + Если ВыбранныйФайл <> Неопределено Тогда + ИмяФайла = ВыбранныйФайл.ПолноеИмя; + КодСостояния = 200; + КонецЕсли; + +КонецПроцедуры diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\271\320\241\320\265\321\200\320\262\320\265\321\200\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\244\320\260\320\271\320\273\320\276\320\262\321\213\320\271\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" new file mode 100644 index 0000000..fceeaea --- /dev/null +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\271\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" @@ -0,0 +1,101 @@ +Перем Лог; + +Перем Имя Экспорт; +Перем Сервер Экспорт; +Перем КаталогПакетов Экспорт; +Перем КорневойКаталогПоиска; + +Процедура ПриСозданииОбъекта(Знач ИмяСервера, Знач АдресСервера, Знач КаталогПакетовНаСервере) + + Имя = ИмяСервера; + Сервер = АдресСервера; + КаталогПакетов = КаталогПакетовНаСервере; + + Если СтрНачинаетсяС(Сервер, "file://") Тогда + КорневойКаталогПоиска = Сред(Сервер, СтрДлина("file://") + 1); + Иначе + КорневойКаталогПоиска = Сервер; + КонецЕсли; + + КорневойКаталогПоиска = ОбъединитьПути(КорневойКаталогПоиска, КаталогПакетов); + +КонецПроцедуры + +Функция ПолучитьИмя() Экспорт + Возврат Имя; +КонецФункции + +Функция СерверДоступен() Экспорт + Возврат Истина; +КонецФункции + +// Получает ресурс с сервера +// +// Параметры: +// ИмяРесурса - Строка - имя файла относительно "Сервер/ПутьВХранилище" +// +// Возвращаемое значение: +// ФайловыйСерверОтвет - Если файл ресурса найден +// Неопределено - Если файл ресурса не найден или возникла ошибка обращения к файлам +Функция ПолучитьРесурс(Знач ИмяРесурса) Экспорт + + ПутьКРесурсу = ОбъединитьПути(КорневойКаталогПоиска, ИмяРесурса); + + Попытка + + Возврат Новый ФайловыйСерверОтвет(ПутьКРесурсу); + + Исключение + + Лог.Ошибка(ОписаниеОшибки()); + Возврат Неопределено; + + КонецПопытки; + +КонецФункции + +Функция ПолучитьПакеты() Экспорт + + ПакетыХаба = Новый Соответствие; + ФайлыПакетов = Новый Массив; + Попытка + ФайлыПакетов = НайтиФайлы(КорневойКаталогПоиска, "*.ospx", Истина); + Исключение + Лог.Предупреждение( + СтрШаблон("Ошибка получения списка пакетов с хаба %1 по причине %2", + Имя, ОписаниеОшибки() + ) + ); + КонецПопытки; + + Для Каждого мФайл Из ФайлыПакетов Цикл + + КаталогФайла = Новый Файл(мФайл.Путь); + ИмяПакета = КаталогФайла.Имя; + + ПакетыХаба.Вставить(ИмяПакета, ""); + + КонецЦикла; + + Возврат ПакетыХаба; + +КонецФункции + +Функция НастройкаДляВыгрузки() Экспорт + + Результат = Новый Структура; + Результат.Вставить("Имя", Имя); + Результат.Вставить("Сервер", Сервер); + Результат.Вставить("ПутьНаСервере", КаталогПакетов); + Результат.Вставить("РесурсПубликацииПакетов", ""); + Результат.Вставить("Порт", 0); + Результат.Вставить("Таймаут", 0); + Результат.Вставить("Авторизация", ""); + Результат.Вставить("Заголовки", Новый Соответствие()); + Результат.Вставить("Приоритет", 0); + + Возврат Результат; + +КонецФункции // + +Лог = Логирование.ПолучитьЛог("oscript.app.opm"); diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\265\321\200\320\262\320\265\321\200\321\213\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\265\321\200\320\262\320\265\321\200\321\213\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" index fe3a432..c6c30fd 100644 --- "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\265\321\200\320\262\320\265\321\200\321\213\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\265\321\200\320\262\320\265\321\200\321\213\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" @@ -15,9 +15,13 @@ ВызватьИсключение СтрШаблон("Для сервера <%1> не задан адрес", Индекс); КонецЕсли; - СерверПакетов = Новый СерверПакетов(Имя, Сервер, ПутьНаСервере, РесурсПубликацииПакетов, - Порт, Приоритет, Авторизация, ДополнительныеЗаголовки, Таймаут - ); + Если СтрНачинаетсяС(Сервер, "file://") Тогда + СерверПакетов = Новый ФайловыйСерверПакетов(Имя, Сервер, ПутьНаСервере); + Иначе + СерверПакетов = Новый СерверПакетов(Имя, Сервер, ПутьНаСервере, РесурсПубликацииПакетов, + Порт, Приоритет, Авторизация, ДополнительныеЗаголовки, Таймаут + ); + КонецЕсли; Возврат СерверПакетов; diff --git a/tests/fixtures/opm-servers.cfg b/tests/fixtures/opm-servers.cfg index 70a48a5..1dedc91 100644 --- a/tests/fixtures/opm-servers.cfg +++ b/tests/fixtures/opm-servers.cfg @@ -16,6 +16,12 @@ "Заголовки": { "X-Dummy": "${USERNAME}" } + }, + { + "Имя": "Файловый", + "Сервер": "file://", + "ПутьНаСервере": "C:\\opm\\hub", + "Приоритет": 2 } ] } From 32b2caf8428b3f71720bb8c2276f3184a108471a Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Thu, 26 Jun 2025 19:23:52 +0300 Subject: [PATCH 3/8] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=BD=D0=B5=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D1=83?= =?UTF-8?q?=D0=B5=D0=BC=D0=B0=D1=8F=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D0=B4?= =?UTF-8?q?=D1=83=D1=80=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...237\320\260\320\272\320\265\321\202\320\276\320\262.os" | 7 ------- 1 file changed, 7 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\321\215\321\210\320\241\320\272\320\260\321\207\320\260\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\241\320\272\320\260\321\207\320\260\320\275\320\275\321\213\321\205\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" index dcc4c57..521d518 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\321\215\321\210\320\241\320\272\320\260\321\207\320\260\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\241\320\272\320\260\321\207\320\260\320\275\320\275\321\213\321\205\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" @@ -76,13 +76,6 @@ КонецФункции -// Добавляет каталог в список, по которому выполняется поиск библиотек -Процедура ДобавитьКаталогБиблиотек(Знач Каталог) Экспорт - - //МассивКаталоговПоискаБиблиотек.Добавить(Каталог); - -КонецПроцедуры - Процедура ДобавитьУстановленныйПакет(Знач ФайлКаталога) ПутьКФайлуМетаданных = ОбъединитьПути(ФайлКаталога.ПолноеИмя, КонстантыOpm.ИмяФайлаМетаданныхПакета); From 3b25752e935e27491300c01eab053fecb3ef5214 Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Fri, 27 Jun 2025 16:40:39 +0300 Subject: [PATCH 4/8] =?UTF-8?q?=D0=9E=D1=82=D1=81=D1=82=D1=83=D0=BF=D1=8B.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\320\260\320\275\320\264\320\260Opm_Download.os" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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_Download.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_Download.os" index 4ee0036..57e0253 100644 --- "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_Download.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_Download.os" @@ -50,12 +50,12 @@ КонецЕсли; Лог = Логирование.ПолучитьЛог(ПараметрыПриложенияOpm.ИмяЛогаСистемы()); - Лог.Отладка("УстановкаПакетовРазработчика: %1", УстановкаПакетовРазработчика); - Лог.Отладка("УстановкаВсехПакетов: %1", УстановкаВсехПакетов); - Лог.Отладка("КаталогУстановки: %1", КаталогУстановки); - Лог.Отладка("ФайлПакетаУстановки: %1", ФайлПакетаУстановки); - Лог.Отладка("ИнтернетСсылкаНаПакет: %1", ИнтернетСсылкаНаПакет); - Лог.Отладка("МассивПакетовКУстановке: %1", МассивПакетовКУстановке.Количество()); + Лог.Отладка("УстановкаПакетовРазработчика: %1", УстановкаПакетовРазработчика); + Лог.Отладка("УстановкаВсехПакетов: %1", УстановкаВсехПакетов); + Лог.Отладка("КаталогУстановки: %1", КаталогУстановки); + Лог.Отладка("ФайлПакетаУстановки: %1", ФайлПакетаУстановки); + Лог.Отладка("ИнтернетСсылкаНаПакет: %1", ИнтернетСсылкаНаПакет); + Лог.Отладка("МассивПакетовКУстановке: %1", МассивПакетовКУстановке.Количество()); Лог.Отладка("НеобходимоУстановитьЗависимости: %1", НеобходимоУстановитьЗависимости); НастройкаУстановки = РаботаСПакетами.ПолучитьНастройкуУстановки(); From 9a5d2a5076e6d9a3317ac34b2e764b190e7e3730 Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Fri, 27 Jun 2025 16:41:24 +0300 Subject: [PATCH 5/8] =?UTF-8?q?=D0=A3=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=BF=D0=BE=D0=B2=D1=82=D0=BE=D1=80=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=20=D0=9F?= =?UTF-8?q?=D1=80=D0=BE=D1=87=D0=B8=D1=82=D0=B0=D1=82=D1=8C=D0=9C=D0=B5?= =?UTF-8?q?=D1=82=D0=B0=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5=D0=9F=D0=B0?= =?UTF-8?q?=D0=BA=D0=B5=D1=82=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\272\320\265\321\202\320\276\320\262.os" | 23 ++---------------- ...20\272\320\265\321\202\320\276\320\262.os" | 23 ++---------------- ...20\260\320\272\320\265\321\202\320\260.os" | 24 +------------------ ...20\265\321\202\320\260\320\274\320\270.os" | 22 +++++++++++++++++ 4 files changed, 27 insertions(+), 65 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\321\215\321\210\320\241\320\272\320\260\321\207\320\260\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\241\320\272\320\260\321\207\320\260\320\275\320\275\321\213\321\205\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" index 521d518..b0239c1 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\321\215\321\210\320\241\320\272\320\260\321\207\320\260\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\241\320\272\320\260\321\207\320\260\320\275\320\275\321\213\321\205\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" @@ -25,7 +25,7 @@ ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных); Если ФайлМетаданных.Существует() Тогда - МетаОписаниеПакета = ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных); + МетаОписаниеПакета = РаботаСПакетами.ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных); УстановленнаяВерсия = МетаОписаниеПакета.Свойства().Версия; Иначе // @deprecated @@ -81,7 +81,7 @@ ПутьКФайлуМетаданных = ОбъединитьПути(ФайлКаталога.ПолноеИмя, КонстантыOpm.ИмяФайлаМетаданныхПакета); ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных); Если ФайлМетаданных.Существует() Тогда - МетаОписаниеПакета = ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных); + МетаОписаниеПакета = РаботаСПакетами.ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных); Иначе // @deprecated МетаОписаниеПакета = Истина; @@ -95,25 +95,6 @@ КонецПроцедуры -Функция ПрочитатьМетаданныеПакета(Знач ПутьКФайлуМетаданных) - - Перем Метаданные; - Попытка - Чтение = Новый ЧтениеXML; - Чтение.ОткрытьФайл(ПутьКФайлуМетаданных); - Сериализатор = Новый СериализацияМетаданныхПакета; - Метаданные = Сериализатор.ПрочитатьXML(Чтение); - - Чтение.Закрыть(); - Исключение - Чтение.Закрыть(); - ВызватьИсключение; - КонецПопытки; - - Возврат Метаданные; - -КонецФункции - Функция ПолучитьПутьКФайлуМетаданныхБиблиотеки(ИмяПакета) Экспорт ПутьКФайлуМетаданных = ""; 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 b816037..ab2a800 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" @@ -26,7 +26,7 @@ ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных); Если ФайлМетаданных.Существует() Тогда - МетаОписаниеПакета = ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных); + МетаОписаниеПакета = РаботаСПакетами.ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных); УстановленнаяВерсия = МетаОписаниеПакета.Свойства().Версия; Иначе // @deprecated @@ -109,7 +109,7 @@ ПутьКФайлуМетаданных = ОбъединитьПути(ФайлКаталога.ПолноеИмя, КонстантыOpm.ИмяФайлаМетаданныхПакета); ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных); Если ФайлМетаданных.Существует() Тогда - МетаОписаниеПакета = ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных); + МетаОписаниеПакета = РаботаСПакетами.ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных); Иначе // @deprecated МетаОписаниеПакета = Истина; @@ -123,25 +123,6 @@ КонецПроцедуры -Функция ПрочитатьМетаданныеПакета(Знач ПутьКФайлуМетаданных) - - Перем Метаданные; - Попытка - Чтение = Новый ЧтениеXML; - Чтение.ОткрытьФайл(ПутьКФайлуМетаданных); - Сериализатор = Новый СериализацияМетаданныхПакета; - Метаданные = Сериализатор.ПрочитатьXML(Чтение); - - Чтение.Закрыть(); - Исключение - Чтение.Закрыть(); - ВызватьИсключение; - КонецПопытки; - - Возврат Метаданные; - -КонецФункции - Функция ПолучитьПутьКФайлуМетаданныхБиблиотеки(ИмяПакета) Экспорт ПутьКФайлуМетаданных = ""; 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 8354db4..fc0f4ee 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" @@ -33,7 +33,7 @@ ФайлСодержимого = ИзвлечьОбязательныйФайл(ЧтениеПакета, КонстантыOpm.ИмяФайлаСодержимогоПакета); ФайлМетаданных = ИзвлечьОбязательныйФайл(ЧтениеПакета, КонстантыOpm.ИмяФайлаМетаданныхПакета); - Метаданные = ПрочитатьМетаданныеПакета(ФайлМетаданных); + Метаданные = РаботаСПакетами.ПрочитатьМетаданныеПакета(ФайлМетаданных); ИмяПакета = Метаданные.Свойства().Имя; ВерсияПакета = Метаданные.Свойства().Версия; @@ -319,28 +319,6 @@ КонецПроцедуры -Функция ПрочитатьМетаданныеПакета(Знач ФайлМетаданных) - - Перем Метаданные; - Лог.Отладка("Чтение метаданных пакета"); - Попытка - Чтение = Новый ЧтениеXML; - Чтение.ОткрытьФайл(ФайлМетаданных); - Лог.Отладка("XML загружен"); - Сериализатор = Новый СериализацияМетаданныхПакета; - Метаданные = Сериализатор.ПрочитатьXML(Чтение); - - Чтение.Закрыть(); - Исключение - Чтение.Закрыть(); - ВызватьИсключение; - КонецПопытки; - Лог.Отладка("Метаданные прочитаны"); - - Возврат Метаданные; - -КонецФункции - Процедура СохранитьФайлМетаданныхПакета(Знач ПутьУстановки, Знач ПутьКФайлуМетаданных) ПутьСохранения = ОбъединитьПути(ПутьУстановки, КонстантыOpm.ИмяФайлаМетаданныхПакета); 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 bd1019e..bf36600 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" @@ -26,6 +26,28 @@ КонецПроцедуры +Функция ПрочитатьМетаданныеПакета(Знач ФайлМетаданных) Экспорт + + Перем Метаданные; + Лог.Отладка("Чтение метаданных пакета"); + Попытка + Чтение = Новый ЧтениеXML; + Чтение.ОткрытьФайл(ФайлМетаданных); + Лог.Отладка("XML загружен"); + Сериализатор = Новый СериализацияМетаданныхПакета; + Метаданные = Сериализатор.ПрочитатьXML(Чтение); + + Чтение.Закрыть(); + Исключение + Чтение.Закрыть(); + ВызватьИсключение; + КонецПопытки; + Лог.Отладка("Метаданные прочитаны"); + + Возврат Метаданные; + +КонецФункции + Функция ПолучитьМенеджерПолученияПакетов() Если ВнутреннийМенеджерПолученияПакетов = Неопределено Тогда From 014844843070c4223cd5880496949086c9e660b0 Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Tue, 1 Jul 2025 17:19:53 +0300 Subject: [PATCH 6/8] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D0=BE=20?= =?UTF-8?q?=D0=BB=D0=B8=D1=88=D0=BD=D0=B5=D0=B5=20=D0=BF=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D1=83=D0=BF=D1=80=D0=B5=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\276\320\274\320\260\320\275\320\264\320\260Opm_Install.os" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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_Install.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_Install.os" index 1b28d03..dad2baf 100644 --- "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_Install.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_Install.os" @@ -57,7 +57,7 @@ КонецЕсли; Лог = Логирование.ПолучитьЛог(ПараметрыПриложенияOpm.ИмяЛогаСистемы()); - Если РежимУстановки = РежимУстановкиПакетов.Локально Тогда + Если (РежимУстановки = РежимУстановкиПакетов.Локально) И ЗначениеЗаполнено(ЦелевойКаталог) Тогда Лог.Предупреждение("При локальной установке параметр -dest игнорируется"); ЦелевойКаталог = Неопределено; КонецЕсли; From 6e5525153d8e44ee0cd8f820239d8c74c76eb2d4 Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Tue, 1 Jul 2025 17:20:32 +0300 Subject: [PATCH 7/8] =?UTF-8?q?=D0=9E=D0=B1=D1=8A=D0=B5=D0=B4=D0=B8=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=BA=D1=8D=D1=88=D0=B5=D0=B9=20=D0=BF=D0=B0=D0=BA=D0=B5?= =?UTF-8?q?=D1=82=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\272\320\265\321\202\320\276\320\262.os" | 121 ------------------ ...20\272\320\265\321\202\320\276\320\262.os" | 22 +--- ...20\272\320\265\321\202\320\276\320\262.os" | 2 +- 3 files changed, 6 insertions(+), 139 deletions(-) delete mode 100644 "src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\321\215\321\210\320\241\320\272\320\260\321\207\320\260\320\275\320\275\321\213\321\205\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\321\215\321\210\320\241\320\272\320\260\321\207\320\260\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\241\320\272\320\260\321\207\320\260\320\275\320\275\321\213\321\205\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" deleted file mode 100644 index b0239c1..0000000 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\321\215\321\210\320\241\320\272\320\260\321\207\320\260\320\275\320\275\321\213\321\205\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" +++ /dev/null @@ -1,121 +0,0 @@ - -#Использовать fs -#Использовать logos -#Использовать semver - -Перем Лог; - -Перем КаталогПоискаБиблиотек; - -Перем УстановленныеПакеты; - -Функция ПакетУстановлен(Знач ОписаниеЗависимости, Знач КаталогПоискаБиблиотек = "") Экспорт - - Перем УстановленныеПакеты; - УстановленныеПакеты = ПолучитьУстановленныеПакеты(); - - ДанныеПакета = УстановленныеПакеты.Получить(ОписаниеЗависимости.ИмяПакета); - ПакетУстановлен = ДанныеПакета <> Неопределено; - Если ПакетУстановлен И НЕ ПустаяСтрока(КаталогПоискаБиблиотек) Тогда - КаталогБиблиотекПакета = Новый Файл(ОбъединитьПути(ДанныеПакета.КаталогПакета, "..")).ПолноеИмя; - ПакетУстановлен = ФС.ПутиРавны(КаталогБиблиотекПакета, КаталогПоискаБиблиотек); - КонецЕсли; - - ПутьКФайлуМетаданных = ПолучитьПутьКФайлуМетаданныхБиблиотеки(ОписаниеЗависимости.ИмяПакета); - - ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных); - Если ФайлМетаданных.Существует() Тогда - МетаОписаниеПакета = РаботаСПакетами.ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных); - УстановленнаяВерсия = МетаОписаниеПакета.Свойства().Версия; - Иначе - // @deprecated - УстановленнаяВерсия = "0"; - КонецЕсли; - Лог.Отладка("ПакетУстановлен: Перед вызовом СравнитьВерсии(ЭтаВерсия = <%1>, БольшеЧемВерсия = <%2>)", УстановленнаяВерсия, ОписаниеЗависимости.МинимальнаяВерсия); - - ВерсияSNAPSHOT = "SNAPSHOT"; - Если ОписаниеЗависимости.МинимальнаяВерсия = ВерсияSNAPSHOT И УстановленнаяВерсия = ВерсияSNAPSHOT Тогда - УстановленаКорректнаяВерсия = Истина; - ИначеЕсли ОписаниеЗависимости.МинимальнаяВерсия = ВерсияSNAPSHOT И УстановленнаяВерсия <> ВерсияSNAPSHOT Тогда - УстановленаКорректнаяВерсия = Ложь; - Иначе - УстановленаКорректнаяВерсия = ОписаниеЗависимости.МинимальнаяВерсия = Неопределено - ИЛИ Версии.СравнитьВерсии(УстановленнаяВерсия, ОписаниеЗависимости.МинимальнаяВерсия) >= 0; - КонецЕсли; - - Лог.Отладка("Пакет установлен: " + ПакетУстановлен); - Лог.Отладка("Установлена корректная версия: " + УстановленаКорректнаяВерсия); - Возврат ПакетУстановлен И УстановленаКорректнаяВерсия; - -КонецФункции - -Процедура Обновить() Экспорт - - УстановленныеПакеты = Новый Соответствие; - НайденныеФайлы = НайтиФайлы(КаталогПоискаБиблиотек, ПолучитьМаскуВсеФайлы()); - - Для Каждого ФайлКаталога Из НайденныеФайлы Цикл - Если ФайлКаталога.ЭтоКаталог() Тогда - - // ДобавитьУстановленныйПакет заменит уже добавленный пакет при совпадении имён - // Соответственно, более поздние каталоги будут иметь приоритет - ДобавитьУстановленныйПакет(ФайлКаталога); - - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -Функция ПолучитьУстановленныеПакеты() Экспорт - - Если УстановленныеПакеты = Неопределено Тогда - Обновить(); - КонецЕсли; - - Возврат УстановленныеПакеты; - -КонецФункции - -Процедура ДобавитьУстановленныйПакет(Знач ФайлКаталога) - - ПутьКФайлуМетаданных = ОбъединитьПути(ФайлКаталога.ПолноеИмя, КонстантыOpm.ИмяФайлаМетаданныхПакета); - ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных); - Если ФайлМетаданных.Существует() Тогда - МетаОписаниеПакета = РаботаСПакетами.ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных); - Иначе - // @deprecated - МетаОписаниеПакета = Истина; - КонецЕсли; - - СтруктураДанных = Новый Структура(); - СтруктураДанных.Вставить("МетаданныеПакета", МетаОписаниеПакета); - СтруктураДанных.Вставить("КаталогПакета", ФайлКаталога.ПолноеИмя); - - УстановленныеПакеты.Вставить(ФайлКаталога.Имя, СтруктураДанных); - -КонецПроцедуры - -Функция ПолучитьПутьКФайлуМетаданныхБиблиотеки(ИмяПакета) Экспорт - - ПутьКФайлуМетаданных = ""; - ВремПутьКФайлуМетаданных = ОбъединитьПути( - КаталогПоискаБиблиотек, - ИмяПакета, - КонстантыOpm.ИмяФайлаМетаданныхПакета - ); - - Лог.Отладка(Новый Файл(ВремПутьКФайлуМетаданных).ПолноеИмя); - Если ФС.ФайлСуществует(ВремПутьКФайлуМетаданных) Тогда - ПутьКФайлуМетаданных = ВремПутьКФайлуМетаданных; - КонецЕсли; - - Возврат ПутьКФайлуМетаданных; - -КонецФункции - -Процедура ПриСозданииОбъекта(Знач ЦелевойКаталогСкачиванияБиблиотек) - - Лог = Логирование.ПолучитьЛог("oscript.app.opm"); - КаталогПоискаБиблиотек = ЦелевойКаталогСкачиванияБиблиотек; - -КонецПроцедуры 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 ab2a800..2d41540 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" @@ -18,7 +18,7 @@ ДанныеПакета = УстановленныеПакеты.Получить(ОписаниеЗависимости.ИмяПакета); ПакетУстановлен = ДанныеПакета <> Неопределено; Если ПакетУстановлен И НЕ ПустаяСтрока(КаталогПоискаБиблиотек) Тогда - КаталогБиблиотекПакета = Новый Файл(ОбъединитьПути(ДанныеПакета.КаталогПакета, "..")).ПолноеИмя; + КаталогБиблиотекПакета = Новый Файл(ДанныеПакета.КаталогПакета).Путь; ПакетУстановлен = ФС.ПутиРавны(КаталогБиблиотекПакета, КаталогПоискаБиблиотек); КонецЕсли; @@ -32,7 +32,10 @@ // @deprecated УстановленнаяВерсия = "0"; КонецЕсли; - Лог.Отладка("ПакетУстановлен: Перед вызовом СравнитьВерсии(ЭтаВерсия = <%1>, БольшеЧемВерсия = <%2>)", УстановленнаяВерсия, ОписаниеЗависимости.МинимальнаяВерсия); + + Лог.Отладка("ПакетУстановлен: Перед вызовом СравнитьВерсии(ЭтаВерсия = <%1>, БольшеЧемВерсия = <%2>)", + УстановленнаяВерсия, + ОписаниеЗависимости.МинимальнаяВерсия); ВерсияSNAPSHOT = "SNAPSHOT"; Если ОписаниеЗависимости.МинимальнаяВерсия = ВерсияSNAPSHOT И УстановленнаяВерсия = ВерсияSNAPSHOT Тогда @@ -82,21 +85,6 @@ КонецФункции -Процедура Инициализация() - - Лог = Логирование.ПолучитьЛог("oscript.app.opm"); - МассивКаталоговПоискаБиблиотек = Новый Массив; - - КаталогСистемныхБиблиотек = ОбъединитьПути( - КаталогПрограммы(), - ПолучитьЗначениеСистемнойНастройки("lib.system") - ); - - МассивКаталоговПоискаБиблиотек.Добавить(КаталогСистемныхБиблиотек); - ДобавитьКаталогБиблиотек("./" + КонстантыOpm.ЛокальныйКаталогУстановкиПакетов); - -КонецПроцедуры - // Добавляет каталог в список, по которому выполняется поиск библиотек Процедура ДобавитьКаталогБиблиотек(Знач Каталог) Экспорт diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\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\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" index ab4d368..92298df 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\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\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" @@ -237,7 +237,7 @@ Функция ПолучитьУстановленныеПакеты() Если ТекущийРежимУстановкиПакетов = РежимУстановкиПакетов.Скачивание Тогда - КэшУстановленныхПакетов = Новый КэшСкачанныхПакетов(ЦелевойКаталогУстановки); + КэшУстановленныхПакетов = Новый КэшУстановленныхПакетов(ЦелевойКаталогУстановки); Иначе КэшУстановленныхПакетов = Новый КэшУстановленныхПакетов(КаталогУстановкиЗависимостей); КонецЕсли; From 4f14dea23138c8c09b8b25cd039d8d8c7b4a2afc Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Tue, 1 Jul 2025 17:23:13 +0300 Subject: [PATCH 8/8] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=20=D0=BF=D0=BE=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=D0=B4=D0=BD=D0=B5=D0=B9=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8?= =?UTF-8?q?=D0=B8=20=D0=BF=D1=80=D0=B8=20=D1=83=D1=81=D1=82=D0=B0=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D0=BA=D0=B5=20=D1=81=20=D1=84=D0=B0=D0=B9=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\236\321\202\320\262\320\265\321\202.os" | 44 ++++++++++++++++--- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\271\320\241\320\265\321\200\320\262\320\265\321\200\320\236\321\202\320\262\320\265\321\202.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\271\320\241\320\265\321\200\320\262\320\265\321\200\320\236\321\202\320\262\320\265\321\202.os" index 9e614a4..9df20eb 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\271\320\241\320\265\321\200\320\262\320\265\321\200\320\236\321\202\320\262\320\265\321\202.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\271\320\241\320\265\321\200\320\262\320\265\321\200\320\236\321\202\320\262\320\265\321\202.os" @@ -1,5 +1,6 @@ #Использовать semver +Перем Лог; Перем КодСостояния Экспорт; Перем ИмяФайла; @@ -32,6 +33,9 @@ Процедура ПодобратьФайлПакета(Знач КаталогФайловПакета) + ИмяПакета = Новый Файл(КаталогФайловПакета).Имя; + ИмяСРазделителем = ИмяПакета + "-"; + ФайлыПакета = НайтиФайлы(КаталогФайловПакета, "*.ospx"); ВыбранныйФайл = Неопределено; @@ -39,15 +43,35 @@ Для Каждого мФайлПакета Из ФайлыПакета Цикл - Имя = мФайлПакета.ИмяБезРасширения; - Части = СтрРазделить(Имя, "-"); - Если Части.Количество() > 1 Тогда + ИмяСВерсией = мФайлПакета.ИмяБезРасширения; + ТекущаяВерсия = Неопределено; + + ФайлМетаданных = Новый Файл(ОбъединитьПути(мФайлПакета.Путь, ИмяСВерсией, КонстантыOpm.ИмяФайлаМетаданныхПакета)); + Если ФайлМетаданных.Существует() Тогда - ВерсияТекст = Части[Части.ВГраница()]; - ТекущаяВерсия = Версии.ВерсияИзСтроки(ВерсияТекст); + // есть сохраненный файл метаданных + МетаданныеПакета = РаботаСПакетами.ПрочитатьМетаданныеПакета(ФайлМетаданных.ПолноеИмя); + ТекущаяВерсия = Версии.ВерсияИзСтроки(МетаданныеПакета.Свойства().Версия); + + ИначеЕсли СтрНачинаетсяС(ИмяСВерсией, ИмяСРазделителем) Тогда + + // извлекаем номер версии из имени файла + ВерсияИзИмениФайла = Сред(ИмяСВерсией, СтрДлина(ИмяСРазделителем) + 1); + Если Не ПустаяСтрока(ВерсияИзИмениФайла) Тогда + ТекущаяВерсия = Версии.ВерсияИзСтроки(ВерсияИзИмениФайла); + КонецЕсли; + + Иначе + // Файл не по канону - пропустим + Лог.Отладка("Файл %1 не соответствует правилам расположения файлов пакета.", мФайлПакета.ПолноеИмя); + КонецЕсли; - Если (ВыбраннаяВерсия = Неопределено) - Или (ВыбраннаяВерсия.Сравнить(ТекущаяВерсия) < 0) Тогда + Если (ТекущаяВерсия <> Неопределено) Тогда + + Лог.Отладка("Найден файл %1 с версией %2", мФайлПакета.ПолноеИмя, ТекущаяВерсия.ВСтроку()); + + Если ((ВыбраннаяВерсия = Неопределено) + Или (ВыбраннаяВерсия.Сравнить(ТекущаяВерсия) < 0)) Тогда ВыбраннаяВерсия = ТекущаяВерсия; ВыбранныйФайл = мФайлПакета; @@ -59,8 +83,14 @@ КонецЦикла; Если ВыбранныйФайл <> Неопределено Тогда + + Лог.Отладка("Для пакета %1 подобрана версия %2", ИмяПакета, ВыбраннаяВерсия.ВСтроку()); + ИмяФайла = ВыбранныйФайл.ПолноеИмя; КодСостояния = 200; + КонецЕсли; КонецПроцедуры + +Лог = Логирование.ПолучитьЛог("oscript.app.opm.fileserver"); \ No newline at end of file