-
Notifications
You must be signed in to change notification settings - Fork 31
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Поддержка установки версий SNAPSHOT из packagedef
- Loading branch information
Showing
1 changed file
with
182 additions
and
175 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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.ЛокальныйКаталогУстановкиПакетов); | ||
КонецЕсли; | ||
|
||
КонецПроцедуры | ||
|