Skip to content

Commit

Permalink
Поддержка установки версий SNAPSHOT из packagedef
Browse files Browse the repository at this point in the history
  • Loading branch information
nixel2007 committed May 17, 2022
1 parent 438c4a5 commit 995faf5
Showing 1 changed file with 182 additions and 175 deletions.
357 changes: 182 additions & 175 deletions src/core/Классы/КэшУстановленныхПакетов.os
Original file line number Diff line number Diff line change
@@ -1,175 +1,182 @@

#Использовать fs
#Использовать logos

Перем Лог;

// Массив каталогов в порядке возрастания приоритета
Перем МассивКаталоговПоискаБиблиотек;

Перем УстановленныеПакеты;

Функция ПакетУстановлен(Знач ОписаниеЗависимости, Знач КаталогПоискаБиблиотек = "") Экспорт

Перем УстановленныеПакеты;
УстановленныеПакеты = ПолучитьУстановленныеПакеты();

ДанныеПакета = УстановленныеПакеты.Получить(ОписаниеЗависимости.ИмяПакета);
ПакетУстановлен = ДанныеПакета <> Неопределено;
Если ПакетУстановлен И НЕ ПустаяСтрока(КаталогПоискаБиблиотек) Тогда
КаталогБиблиотекПакета = Новый Файл(ОбъединитьПути(ДанныеПакета.КаталогПакета, "..")).ПолноеИмя;
ПакетУстановлен = КаталогБиблиотекПакета = КаталогПоискаБиблиотек;
КонецЕсли;

ПутьКФайлуМетаданных = ПолучитьПутьКФайлуМетаданныхБиблиотеки(ОписаниеЗависимости.ИмяПакета);

ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных);
Если ФайлМетаданных.Существует() Тогда
МетаОписаниеПакета = ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных);
УстановленнаяВерсия = МетаОписаниеПакета.Свойства().Версия;
Иначе
// @deprecated
УстановленнаяВерсия = 0;
КонецЕсли;
Лог.Отладка("ПакетУстановлен: Перед вызовом СравнитьВерсии(ЭтаВерсия = <%1>, БольшеЧемВерсия = <%2>)", УстановленнаяВерсия, ОписаниеЗависимости.МинимальнаяВерсия);

УстановленаКорректнаяВерсия = ОписаниеЗависимости.МинимальнаяВерсия = Неопределено
ИЛИ РаботаСВерсиями.СравнитьВерсии(УстановленнаяВерсия, ОписаниеЗависимости.МинимальнаяВерсия) >= 0;

Лог.Отладка("Пакет установлен: " + ПакетУстановлен);
Лог.Отладка("Установлена корректная версия: " + УстановленаКорректнаяВерсия);
Возврат ПакетУстановлен И УстановленаКорректнаяВерсия;

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

Процедура Обновить() Экспорт

УстановленныеПакеты = Новый Соответствие;
Для Каждого КаталогБиблиотек Из МассивКаталоговПоискаБиблиотек Цикл

Лог.Отладка("КаталогБиблиотек " + КаталогБиблиотек);

НайденныеФайлы = НайтиФайлы(КаталогБиблиотек, ПолучитьМаскуВсеФайлы());
Для Каждого ФайлКаталога Из НайденныеФайлы Цикл
Если ФайлКаталога.ЭтоКаталог() Тогда

// ДобавитьУстановленныйПакет заменит уже добавленный пакет при совпадении имён
// Соответственно, более поздние каталоги будут иметь приоритет
ДобавитьУстановленныйПакет(ФайлКаталога);

КонецЕсли;
КонецЦикла;

КонецЦикла;

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

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

Если УстановленныеПакеты = Неопределено Тогда
Обновить();
КонецЕсли;

Возврат УстановленныеПакеты;

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

Процедура Инициализация()

Лог = Логирование.ПолучитьЛог("oscript.app.opm");
МассивКаталоговПоискаБиблиотек = Новый Массив;

КаталогСистемныхБиблиотек = ОбъединитьПути(
КаталогПрограммы(),
ПолучитьЗначениеСистемнойНастройки("lib.system")
);

МассивКаталоговПоискаБиблиотек.Добавить(КаталогСистемныхБиблиотек);
ДобавитьКаталогБиблиотек("./" + КонстантыOpm.ЛокальныйКаталогУстановкиПакетов);

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

// Добавляет каталог в список, по которому выполняется поиск библиотек
Процедура ДобавитьКаталогБиблиотек(Знач Каталог) Экспорт

МассивКаталоговПоискаБиблиотек.Добавить(Каталог);

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

Процедура ДобавитьУстановленныйПакет(Знач ФайлКаталога)

ПутьКФайлуМетаданных = ОбъединитьПути(ФайлКаталога.ПолноеИмя, КонстантыOpm.ИмяФайлаМетаданныхПакета);
ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных);
Если ФайлМетаданных.Существует() Тогда
МетаОписаниеПакета = ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных);
Иначе
// @deprecated
МетаОписаниеПакета = Истина;
КонецЕсли;

СтруктураДанных = Новый Структура();
СтруктураДанных.Вставить("МетаданныеПакета", МетаОписаниеПакета);
СтруктураДанных.Вставить("КаталогПакета", ФайлКаталога.ПолноеИмя);

УстановленныеПакеты.Вставить(ФайлКаталога.Имя, СтруктураДанных);

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

Функция ПрочитатьМетаданныеПакета(Знач ПутьКФайлуМетаданных)

Перем Метаданные;
Попытка
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ПутьКФайлуМетаданных);
Сериализатор = Новый СериализацияМетаданныхПакета;
Метаданные = Сериализатор.ПрочитатьXML(Чтение);

Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;

Возврат Метаданные;

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

Функция ПолучитьПутьКФайлуМетаданныхБиблиотеки(ИмяПакета) Экспорт

ПутьКФайлуМетаданных = "";
Для Каждого КаталогБиблиотек Из МассивКаталоговПоискаБиблиотек Цикл
ВремПутьКФайлуМетаданных = ОбъединитьПути(
КаталогБиблиотек,
ИмяПакета,
КонстантыOpm.ИмяФайлаМетаданныхПакета
);

Лог.Отладка(Новый Файл(ВремПутьКФайлуМетаданных).ПолноеИмя);
Если ФС.ФайлСуществует(ВремПутьКФайлуМетаданных) Тогда
ПутьКФайлуМетаданных = ВремПутьКФайлуМетаданных;
КонецЕсли;
КонецЦикла;

Возврат ПутьКФайлуМетаданных;

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

Процедура ПриСозданииОбъекта(КаталогПоискаБиблиотек = "")

Лог = Логирование.ПолучитьЛог("oscript.app.opm");
МассивКаталоговПоискаБиблиотек = Новый Массив;

Если ЗначениеЗаполнено(КаталогПоискаБиблиотек) Тогда
МассивКаталоговПоискаБиблиотек.Добавить(КаталогПоискаБиблиотек);
Иначе
КаталогСистемныхБиблиотек = ОбъединитьПути(
КаталогПрограммы(),
ПолучитьЗначениеСистемнойНастройки("lib.system")
);

МассивКаталоговПоискаБиблиотек.Добавить(КаталогСистемныхБиблиотек);
ДобавитьКаталогБиблиотек("./" + КонстантыOpm.ЛокальныйКаталогУстановкиПакетов);
КонецЕсли;

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


#Использовать fs
#Использовать logos

Перем Лог;

// Массив каталогов в порядке возрастания приоритета
Перем МассивКаталоговПоискаБиблиотек;

Перем УстановленныеПакеты;

Функция ПакетУстановлен(Знач ОписаниеЗависимости, Знач КаталогПоискаБиблиотек = "") Экспорт

Перем УстановленныеПакеты;
УстановленныеПакеты = ПолучитьУстановленныеПакеты();

ДанныеПакета = УстановленныеПакеты.Получить(ОписаниеЗависимости.ИмяПакета);
ПакетУстановлен = ДанныеПакета <> Неопределено;
Если ПакетУстановлен И НЕ ПустаяСтрока(КаталогПоискаБиблиотек) Тогда
КаталогБиблиотекПакета = Новый Файл(ОбъединитьПути(ДанныеПакета.КаталогПакета, "..")).ПолноеИмя;
ПакетУстановлен = КаталогБиблиотекПакета = КаталогПоискаБиблиотек;
КонецЕсли;

ПутьКФайлуМетаданных = ПолучитьПутьКФайлуМетаданныхБиблиотеки(ОписаниеЗависимости.ИмяПакета);

ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных);
Если ФайлМетаданных.Существует() Тогда
МетаОписаниеПакета = ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных);
УстановленнаяВерсия = МетаОписаниеПакета.Свойства().Версия;
Иначе
// @deprecated
УстановленнаяВерсия = 0;
КонецЕсли;
Лог.Отладка("ПакетУстановлен: Перед вызовом СравнитьВерсии(ЭтаВерсия = <%1>, БольшеЧемВерсия = <%2>)", УстановленнаяВерсия, ОписаниеЗависимости.МинимальнаяВерсия);

ВерсияSNAPSHOT = "SNAPSHOT";
Если ОписаниеЗависимости.МинимальнаяВерсия = ВерсияSNAPSHOT И УстановленнаяВерсия = ВерсияSNAPSHOT Тогда
УстановленаКорректнаяВерсия = Истина;
ИначеЕсли ОписаниеЗависимости.МинимальнаяВерсия = ВерсияSNAPSHOT И УстановленнаяВерсия <> ВерсияSNAPSHOT Тогда
УстановленаКорректнаяВерсия = Ложь;
Иначе
УстановленаКорректнаяВерсия = ОписаниеЗависимости.МинимальнаяВерсия = Неопределено
ИЛИ РаботаСВерсиями.СравнитьВерсии(УстановленнаяВерсия, ОписаниеЗависимости.МинимальнаяВерсия) >= 0;
КонецЕсли;

Лог.Отладка("Пакет установлен: " + ПакетУстановлен);
Лог.Отладка("Установлена корректная версия: " + УстановленаКорректнаяВерсия);
Возврат ПакетУстановлен И УстановленаКорректнаяВерсия;

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

Процедура Обновить() Экспорт

УстановленныеПакеты = Новый Соответствие;
Для Каждого КаталогБиблиотек Из МассивКаталоговПоискаБиблиотек Цикл

Лог.Отладка("КаталогБиблиотек " + КаталогБиблиотек);

НайденныеФайлы = НайтиФайлы(КаталогБиблиотек, ПолучитьМаскуВсеФайлы());
Для Каждого ФайлКаталога Из НайденныеФайлы Цикл
Если ФайлКаталога.ЭтоКаталог() Тогда

// ДобавитьУстановленныйПакет заменит уже добавленный пакет при совпадении имён
// Соответственно, более поздние каталоги будут иметь приоритет
ДобавитьУстановленныйПакет(ФайлКаталога);

КонецЕсли;
КонецЦикла;

КонецЦикла;

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

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

Если УстановленныеПакеты = Неопределено Тогда
Обновить();
КонецЕсли;

Возврат УстановленныеПакеты;

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

Процедура Инициализация()

Лог = Логирование.ПолучитьЛог("oscript.app.opm");
МассивКаталоговПоискаБиблиотек = Новый Массив;

КаталогСистемныхБиблиотек = ОбъединитьПути(
КаталогПрограммы(),
ПолучитьЗначениеСистемнойНастройки("lib.system")
);

МассивКаталоговПоискаБиблиотек.Добавить(КаталогСистемныхБиблиотек);
ДобавитьКаталогБиблиотек("./" + КонстантыOpm.ЛокальныйКаталогУстановкиПакетов);

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

// Добавляет каталог в список, по которому выполняется поиск библиотек
Процедура ДобавитьКаталогБиблиотек(Знач Каталог) Экспорт

МассивКаталоговПоискаБиблиотек.Добавить(Каталог);

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

Процедура ДобавитьУстановленныйПакет(Знач ФайлКаталога)

ПутьКФайлуМетаданных = ОбъединитьПути(ФайлКаталога.ПолноеИмя, КонстантыOpm.ИмяФайлаМетаданныхПакета);
ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных);
Если ФайлМетаданных.Существует() Тогда
МетаОписаниеПакета = ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных);
Иначе
// @deprecated
МетаОписаниеПакета = Истина;
КонецЕсли;

СтруктураДанных = Новый Структура();
СтруктураДанных.Вставить("МетаданныеПакета", МетаОписаниеПакета);
СтруктураДанных.Вставить("КаталогПакета", ФайлКаталога.ПолноеИмя);

УстановленныеПакеты.Вставить(ФайлКаталога.Имя, СтруктураДанных);

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

Функция ПрочитатьМетаданныеПакета(Знач ПутьКФайлуМетаданных)

Перем Метаданные;
Попытка
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ПутьКФайлуМетаданных);
Сериализатор = Новый СериализацияМетаданныхПакета;
Метаданные = Сериализатор.ПрочитатьXML(Чтение);

Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;

Возврат Метаданные;

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

Функция ПолучитьПутьКФайлуМетаданныхБиблиотеки(ИмяПакета) Экспорт

ПутьКФайлуМетаданных = "";
Для Каждого КаталогБиблиотек Из МассивКаталоговПоискаБиблиотек Цикл
ВремПутьКФайлуМетаданных = ОбъединитьПути(
КаталогБиблиотек,
ИмяПакета,
КонстантыOpm.ИмяФайлаМетаданныхПакета
);

Лог.Отладка(Новый Файл(ВремПутьКФайлуМетаданных).ПолноеИмя);
Если ФС.ФайлСуществует(ВремПутьКФайлуМетаданных) Тогда
ПутьКФайлуМетаданных = ВремПутьКФайлуМетаданных;
КонецЕсли;
КонецЦикла;

Возврат ПутьКФайлуМетаданных;

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

Процедура ПриСозданииОбъекта(КаталогПоискаБиблиотек = "")

Лог = Логирование.ПолучитьЛог("oscript.app.opm");
МассивКаталоговПоискаБиблиотек = Новый Массив;

Если ЗначениеЗаполнено(КаталогПоискаБиблиотек) Тогда
МассивКаталоговПоискаБиблиотек.Добавить(КаталогПоискаБиблиотек);
Иначе
КаталогСистемныхБиблиотек = ОбъединитьПути(
КаталогПрограммы(),
ПолучитьЗначениеСистемнойНастройки("lib.system")
);

МассивКаталоговПоискаБиблиотек.Добавить(КаталогСистемныхБиблиотек);
ДобавитьКаталогБиблиотек("./" + КонстантыOpm.ЛокальныйКаталогУстановкиПакетов);
КонецЕсли;

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

0 comments on commit 995faf5

Please sign in to comment.