
////////////////////////////////////////////////////////////
// Описание пакета для сборки и установки
// Полную документацию см. на hub.oscript.io/packaging
//

///////////////////////////////////////////////////////////////////
// Процедуры установки пакета с клиентской машины
///////////////////////////////////////////////////////////////////

// Вызывается пакетным менеджером перед установкой пакета на клиентскую машину.
//
// Параметры:
//   КаталогУстановкиПакета - строка. Путь в который пакетный менеджер устанавливает текущий пакет.
//   ЧтениеZipФайла - ЧтениеZipФайла. Архив пакета.
//
Процедура ПередУстановкой(Знач КаталогУстановкиПакета, Знач ЧтениеZipФайла) Экспорт

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

// Вызывается пакетным менеджером после распаковки пакета на клиентскую машину.
//
// Параметры:
//   КаталогУстановкиПакета - строка. Путь в который пакетный менеджер устанавливает текущий пакет.
//
Процедура ПриУстановке(Знач КаталогУстановкиПакета, СтандартнаяОбработка) Экспорт

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

Процедура ПередСборкой(Знач РабочийКаталог) Экспорт

	КаталогМодулей = ОбъединитьПути(РабочийКаталог, "oscript_modules");
	УдалитьФайлы(КаталогМодулей, ПолучитьМаскуВсеФайлы());

	СистемнаяИнформация = Новый СистемнаяИнформация;
	ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0;
	Если ЭтоWindows Тогда
		ИмяУтилиты = "opm.bat";
	Иначе
		ИмяУтилиты = "opm";
	КонецЕсли;

	СтрокаЗапуска = СтрШаблон("%1 install -l", ИмяУтилиты);
	ВыполнитьОбязательныйШаг(СтрокаЗапуска, РабочийКаталог);

	СобираемаяВерсия = Описание.Свойства().Версия;
	Если СобираемаяВерсия = "0.14.4" Тогда
		УдалитьФайлы(ОбъединитьПути(КаталогМодулей, "gitrunner"));
		СтрокаЗапуска = "oscript src/cmd/opm.os install -l";
		ВыполнитьОбязательныйШаг(СтрокаЗапуска, РабочийКаталог);

		// Подчищаем за 1bdd
		// TODO: сделать зависимости этапа разработки
		УдалитьФайлы(ОбъединитьПути(КаталогМодулей, "bin"));
		УдалитьФайлы(ОбъединитьПути(КаталогМодулей, "1bdd"));

	КонецЕсли;

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

Процедура ВыполнитьОбязательныйШаг(Знач СтрокаЗапуска, Знач РабочийКаталог)
	Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог);
	Процесс.Запустить();
	Процесс.ОжидатьЗавершения();

	Если Процесс.КодВозврата <> 0 Тогда
		ВызватьИсключение "Ошибка сборки пакета";
	КонецЕсли;
КонецПроцедуры

ПутьКСценариюКонстант = ОбъединитьПути(ТекущийСценарий().Каталог, "src/core", "Модули", "КонстантыOpm.os");

// специальная заглушка для правильной компиляции packagedef при первых действий при установке пакета,
// 	когда еще не извлечено никаких файлов пакет
ФайлКонстант = Новый Файл(ПутьКСценариюКонстант);
Если ФайлКонстант.Существует() Тогда
	Константы_ЛокальнаяВерсия = ЗагрузитьСценарий(ПутьКСценариюКонстант);
	ВерсияПродукта = Константы_ЛокальнаяВерсия.ВерсияПродукта;
Иначе
	ВерсияПродукта = "1.0.0";
КонецЕсли;

Описание.Имя("opm")
		.Версия(ВерсияПродукта)
		.ВерсияСреды("1.0.19")
		.ЗависитОт("fs", "1.0.0")
		.ЗависитОт("asserts", "1.3.0")
		.ЗависитОт("json", "1.1.1")
		.ЗависитОт("fluent", "0.4.0")
		.ЗависитОт("logos", "1.2.1")
		.ЗависитОт("cli", "0.9.10")
		.ЗависитОт("tempfiles", "0.2.2")
		.ЗависитОт("gitrunner", "1.6.0")
		.ВключитьФайл("packagedef")
		.ВключитьФайл("src")
		.ВключитьФайл("tasks")
		.ВключитьФайл("oscript_modules")
		.ОпределяетКласс("КэшУстановленныхПакетов", "src/core/Классы/КэшУстановленныхПакетов.os")
		.ОпределяетКласс("МенеджерПолученияПакетов", "src/core/Классы/МенеджерПолученияПакетов.os")
		.ОпределяетКласс("МенеджерУстановкиПакетов", "src/core/Классы/МенеджерУстановкиПакетов.os")
		.ОпределяетКласс("ОписаниеПакета", "src/core/Классы/ОписаниеПакета.os")
		.ОпределяетКласс("СборщикПакета", "src/core/Классы/СборщикПакета.os")
		.ОпределяетКласс("СерверПакетов", "src/core/Классы/СерверПакетов.os")
		.ОпределяетКласс("СериализацияМетаданныхПакета", "src/core/Классы/СериализацияМетаданныхПакета.os")
		.ОпределяетКласс("УстановкаПакета", "src/core/Классы/УстановкаПакета.os")
		.ОпределяетМодуль("КонстантыOpm", "src/core/Модули/КонстантыOpm.os")
		.ОпределяетМодуль("НастройкиOpm", "src/core/Модули/НастройкиOpm.os")
		.ОпределяетМодуль("РаботаСВерсиями", "src/core/Модули/РаботаСВерсиями.os")
		.ОпределяетМодуль("РаботаСОписаниемПакета", "src/core/Модули/РаботаСОписаниемПакета.os")
		.ОпределяетМодуль("РаботаСПакетами", "src/core/Модули/РаботаСПакетами.os")
		.ОпределяетМодуль("РежимУстановкиПакетов", "src/core/Модули/РежимУстановкиПакетов.os")
		.ИсполняемыйФайл("src/cmd/opm.os");
