1
0
mirror of https://github.com/bia-technologies/precommit4onec.git synced 2025-06-02 23:17:25 +02:00

#ONECICD-186

Реализация команды проверить репозиторий по сценариям
This commit is contained in:
Dmitriy Medvedev 2020-02-21 19:11:26 +03:00
parent 78b2eb5290
commit 5fd6411d6c
6 changed files with 258 additions and 52 deletions

View File

@ -29,6 +29,7 @@
precommit - Выполняет сценарии precommit
install - Выполняет подключение (установку) precommit hook'а в репозиторий
configure - Выполняет настройку репозитория
exec-rules - Выполняет указанные сценарии в каталоге репозитория принудительно, без обращения к git
"""
И Код возврата команды "oscript" равен 0
@ -43,5 +44,6 @@
precommit - Выполняет сценарии precommit
install - Выполняет подключение (установку) precommit hook'а в репозиторий
configure - Выполняет настройку репозитория
exec-rules - Выполняет указанные сценарии в каталоге репозитория принудительно, без обращения к git
"""
И Код возврата команды "oscript" равен 5

View 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;
КонецЦикла;
// В отличие от прекоммита, здесь лучше вывести все криты в конце одним блоком еще раз.
Если КритичныеОшибки.Количество() Тогда
Лог.Ошибка("В результате выполнения возникли исключения:");
Для Каждого ОписаниеОшибки Из КритичныеОшибки Цикл
Лог.Ошибка(ОписаниеОшибки);
КонецЦикла;
КонецЕсли;
// При успешном выполнении возвращает код успеха
Возврат Приложение.РезультатыКоманд().Успех;
КонецФункции // ВыполнитьКоманду

View File

@ -149,7 +149,10 @@
Приложение.ДобавитьКоманду(ИмяКомандыПомощь(), "КомандаСправкаПоПараметрам", "Выводит справку по командам");
Приложение.ДобавитьКоманду(ИмяКомандыВерсия(), "КомандаVersion", "Выводит версию приложения");
Приложение.ДобавитьКоманду("precommit", "КомандаПрекоммит", "Выполняет сценарии precommit");
Приложение.ДобавитьКоманду("install", "КомандаИнсталл", "Выполняет подключение (установку) precommit hook'а в репозиторий");
Приложение.ДобавитьКоманду("install", "КомандаИнсталл",
"Выполняет подключение (установку) precommit hook'а в репозиторий");
Приложение.ДобавитьКоманду("configure", "КомандаКонфигуратион", "Выполняет настройку репозитория");
Приложение.ДобавитьКоманду("exec-rules", "КомандаВыполнитьСценарии",
"Выполняет указанные сценарии в каталоге репозитория принудительно, без обращения к git");
КонецПроцедуры // ПриРегистрацииКомандПриложения

View File

@ -1,6 +1,4 @@
Функция Загрузить(КаталогРепозитория, Проект, ПараметрИменаЗагружаемыхСценариев = Неопределено) Экспорт
Функция Загрузить(КаталогРепозитория, Проект, Знач ПараметрИменаЗагружаемыхСценариев = Неопределено) Экспорт
ТекущийКаталогСценариев = МенеджерПриложения.КаталогСценариев();
ВсеЗагруженные = Новый Массив;
@ -118,12 +116,12 @@
// <Возвращает соответствие со сценариями и их настройками>
//
// Параметры:
// КаталогРепозитория - <Строка> - <описание параметра>
// УправлениеНастройками - <Тип.Вид> - <описание параметра>
// ИменаЗагружаемыхСценариев - <Тип.Вид> - <описание параметра>
// КаталогРепозитория - <Строка> - <Адрес каталога репозитория>
// ИменаЗагружаемыхСценариев - <Массив.Строка> - <Предназначен для переопределения сценариев,
// Если задан загрузятся только они >
//
// Возвращаемое значение:
// <Соответствие> - <ключ - Ключ структуры настроек прокоммит или
// <Соответствие> - <ключ - Ключ структуры настроек прекоммит или
// путь к каталогу, который обрабатывается
// нестандартными правилами >
//
@ -135,25 +133,28 @@
НаборНастроек = Новый Соответствие;
Для Каждого ИмяПроекта Из НастройкиПроектов Цикл
Настройка = НастройкаОбработкиПроекта(ИмяПроекта, КаталогРепозитория);
Настройка = НастройкаОбработкиПроекта(ИмяПроекта, КаталогРепозитория, ИменаЗагружаемыхСценариев);
НаборНастроек.Вставить(ИмяПроекта, Настройка);
КонецЦикла;
ИмяПроекта = ""; // Базовые настройки
Настройка = НастройкаОбработкиПроекта(ИмяПроекта, КаталогРепозитория);
Настройка = НастройкаОбработкиПроекта(ИмяПроекта, КаталогРепозитория, ИменаЗагружаемыхСценариев);
НаборНастроек.Вставить(ИмяПроекта, Настройка);
Возврат НаборНастроек;
КонецФункции
Функция НастройкаОбработкиПроекта(ИмяПроекта, КаталогРепозитория)
Функция НастройкаОбработкиПроекта(ИмяПроекта, КаталогРепозитория, Знач ИменаЗагружаемыхСценариев = Неопределено)
Настройка = Новый Структура("СценарииОбработки, НастройкиСценариев");
Если ИменаЗагружаемыхСценариев = Неопределено Тогда
ИменаЗагружаемыхСценариев = МенеджерНастроек.ИменаЗагружаемыхСценариев(ИмяПроекта)
КонецЕсли;
Настройка.СценарииОбработки = СценарииОбработки.Загрузить(КаталогРепозитория,
ИмяПроекта,
МенеджерНастроек.ИменаЗагружаемыхСценариев(ИмяПроекта));
ИменаЗагружаемыхСценариев);
Настройка.НастройкиСценариев = МенеджерНастроек.НастройкиПроекта(ИмяПроекта);

View File

@ -133,6 +133,10 @@
ПроверитьКорневойКаталог(ПутьКорневогоКаталога);
Если СтрНачинаетсяС(ОтносительныйПутьФайла, ПолучитьРазделительПути()) Тогда
ОтносительныйПутьФайла = Сред(ОтносительныйПутьФайла, 2);
КонецЕсли;
ПолныйПутьФайла = ОбъединитьПути(ПутьКорневогоКаталога, ОтносительныйПутьФайла);
ОтносительныйПуть = ОтносительныйПуть(ПутьКорневогоКаталога, ПолныйПутьФайла, ПолучитьРазделительПути());
Файл = Новый Файл(ПолныйПутьФайла);

View File

@ -26,6 +26,7 @@
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийИсправлениеНеКаноническогоНаписанияНеИндексируетНеизмененные");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийИсправлениеНеКаноническогоНаписанияИсправляетТолькоНаписание");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСинхронизацияОбъектовМетаданныхВызываетИсключение");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗагрузкуСценариевПоИмени");
Возврат ВсеТесты;
@ -176,6 +177,32 @@
КонецПроцедуры
Процедура ТестДолжен_ПроверитьЗагрузкуСценариевПоИмени() Экспорт
Файл = Новый Файл(МенеджерВременныхФайлов.СоздатьФайл("bsl"));
Имена = Новый Массив;
Имена.Добавить("ПроверкаДублейПроцедурИФункций");
Сценарии = СценарииОбработки.Загрузить(Файл.Путь, "", Имена);
Ожидаем.Что(Сценарии.Количество(), "Сценарий не получен").Равно(1);
Имена.Добавить("ПроверкаДублейПроцедурИФункций");
Сценарии = СценарииОбработки.Загрузить(Файл.Путь, "", Имена);
Ожидаем.Что(Сценарии.Количество(), "Добавлен один и тот же сценарий").Равно(1);
Имена.Добавить("ПроверкаДублейПроцедурИФункций.os");
Сценарии = СценарииОбработки.Загрузить(Файл.Путь, "", Имена);
Ожидаем.Что(Сценарии.Количество(), "Добавлен один и тот же сценарий").Равно(1);
Имена.Добавить("РазборОтчетовОбработокРасширений.os");
Сценарии = СценарииОбработки.Загрузить(Файл.Путь, "", Имена);
Ожидаем.Что(Сценарии.Количество(), "С массивом загружаемых сценариев что-то пошло не так").Равно(2);
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#Область СинхронизацияОбъектовМетаданныхИФайлов