You've already forked precommit4onec
mirror of
https://github.com/bia-technologies/precommit4onec.git
synced 2025-12-24 00:21:51 +02:00
#ONECICD-186
Реализация команды проверить репозиторий по сценариям
This commit is contained in:
@@ -29,6 +29,7 @@
|
|||||||
precommit - Выполняет сценарии precommit
|
precommit - Выполняет сценарии precommit
|
||||||
install - Выполняет подключение (установку) precommit hook'а в репозиторий
|
install - Выполняет подключение (установку) precommit hook'а в репозиторий
|
||||||
configure - Выполняет настройку репозитория
|
configure - Выполняет настройку репозитория
|
||||||
|
exec-rules - Выполняет указанные сценарии в каталоге репозитория принудительно, без обращения к git
|
||||||
"""
|
"""
|
||||||
И Код возврата команды "oscript" равен 0
|
И Код возврата команды "oscript" равен 0
|
||||||
|
|
||||||
@@ -43,5 +44,6 @@
|
|||||||
precommit - Выполняет сценарии precommit
|
precommit - Выполняет сценарии precommit
|
||||||
install - Выполняет подключение (установку) precommit hook'а в репозиторий
|
install - Выполняет подключение (установку) precommit hook'а в репозиторий
|
||||||
configure - Выполняет настройку репозитория
|
configure - Выполняет настройку репозитория
|
||||||
|
exec-rules - Выполняет указанные сценарии в каталоге репозитория принудительно, без обращения к git
|
||||||
"""
|
"""
|
||||||
И Код возврата команды "oscript" равен 5
|
И Код возврата команды "oscript" равен 5
|
||||||
|
|||||||
169
src/Классы/КомандаВыполнитьСценарии.os
Normal file
169
src/Классы/КомандаВыполнитьСценарии.os
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Служебный модуль с реализацией работы команды <exec-rules>
|
||||||
|
//
|
||||||
|
// (с) BIA Technologies, LLC
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#Использовать gitrunner
|
||||||
|
|
||||||
|
Перем Лог;
|
||||||
|
Перем РепозиторийGit;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Процедура НастроитьКоманду(Знач Команда, Знач Парсер) Экспорт
|
||||||
|
|
||||||
|
// Добавление параметров команды
|
||||||
|
Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "КаталогРепозитория",
|
||||||
|
"Каталог анализируемого репозитория");
|
||||||
|
Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-source-dir",
|
||||||
|
"Каталог расположения исходных файлов относительно корня репозитория. По умолчанию <src>");
|
||||||
|
Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-rules",
|
||||||
|
"Перечень правил для применения. Если сценариев несколько, указываются в кавычках через ,");
|
||||||
|
Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-cfg-file",
|
||||||
|
"Путь к конфигурационному файлу с настройками. Если не указан, используются настройки репозитория либо глобальные");
|
||||||
|
|
||||||
|
КонецПроцедуры // НастроитьКоманду
|
||||||
|
|
||||||
|
// Выполняет логику команды
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений
|
||||||
|
// Приложение - Модуль - Модуль менеджера приложения
|
||||||
|
//
|
||||||
|
Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач Приложение) Экспорт
|
||||||
|
|
||||||
|
Лог = Приложение.ПолучитьЛог();
|
||||||
|
|
||||||
|
КаталогРепозитория = ПараметрыКоманды["КаталогРепозитория"];
|
||||||
|
ФайлКаталогРепозитория = Новый Файл(КаталогРепозитория);
|
||||||
|
Если НЕ ФайлКаталогРепозитория.Существует() ИЛИ ФайлКаталогРепозитория.ЭтоФайл() Тогда
|
||||||
|
|
||||||
|
Лог.Ошибка("Каталог репозитория '%1' не существует или это файл", КаталогРепозитория);
|
||||||
|
Возврат Приложение.РезультатыКоманд().НеверныеПараметры;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
АдресПоискаКонфигурационногоФайла = КаталогРепозитория;
|
||||||
|
|
||||||
|
Если ЗначениеЗаполнено(ПараметрыКоманды["-cfg-file"]) Тогда
|
||||||
|
|
||||||
|
АдресПоискаКонфигурационногоФайла = ПараметрыКоманды["-cfg-file"];
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КаталогИсходныхФайлов = ПараметрыКоманды["-source-dir"];
|
||||||
|
Если Не ЗначениеЗаполнено(КаталогИсходныхФайлов) Тогда
|
||||||
|
|
||||||
|
КаталогИсходныхФайлов = "src";
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ТекущийКаталогИсходныхФайлов = ОбъединитьПути(КаталогРепозитория, КаталогИсходныхФайлов);
|
||||||
|
ФайлТекущийКаталогИсходныхФайлов = Новый Файл(ТекущийКаталогИсходныхФайлов);
|
||||||
|
ТекущийКаталогИсходныхФайлов = ФайлТекущийКаталогИсходныхФайлов.ПолноеИмя;
|
||||||
|
Если НЕ ФайлТекущийКаталогИсходныхФайлов.Существует() Тогда
|
||||||
|
|
||||||
|
Лог.Ошибка("Каталога <%1> не существует", ТекущийКаталогИсходныхФайлов);
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
|
||||||
|
КаталогРепозитория = ФайлКаталогРепозитория.ПолноеИмя;
|
||||||
|
|
||||||
|
ИменаЗагружаемыхСценариев = Неопределено;
|
||||||
|
Если ЗначениеЗаполнено(ПараметрыКоманды["-rules"]) Тогда
|
||||||
|
ПараметрИменаСценариев = СтрЗаменить(ПараметрыКоманды["-rules"], " ", "");
|
||||||
|
ИменаЗагружаемыхСценариев = СтрРазделить(ПараметрИменаСценариев, ",", Ложь);
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ОбрабатываемыеФайлы = НайтиФайлы(ТекущийКаталогИсходныхФайлов, "*", Истина);
|
||||||
|
|
||||||
|
Ит = 0;
|
||||||
|
|
||||||
|
УправлениеНастройками = МенеджерНастроек.НастройкиРепозитория(АдресПоискаКонфигурационногоФайла);
|
||||||
|
НаборНастроек = СценарииОбработки.ПолучитьСценарииСПараметрамиВыполнения(КаталогРепозитория, ИменаЗагружаемыхСценариев);
|
||||||
|
КритичныеОшибки = Новый Массив;
|
||||||
|
|
||||||
|
ПараметрыОбработки = СценарииОбработки.ПолучитьСтандартныеПараметрыОбработки();
|
||||||
|
|
||||||
|
Пока Ит < ОбрабатываемыеФайлы.Количество() Цикл
|
||||||
|
|
||||||
|
АнализируемыйФайл = ОбрабатываемыеФайлы[Ит];
|
||||||
|
|
||||||
|
Если АнализируемыйФайл.ЭтоКаталог() Тогда
|
||||||
|
Ит = Ит + 1;
|
||||||
|
Продолжить;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Лог.Информация("Анализируется файл <%1>", АнализируемыйФайл.ПолноеИмя);
|
||||||
|
|
||||||
|
ИмяФайла = ФайловыеОперации.ПолучитьНормализованныйОтносительныйПуть(КаталогРепозитория,
|
||||||
|
СтрЗаменить(АнализируемыйФайл.ПолноеИмя, КаталогРепозитория, ""));
|
||||||
|
|
||||||
|
ИмяПроекта = МенеджерНастроек.ИмяПроектаДляФайла(ИмяФайла);
|
||||||
|
|
||||||
|
НастройкаОбработки = НаборНастроек[ИмяПроекта];
|
||||||
|
|
||||||
|
Если НЕ ЗначениеЗаполнено(НастройкаОбработки) Тогда
|
||||||
|
|
||||||
|
ВызватьИсключение СтрШаблон("Не удалось получить настройки для %1", ИмяФайла);
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ПараметрыОбработки.Настройки = НастройкаОбработки.НастройкиСценариев.Получить("НастройкиСценариев");
|
||||||
|
ПараметрыОбработки.КаталогРепозитория = КаталогРепозитория;
|
||||||
|
|
||||||
|
Для Каждого СценарийОбработки Из НастройкаОбработки.СценарииОбработки Цикл
|
||||||
|
|
||||||
|
Попытка
|
||||||
|
ФайлОбработан = СценарийОбработки.ОбработатьФайл(АнализируемыйФайл,
|
||||||
|
ТекущийКаталогИсходныхФайлов,
|
||||||
|
ПараметрыОбработки);
|
||||||
|
|
||||||
|
Если НЕ ФайлОбработан Тогда
|
||||||
|
Продолжить;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Для Каждого ФайлДляДопОбработки Из ПараметрыОбработки.ФайлыДляПостОбработки Цикл
|
||||||
|
|
||||||
|
ОбрабатываемыеФайлы.Добавить(ФайлДляДопОбработки);
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
ПараметрыОбработки.ФайлыДляПостОбработки.Очистить();
|
||||||
|
|
||||||
|
Исключение
|
||||||
|
|
||||||
|
Ошибка = ОписаниеОшибки();
|
||||||
|
КритичныеОшибки.Добавить(Ошибка);
|
||||||
|
Лог.Информация("Критичная ошибка: %1", Ошибка);
|
||||||
|
|
||||||
|
КонецПопытки;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Ит = Ит + 1;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
// В отличие от прекоммита, здесь лучше вывести все криты в конце одним блоком еще раз.
|
||||||
|
Если КритичныеОшибки.Количество() Тогда
|
||||||
|
|
||||||
|
Лог.Ошибка("В результате выполнения возникли исключения:");
|
||||||
|
|
||||||
|
Для Каждого ОписаниеОшибки Из КритичныеОшибки Цикл
|
||||||
|
|
||||||
|
Лог.Ошибка(ОписаниеОшибки);
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
// При успешном выполнении возвращает код успеха
|
||||||
|
Возврат Приложение.РезультатыКоманд().Успех;
|
||||||
|
|
||||||
|
КонецФункции // ВыполнитьКоманду
|
||||||
|
|
||||||
@@ -149,7 +149,10 @@
|
|||||||
Приложение.ДобавитьКоманду(ИмяКомандыПомощь(), "КомандаСправкаПоПараметрам", "Выводит справку по командам");
|
Приложение.ДобавитьКоманду(ИмяКомандыПомощь(), "КомандаСправкаПоПараметрам", "Выводит справку по командам");
|
||||||
Приложение.ДобавитьКоманду(ИмяКомандыВерсия(), "КомандаVersion", "Выводит версию приложения");
|
Приложение.ДобавитьКоманду(ИмяКомандыВерсия(), "КомандаVersion", "Выводит версию приложения");
|
||||||
Приложение.ДобавитьКоманду("precommit", "КомандаПрекоммит", "Выполняет сценарии precommit");
|
Приложение.ДобавитьКоманду("precommit", "КомандаПрекоммит", "Выполняет сценарии precommit");
|
||||||
Приложение.ДобавитьКоманду("install", "КомандаИнсталл", "Выполняет подключение (установку) precommit hook'а в репозиторий");
|
Приложение.ДобавитьКоманду("install", "КомандаИнсталл",
|
||||||
|
"Выполняет подключение (установку) precommit hook'а в репозиторий");
|
||||||
Приложение.ДобавитьКоманду("configure", "КомандаКонфигуратион", "Выполняет настройку репозитория");
|
Приложение.ДобавитьКоманду("configure", "КомандаКонфигуратион", "Выполняет настройку репозитория");
|
||||||
|
Приложение.ДобавитьКоманду("exec-rules", "КомандаВыполнитьСценарии",
|
||||||
|
"Выполняет указанные сценарии в каталоге репозитория принудительно, без обращения к git");
|
||||||
|
|
||||||
КонецПроцедуры // ПриРегистрацииКомандПриложения
|
КонецПроцедуры // ПриРегистрацииКомандПриложения
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
|
Функция Загрузить(КаталогРепозитория, Проект, Знач ПараметрИменаЗагружаемыхСценариев = Неопределено) Экспорт
|
||||||
|
|
||||||
Функция Загрузить(КаталогРепозитория, Проект, ПараметрИменаЗагружаемыхСценариев = Неопределено) Экспорт
|
|
||||||
|
|
||||||
ТекущийКаталогСценариев = МенеджерПриложения.КаталогСценариев();
|
ТекущийКаталогСценариев = МенеджерПриложения.КаталогСценариев();
|
||||||
ВсеЗагруженные = Новый Массив;
|
ВсеЗагруженные = Новый Массив;
|
||||||
@@ -118,12 +116,12 @@
|
|||||||
// <Возвращает соответствие со сценариями и их настройками>
|
// <Возвращает соответствие со сценариями и их настройками>
|
||||||
//
|
//
|
||||||
// Параметры:
|
// Параметры:
|
||||||
// КаталогРепозитория - <Строка> - <описание параметра>
|
// КаталогРепозитория - <Строка> - <Адрес каталога репозитория>
|
||||||
// УправлениеНастройками - <Тип.Вид> - <описание параметра>
|
// ИменаЗагружаемыхСценариев - <Массив.Строка> - <Предназначен для переопределения сценариев,
|
||||||
// ИменаЗагружаемыхСценариев - <Тип.Вид> - <описание параметра>
|
// Если задан загрузятся только они >
|
||||||
//
|
//
|
||||||
// Возвращаемое значение:
|
// Возвращаемое значение:
|
||||||
// <Соответствие> - <ключ - Ключ структуры настроек прокоммит или
|
// <Соответствие> - <ключ - Ключ структуры настроек прекоммит или
|
||||||
// путь к каталогу, который обрабатывается
|
// путь к каталогу, который обрабатывается
|
||||||
// нестандартными правилами >
|
// нестандартными правилами >
|
||||||
//
|
//
|
||||||
@@ -135,25 +133,28 @@
|
|||||||
НаборНастроек = Новый Соответствие;
|
НаборНастроек = Новый Соответствие;
|
||||||
|
|
||||||
Для Каждого ИмяПроекта Из НастройкиПроектов Цикл
|
Для Каждого ИмяПроекта Из НастройкиПроектов Цикл
|
||||||
Настройка = НастройкаОбработкиПроекта(ИмяПроекта, КаталогРепозитория);
|
Настройка = НастройкаОбработкиПроекта(ИмяПроекта, КаталогРепозитория, ИменаЗагружаемыхСценариев);
|
||||||
НаборНастроек.Вставить(ИмяПроекта, Настройка);
|
НаборНастроек.Вставить(ИмяПроекта, Настройка);
|
||||||
КонецЦикла;
|
КонецЦикла;
|
||||||
|
|
||||||
ИмяПроекта = ""; // Базовые настройки
|
ИмяПроекта = ""; // Базовые настройки
|
||||||
Настройка = НастройкаОбработкиПроекта(ИмяПроекта, КаталогРепозитория);
|
Настройка = НастройкаОбработкиПроекта(ИмяПроекта, КаталогРепозитория, ИменаЗагружаемыхСценариев);
|
||||||
НаборНастроек.Вставить(ИмяПроекта, Настройка);
|
НаборНастроек.Вставить(ИмяПроекта, Настройка);
|
||||||
|
|
||||||
Возврат НаборНастроек;
|
Возврат НаборНастроек;
|
||||||
|
|
||||||
КонецФункции
|
КонецФункции
|
||||||
|
|
||||||
Функция НастройкаОбработкиПроекта(ИмяПроекта, КаталогРепозитория)
|
Функция НастройкаОбработкиПроекта(ИмяПроекта, КаталогРепозитория, Знач ИменаЗагружаемыхСценариев = Неопределено)
|
||||||
|
|
||||||
Настройка = Новый Структура("СценарииОбработки, НастройкиСценариев");
|
Настройка = Новый Структура("СценарииОбработки, НастройкиСценариев");
|
||||||
|
Если ИменаЗагружаемыхСценариев = Неопределено Тогда
|
||||||
|
ИменаЗагружаемыхСценариев = МенеджерНастроек.ИменаЗагружаемыхСценариев(ИмяПроекта)
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
Настройка.СценарииОбработки = СценарииОбработки.Загрузить(КаталогРепозитория,
|
Настройка.СценарииОбработки = СценарииОбработки.Загрузить(КаталогРепозитория,
|
||||||
ИмяПроекта,
|
ИмяПроекта,
|
||||||
МенеджерНастроек.ИменаЗагружаемыхСценариев(ИмяПроекта));
|
ИменаЗагружаемыхСценариев);
|
||||||
|
|
||||||
Настройка.НастройкиСценариев = МенеджерНастроек.НастройкиПроекта(ИмяПроекта);
|
Настройка.НастройкиСценариев = МенеджерНастроек.НастройкиПроекта(ИмяПроекта);
|
||||||
|
|
||||||
|
|||||||
@@ -133,6 +133,10 @@
|
|||||||
|
|
||||||
ПроверитьКорневойКаталог(ПутьКорневогоКаталога);
|
ПроверитьКорневойКаталог(ПутьКорневогоКаталога);
|
||||||
|
|
||||||
|
Если СтрНачинаетсяС(ОтносительныйПутьФайла, ПолучитьРазделительПути()) Тогда
|
||||||
|
ОтносительныйПутьФайла = Сред(ОтносительныйПутьФайла, 2);
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
ПолныйПутьФайла = ОбъединитьПути(ПутьКорневогоКаталога, ОтносительныйПутьФайла);
|
ПолныйПутьФайла = ОбъединитьПути(ПутьКорневогоКаталога, ОтносительныйПутьФайла);
|
||||||
ОтносительныйПуть = ОтносительныйПуть(ПутьКорневогоКаталога, ПолныйПутьФайла, ПолучитьРазделительПути());
|
ОтносительныйПуть = ОтносительныйПуть(ПутьКорневогоКаталога, ПолныйПутьФайла, ПолучитьРазделительПути());
|
||||||
Файл = Новый Файл(ПолныйПутьФайла);
|
Файл = Новый Файл(ПолныйПутьФайла);
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийИсправлениеНеКаноническогоНаписанияНеИндексируетНеизмененные");
|
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийИсправлениеНеКаноническогоНаписанияНеИндексируетНеизмененные");
|
||||||
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийИсправлениеНеКаноническогоНаписанияИсправляетТолькоНаписание");
|
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийИсправлениеНеКаноническогоНаписанияИсправляетТолькоНаписание");
|
||||||
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСинхронизацияОбъектовМетаданныхВызываетИсключение");
|
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСинхронизацияОбъектовМетаданныхВызываетИсключение");
|
||||||
|
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗагрузкуСценариевПоИмени");
|
||||||
|
|
||||||
Возврат ВсеТесты;
|
Возврат ВсеТесты;
|
||||||
|
|
||||||
@@ -176,6 +177,32 @@
|
|||||||
|
|
||||||
КонецПроцедуры
|
КонецПроцедуры
|
||||||
|
|
||||||
|
|
||||||
|
Процедура ТестДолжен_ПроверитьЗагрузкуСценариевПоИмени() Экспорт
|
||||||
|
|
||||||
|
Файл = Новый Файл(МенеджерВременныхФайлов.СоздатьФайл("bsl"));
|
||||||
|
|
||||||
|
Имена = Новый Массив;
|
||||||
|
|
||||||
|
Имена.Добавить("ПроверкаДублейПроцедурИФункций");
|
||||||
|
|
||||||
|
Сценарии = СценарииОбработки.Загрузить(Файл.Путь, "", Имена);
|
||||||
|
Ожидаем.Что(Сценарии.Количество(), "Сценарий не получен").Равно(1);
|
||||||
|
|
||||||
|
Имена.Добавить("ПроверкаДублейПроцедурИФункций");
|
||||||
|
Сценарии = СценарииОбработки.Загрузить(Файл.Путь, "", Имена);
|
||||||
|
Ожидаем.Что(Сценарии.Количество(), "Добавлен один и тот же сценарий").Равно(1);
|
||||||
|
|
||||||
|
Имена.Добавить("ПроверкаДублейПроцедурИФункций.os");
|
||||||
|
Сценарии = СценарииОбработки.Загрузить(Файл.Путь, "", Имена);
|
||||||
|
Ожидаем.Что(Сценарии.Количество(), "Добавлен один и тот же сценарий").Равно(1);
|
||||||
|
|
||||||
|
Имена.Добавить("РазборОтчетовОбработокРасширений.os");
|
||||||
|
Сценарии = СценарииОбработки.Загрузить(Файл.Путь, "", Имена);
|
||||||
|
Ожидаем.Что(Сценарии.Количество(), "С массивом загружаемых сценариев что-то пошло не так").Равно(2);
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
#КонецОбласти
|
#КонецОбласти
|
||||||
#КонецОбласти
|
#КонецОбласти
|
||||||
#Область СинхронизацияОбъектовМетаданныхИФайлов
|
#Область СинхронизацияОбъектовМетаданныхИФайлов
|
||||||
|
|||||||
Reference in New Issue
Block a user