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..57e0253 --- /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/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 игнорируется"); ЦелевойКаталог = Неопределено; КонецЕсли; 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..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 @@ ДанныеПакета = УстановленныеПакеты.Получить(ОписаниеЗависимости.ИмяПакета); ПакетУстановлен = ДанныеПакета <> Неопределено; Если ПакетУстановлен И НЕ ПустаяСтрока(КаталогПоискаБиблиотек) Тогда - КаталогБиблиотекПакета = Новый Файл(ОбъединитьПути(ДанныеПакета.КаталогПакета, "..")).ПолноеИмя; + КаталогБиблиотекПакета = Новый Файл(ДанныеПакета.КаталогПакета).Путь; ПакетУстановлен = ФС.ПутиРавны(КаталогБиблиотекПакета, КаталогПоискаБиблиотек); КонецЕсли; @@ -26,13 +26,16 @@ ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных); Если ФайлМетаданных.Существует() Тогда - МетаОписаниеПакета = ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных); + МетаОписаниеПакета = РаботаСПакетами.ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных); УстановленнаяВерсия = МетаОписаниеПакета.Свойства().Версия; Иначе // @deprecated УстановленнаяВерсия = "0"; КонецЕсли; - Лог.Отладка("ПакетУстановлен: Перед вызовом СравнитьВерсии(ЭтаВерсия = <%1>, БольшеЧемВерсия = <%2>)", УстановленнаяВерсия, ОписаниеЗависимости.МинимальнаяВерсия); + + Лог.Отладка("ПакетУстановлен: Перед вызовом СравнитьВерсии(ЭтаВерсия = <%1>, БольшеЧемВерсия = <%2>)", + УстановленнаяВерсия, + ОписаниеЗависимости.МинимальнаяВерсия); ВерсияSNAPSHOT = "SNAPSHOT"; Если ОписаниеЗависимости.МинимальнаяВерсия = ВерсияSNAPSHOT И УстановленнаяВерсия = ВерсияSNAPSHOT Тогда @@ -82,21 +85,6 @@ КонецФункции -Процедура Инициализация() - - Лог = Логирование.ПолучитьЛог("oscript.app.opm"); - МассивКаталоговПоискаБиблиотек = Новый Массив; - - КаталогСистемныхБиблиотек = ОбъединитьПути( - КаталогПрограммы(), - ПолучитьЗначениеСистемнойНастройки("lib.system") - ); - - МассивКаталоговПоискаБиблиотек.Добавить(КаталогСистемныхБиблиотек); - ДобавитьКаталогБиблиотек("./" + КонстантыOpm.ЛокальныйКаталогУстановкиПакетов); - -КонецПроцедуры - // Добавляет каталог в список, по которому выполняется поиск библиотек Процедура ДобавитьКаталогБиблиотек(Знач Каталог) Экспорт @@ -109,7 +97,7 @@ ПутьКФайлуМетаданных = ОбъединитьПути(ФайлКаталога.ПолноеИмя, КонстантыOpm.ИмяФайлаМетаданныхПакета); ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных); Если ФайлМетаданных.Существует() Тогда - МетаОписаниеПакета = ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных); + МетаОписаниеПакета = РаботаСПакетами.ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных); Иначе // @deprecated МетаОписаниеПакета = Истина; @@ -123,25 +111,6 @@ КонецПроцедуры -Функция ПрочитатьМетаданныеПакета(Знач ПутьКФайлуМетаданных) - - Перем Метаданные; - Попытка - Чтение = Новый ЧтениеXML; - Чтение.ОткрытьФайл(ПутьКФайлуМетаданных); - Сериализатор = Новый СериализацияМетаданныхПакета; - Метаданные = Сериализатор.ПрочитатьXML(Чтение); - - Чтение.Закрыть(); - Исключение - Чтение.Закрыть(); - ВызватьИсключение; - КонецПопытки; - - Возврат Метаданные; - -КонецФункции - Функция ПолучитьПутьКФайлуМетаданныхБиблиотеки(ИмяПакета) Экспорт ПутьКФайлуМетаданных = ""; 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..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" @@ -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..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,10 +33,16 @@ ФайлСодержимого = ИзвлечьОбязательныйФайл(ЧтениеПакета, КонстантыOpm.ИмяФайлаСодержимогоПакета); ФайлМетаданных = ИзвлечьОбязательныйФайл(ЧтениеПакета, КонстантыOpm.ИмяФайлаМетаданныхПакета); - Метаданные = ПрочитатьМетаданныеПакета(ФайлМетаданных); + Метаданные = РаботаСПакетами.ПрочитатьМетаданныеПакета(ФайлМетаданных); ИмяПакета = Метаданные.Свойства().Имя; + ВерсияПакета = Метаданные.Свойства().Версия; - ОбъектКаталогУстановки = НайтиСоздатьКаталогУстановки(ИмяПакета); + Если мРежимУстановкиПакетов = РежимУстановкиПакетов.Скачивание Тогда + ОбъектКаталогУстановки = НайтиСоздатьКаталогУстановки(ИмяПакета, ВерсияПакета); + Иначе + ОбъектКаталогУстановки = НайтиСоздатьКаталогУстановки(ИмяПакета); + КонецЕсли; + ПутьУстановки = ОбъектКаталогУстановки.ПолноеИмя; Лог.Информация("Устанавливаю пакет " + ИмяПакета); @@ -48,12 +54,19 @@ мЗависимостиВРаботе.Вставить(ИмяПакета, "ВРаботе"); - СтандартнаяОбработка = Истина; - УстановитьФайлыПакета(ОбъектКаталогУстановки, ФайлСодержимого, СтандартнаяОбработка); - Если СтандартнаяОбработка Тогда - СгенерироватьСкриптыЗапускаПриложенийПриНеобходимости(ПутьУстановки, Метаданные); - РаботаСПакетами.СоздатьКонфигурационныеФайлыОСкрипт(ПутьУстановки, Метаданные, мРежимУстановкиПакетов); + + Если мРежимУстановкиПакетов = РежимУстановкиПакетов.Скачивание Тогда + ЦелевоеИмяФайла = ПутьУстановки + ".ospx"; + КопироватьФайл(ФайлАрхива, ЦелевоеИмяФайла); + Иначе + СтандартнаяОбработка = Истина; + УстановитьФайлыПакета(ОбъектКаталогУстановки, ФайлСодержимого, СтандартнаяОбработка); + Если СтандартнаяОбработка Тогда + СгенерироватьСкриптыЗапускаПриложенийПриНеобходимости(ПутьУстановки, Метаданные); + РаботаСПакетами.СоздатьКонфигурационныеФайлыОСкрипт(ПутьУстановки, Метаданные, мРежимУстановкиПакетов); + КонецЕсли; КонецЕсли; + СохранитьФайлМетаданныхПакета(ПутьУстановки, ФайлМетаданных); ЧтениеПакета.Закрыть(); @@ -98,9 +111,16 @@ мЦелевойКаталог = ЦелевойКаталогУстановки; КонецПроцедуры -Функция НайтиСоздатьКаталогУстановки(Знач ИдентификаторПакета) +Функция НайтиСоздатьКаталогУстановки(Знач ИдентификаторПакета, Знач ВерсияПакета = Неопределено) - ОбъектКаталогУстановки = Новый Файл(ОбъединитьПути(мЦелевойКаталог, ИдентификаторПакета)); + Если ВерсияПакета <> Неопределено Тогда + ОбъектКаталогУстановки = Новый Файл(ОбъединитьПути(мЦелевойКаталог, + ИдентификаторПакета, + ИдентификаторПакета + "-" + ВерсияПакета)); + Иначе + ОбъектКаталогУстановки = Новый Файл(ОбъединитьПути(мЦелевойКаталог, ИдентификаторПакета)); + КонецЕсли; + ПутьУстановки = ОбъектКаталогУстановки.ПолноеИмя; Лог.Отладка("Путь установки пакета: " + ПутьУстановки); @@ -299,28 +319,6 @@ КонецПроцедуры -Функция ПрочитатьМетаданныеПакета(Знач ФайлМетаданных) - - Перем Метаданные; - Лог.Отладка("Чтение метаданных пакета"); - Попытка - Чтение = Новый ЧтениеXML; - Чтение.ОткрытьФайл(ФайлМетаданных); - Лог.Отладка("XML загружен"); - Сериализатор = Новый СериализацияМетаданныхПакета; - Метаданные = Сериализатор.ПрочитатьXML(Чтение); - - Чтение.Закрыть(); - Исключение - Чтение.Закрыть(); - ВызватьИсключение; - КонецПопытки; - Лог.Отладка("Метаданные прочитаны"); - - Возврат Метаданные; - -КонецФункции - Процедура СохранитьФайлМетаданныхПакета(Знач ПутьУстановки, Знач ПутьКФайлуМетаданных) ПутьСохранения = ОбъединитьПути(ПутьУстановки, КонстантыOpm.ИмяФайлаМетаданныхПакета); 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..9df20eb --- /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,96 @@ +#Использовать semver + +Перем Лог; +Перем КодСостояния Экспорт; +Перем ИмяФайла; + +Процедура ПриСозданииОбъекта(Знач ПутьКФайлу) + + ИмяФайла = ПутьКФайлу; + + Файл = Новый Файл(ПутьКФайлу); + Если Файл.Существует() Тогда + КодСостояния = 200; + Иначе + + КодСостояния = 404; + + Если СтрЗаканчиваетсяНа(ПутьКФайлу, ".ospx") Тогда + ПодобратьФайлПакета(Файл.Путь); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +Функция ПолучитьТелоКакДвоичныеДанные() Экспорт + Возврат Новый ДвоичныеДанные(ИмяФайла); +КонецФункции + +Процедура Закрыть() Экспорт + // для совместимости контракта +КонецПроцедуры + +Процедура ПодобратьФайлПакета(Знач КаталогФайловПакета) + + ИмяПакета = Новый Файл(КаталогФайловПакета).Имя; + ИмяСРазделителем = ИмяПакета + "-"; + + ФайлыПакета = НайтиФайлы(КаталогФайловПакета, "*.ospx"); + + ВыбранныйФайл = Неопределено; + ВыбраннаяВерсия = Неопределено; + + Для Каждого мФайлПакета Из ФайлыПакета Цикл + + ИмяСВерсией = мФайлПакета.ИмяБезРасширения; + ТекущаяВерсия = Неопределено; + + ФайлМетаданных = Новый Файл(ОбъединитьПути(мФайлПакета.Путь, ИмяСВерсией, КонстантыOpm.ИмяФайлаМетаданныхПакета)); + Если ФайлМетаданных.Существует() Тогда + + // есть сохраненный файл метаданных + МетаданныеПакета = РаботаСПакетами.ПрочитатьМетаданныеПакета(ФайлМетаданных.ПолноеИмя); + ТекущаяВерсия = Версии.ВерсияИзСтроки(МетаданныеПакета.Свойства().Версия); + + ИначеЕсли СтрНачинаетсяС(ИмяСВерсией, ИмяСРазделителем) Тогда + + // извлекаем номер версии из имени файла + ВерсияИзИмениФайла = Сред(ИмяСВерсией, СтрДлина(ИмяСРазделителем) + 1); + Если Не ПустаяСтрока(ВерсияИзИмениФайла) Тогда + ТекущаяВерсия = Версии.ВерсияИзСтроки(ВерсияИзИмениФайла); + КонецЕсли; + + Иначе + // Файл не по канону - пропустим + Лог.Отладка("Файл %1 не соответствует правилам расположения файлов пакета.", мФайлПакета.ПолноеИмя); + КонецЕсли; + + Если (ТекущаяВерсия <> Неопределено) Тогда + + Лог.Отладка("Найден файл %1 с версией %2", мФайлПакета.ПолноеИмя, ТекущаяВерсия.ВСтроку()); + + Если ((ВыбраннаяВерсия = Неопределено) + Или (ВыбраннаяВерсия.Сравнить(ТекущаяВерсия) < 0)) Тогда + + ВыбраннаяВерсия = ТекущаяВерсия; + ВыбранныйФайл = мФайлПакета; + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + Если ВыбранныйФайл <> Неопределено Тогда + + Лог.Отладка("Для пакета %1 подобрана версия %2", ИмяПакета, ВыбраннаяВерсия.ВСтроку()); + + ИмяФайла = ВыбранныйФайл.ПолноеИмя; + КодСостояния = 200; + + КонецЕсли; + +КонецПроцедуры + +Лог = Логирование.ПолучитьЛог("oscript.app.opm.fileserver"); \ No newline at end of file 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\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(Чтение); + + Чтение.Закрыть(); + Исключение + Чтение.Закрыть(); + ВызватьИсключение; + КонецПопытки; + Лог.Отладка("Метаданные прочитаны"); + + Возврат Метаданные; + +КонецФункции + Функция ПолучитьМенеджерПолученияПакетов() Если ВнутреннийМенеджерПолученияПакетов = Неопределено Тогда 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 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 } ] }