1
0
mirror of https://github.com/bia-technologies/precommit4onec.git synced 2025-07-17 01:32:39 +02:00

- Обновлены тесты

- доработана прекоммит
 - исправлен конфигурационный файл
This commit is contained in:
Maxmov Valery
2017-09-15 18:36:55 +03:00
parent 2741785217
commit 25f7a278d5
5 changed files with 142 additions and 61 deletions

View File

@ -0,0 +1,32 @@
# language: ru
Функциональность: Настройка конфигурации прекоммита
Как разработчик
Я хочу иметь возможность изменять настройки precommit4onec
Чтобы автоматически выполнять обработку исходников перед фиксацией изменений в репозитории
Сценарий: Печать текущих настроек precommit4onec
Когда Я выполняю команду "oscript" c параметрами "<КаталогПроекта>/src/main.os configure -global"
Тогда Код возврата команды "oscript" равен 0
И Я сообщаю вывод команды "oscript"
И Вывод команды "oscript" содержит "precommit4onec v1.0.1"
И Вывод команды "oscript" содержит "Установленные настройки:"
И Вывод команды "oscript" содержит "ИспользоватьСценарииРепозитория ="
И Вывод команды "oscript" содержит "КаталогЛокальныхСценариев ="
И Вывод команды "oscript" содержит "ГлобальныеСценарии ="
Сценарий: Сброс настроек к значениям по умолчанию
Когда Я выполняю команду "oscript" c параметрами "<КаталогПроекта>/src/main.os configure -global -reset"
Тогда Код возврата команды "oscript" равен 0
И Я выполняю команду "oscript" c параметрами "<КаталогПроекта>/src/main.os configure -global"
И Код возврата команды "oscript" равен 0
И Я сообщаю вывод команды "oscript"
И Вывод команды "oscript" содержит
"""
precommit4onec v1.0.1
Установленные настройки:
ИспользоватьСценарииРепозитория = Нет
КаталогЛокальныхСценариев =
ГлобальныеСценарии = РазборОбычныхФормНаИсходники.os,РазборОтчетовОбработокРасширений.os
"""

View File

@ -28,6 +28,7 @@
version - Выводит версию приложения version - Выводит версию приложения
precommit - Выполняет сценарии precommit precommit - Выполняет сценарии precommit
install - Выполняет подключение (установку) precommit hook'а в репозиторий install - Выполняет подключение (установку) precommit hook'а в репозиторий
configure - Выполняет настройку репозитория
""" """
И Код возврата команды "oscript" равен 0 И Код возврата команды "oscript" равен 0
@ -41,5 +42,6 @@
version - Выводит версию приложения version - Выводит версию приложения
precommit - Выполняет сценарии precommit precommit - Выполняет сценарии precommit
install - Выполняет подключение (установку) precommit hook'а в репозиторий install - Выполняет подключение (установку) precommit hook'а в репозиторий
configure - Выполняет настройку репозитория
""" """
И Код возврата команды "oscript" равен 5 И Код возврата команды "oscript" равен 5

View File

@ -14,7 +14,7 @@
И я создаю новый репозиторий "rep1" в каталоге "КаталогРепозиториев" и запоминаю его как "Репозиторий1" И я создаю новый репозиторий "rep1" в каталоге "КаталогРепозиториев" и запоминаю его как "Репозиторий1"
И я создаю новый репозиторий "rep2" в каталоге "КаталогРепозиториев" и запоминаю его как "Репозиторий2" И я создаю новый репозиторий "rep2" в каталоге "КаталогРепозиториев" и запоминаю его как "Репозиторий2"
Сценарий: Установка precommi4onec в репозиторий Сценарий: Установка precommit4onec в репозиторий
Когда Я выполняю команду "oscript" c параметрами "<КаталогПроекта>/src/main.os install rep1" Когда Я выполняю команду "oscript" c параметрами "<КаталогПроекта>/src/main.os install rep1"
Тогда Код возврата команды "oscript" равен 0 Тогда Код возврата команды "oscript" равен 0
И Я сообщаю вывод команды "oscript" И Я сообщаю вывод команды "oscript"
@ -22,14 +22,14 @@
И Вывод команды "oscript" содержит "Pre-commit hook для rep1 создан" И Вывод команды "oscript" содержит "Pre-commit hook для rep1 создан"
И В каталоге ".git/hooks" репозитория "Репозиторий1" есть файл "pre-commit" И В каталоге ".git/hooks" репозитория "Репозиторий1" есть файл "pre-commit"
Сценарий: precommi4onec не устанавливается в пустой каталог Сценарий: precommit4onec не устанавливается в пустой каталог
Когда Я выполняю команду "oscript" c параметрами "<КаталогПроекта>/src/main.os install ./" Когда Я выполняю команду "oscript" c параметрами "<КаталогПроекта>/src/main.os install ./"
Тогда Код возврата команды "oscript" равен 0 Тогда Код возврата команды "oscript" равен 0
И Я сообщаю вывод команды "oscript" И Я сообщаю вывод команды "oscript"
И Вывод команды "oscript" содержит "precommit4onec v1.0.1" И Вывод команды "oscript" содержит "precommit4onec v1.0.1"
И Вывод команды "oscript" содержит "не является репозиторием git" И Вывод команды "oscript" содержит "не является репозиторием git"
Сценарий: Установка precommi4onec во вложенные каталоги Сценарий: Установка precommit4onec во вложенные каталоги
Когда Я выполняю команду "oscript" c параметрами "<КаталогПроекта>/src/main.os install ./ -r" Когда Я выполняю команду "oscript" c параметрами "<КаталогПроекта>/src/main.os install ./ -r"
Тогда Код возврата команды "oscript" равен 0 Тогда Код возврата команды "oscript" равен 0
И Я сообщаю вывод команды "oscript" И Я сообщаю вывод команды "oscript"

View File

@ -15,7 +15,7 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
Процедура НастроитьКоманду(Знач Команда, Знач Парсер) Экспорт Процедура НастроитьКоманду(Знач Команда, Знач Парсер) Экспорт
// Добавление параметров команды // Добавление параметров команды
Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "КаталогРепозитория", "Каталог анализируемого репозитория"); Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "КаталогРепозитория", "Каталог анализируемого репозитория");
Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-source-dir", "Каталог расположения исходных файлов относительно корня репозитория. По умолчанию <src>"); Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-source-dir", "Каталог расположения исходных файлов относительно корня репозитория. По умолчанию <src>");
@ -31,77 +31,78 @@
Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач Приложение) Экспорт Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач Приложение) Экспорт
Лог = Приложение.ПолучитьЛог(); Лог = Приложение.ПолучитьЛог();
ЗагрузитьСценарииОбработки(Приложение.КаталогСценариев());
КаталогРепозитория = ПараметрыКоманды["КаталогРепозитория"]; КаталогРепозитория = ПараметрыКоманды["КаталогРепозитория"];
ФайлКаталогРепозитория = Новый Файл(КаталогРепозитория); ФайлКаталогРепозитория = Новый Файл(КаталогРепозитория);
Если НЕ ФайлКаталогРепозитория.Существует() ИЛИ ФайлКаталогРепозитория.ЭтоФайл() Тогда Если НЕ ФайлКаталогРепозитория.Существует() ИЛИ ФайлКаталогРепозитория.ЭтоФайл() Тогда
Лог.Ошибка("Каталог репозитория '%1' не существует или это файл", КаталогРепозитория); Лог.Ошибка("Каталог репозитория '%1' не существует или это файл", КаталогРепозитория);
Возврат Приложение.РезультатыКоманд().НеверныеПараметры; Возврат Приложение.РезультатыКоманд().НеверныеПараметры;
КонецЕсли; КонецЕсли;
УправлениеНастройками = Новый НастройкиРепозитория(Приложение.ПутьКРодительскомуКаталогу());
ЗагрузитьСценарииОбработки(Приложение.КаталогСценариев(), УправлениеНастройками, КаталогРепозитория);
КаталогИсходныхФайлов = ПараметрыКоманды["-source-dir"]; КаталогИсходныхФайлов = ПараметрыКоманды["-source-dir"];
Если Не ЗначениеЗаполнено(КаталогИсходныхФайлов) Тогда Если Не ЗначениеЗаполнено(КаталогИсходныхФайлов) Тогда
КаталогИсходныхФайлов = "src"; КаталогИсходныхФайлов = "src";
КонецЕсли; КонецЕсли;
ТекущийКаталогИсходныхФайлов = ОбъединитьПути(КаталогРепозитория, КаталогИсходныхФайлов); ТекущийКаталогИсходныхФайлов = ОбъединитьПути(КаталогРепозитория, КаталогИсходныхФайлов);
ФайлТекущийКаталогИсходныхФайлов = Новый Файл(ТекущийКаталогИсходныхФайлов); ФайлТекущийКаталогИсходныхФайлов = Новый Файл(ТекущийКаталогИсходныхФайлов);
ТекущийКаталогИсходныхФайлов = ФайлТекущийКаталогИсходныхФайлов.ПолноеИмя; ТекущийКаталогИсходныхФайлов = ФайлТекущийКаталогИсходныхФайлов.ПолноеИмя;
Если НЕ ФайлТекущийКаталогИсходныхФайлов.Существует() Тогда Если НЕ ФайлТекущийКаталогИсходныхФайлов.Существует() Тогда
СоздатьКаталог(ТекущийКаталогИсходныхФайлов); СоздатьКаталог(ТекущийКаталогИсходныхФайлов);
КонецЕсли; КонецЕсли;
КаталогРепозитория = ФайлКаталогРепозитория.ПолноеИмя; КаталогРепозитория = ФайлКаталогРепозитория.ПолноеИмя;
РепозиторийGit = Новый ГитРепозиторий(); РепозиторийGit = Новый ГитРепозиторий();
РепозиторийGit.УстановитьРабочийКаталог(КаталогРепозитория); РепозиторийGit.УстановитьРабочийКаталог(КаталогРепозитория);
Если НЕ РепозиторийGit.ЭтоРепозиторий() Тогда
Если НЕ РепозиторийGit.ЭтоРепозиторий() Тогда
Лог.Ошибка("Каталог '%1' не является репозиторием git", КаталогРепозитория); Лог.Ошибка("Каталог '%1' не является репозиторием git", КаталогРепозитория);
Возврат Приложение.РезультатыКоманд().НеверныеПараметры; Возврат Приложение.РезультатыКоманд().НеверныеПараметры;
КонецЕсли; КонецЕсли;
ЖурналИзменений = ПолучитьЖурналИзменений(); ЖурналИзменений = ПолучитьЖурналИзменений();
Ит = 0; Ит = 0;
ПараметрыОбработки = Новый Структура("Лог, ФайлыДляПостОбработки, ИзмененныеКаталоги, КаталогРепозитория", Лог, Новый Массив, Новый Массив, КаталогРепозитория); ПараметрыОбработки = Новый Структура("Лог, ФайлыДляПостОбработки, ИзмененныеКаталоги, КаталогРепозитория", Лог, Новый Массив, Новый Массив, КаталогРепозитория);
Пока Ит < ЖурналИзменений.Количество() Цикл Пока Ит < ЖурналИзменений.Количество() Цикл
АнализируемыйФайл = Новый Файл(ОбъединитьПути(КаталогРепозитория, ЖурналИзменений[Ит].ИмяФайла)); АнализируемыйФайл = Новый Файл(ОбъединитьПути(КаталогРепозитория, ЖурналИзменений[Ит].ИмяФайла));
Лог.Отладка("Анализируется файл <%1>", АнализируемыйФайл.Имя); Лог.Отладка("Анализируется файл <%1>", АнализируемыйФайл.Имя);
Для Каждого СценарийОбработки Из СценарииОбработки Цикл Для Каждого СценарийОбработки Из СценарииОбработки Цикл
ФайлОбработан = СценарийОбработки.Сценарий.ОбработатьФайл(АнализируемыйФайл, ТекущийКаталогИсходныхФайлов, ПараметрыОбработки); ФайлОбработан = СценарийОбработки.Сценарий.ОбработатьФайл(АнализируемыйФайл, ТекущийКаталогИсходныхФайлов, ПараметрыОбработки);
Если ФайлОбработан Тогда Если ФайлОбработан Тогда
Для каждого ФайлДляДопОбработки Из ПараметрыОбработки.ФайлыДляПостОбработки Цикл Для каждого ФайлДляДопОбработки Из ПараметрыОбработки.ФайлыДляПостОбработки Цикл
ЖурналИзменений.Добавить(Новый Структура("ИмяФайла, ТипИзменения", СтрЗаменить(ФайлДляДопОбработки, КаталогРепозитория, ""), ВариантИзмененийФайловGit.Изменен)); ЖурналИзменений.Добавить(Новый Структура("ИмяФайла, ТипИзменения", СтрЗаменить(ФайлДляДопОбработки, КаталогРепозитория, ""), ВариантИзмененийФайловGit.Изменен));
КонецЦикла; КонецЦикла;
ПараметрыОбработки.ФайлыДляПостОбработки.Очистить(); ПараметрыОбработки.ФайлыДляПостОбработки.Очистить();
Продолжить; Продолжить;
КонецЕсли; КонецЕсли;
КонецЦикла; КонецЦикла;
Ит = Ит + 1; Ит = Ит + 1;
КонецЦикла; КонецЦикла;
// измененные каталоги необходимо добавить в индекс // измененные каталоги необходимо добавить в индекс
Лог.Отладка("Добавление измененных каталогов в индекс git"); Лог.Отладка("Добавление измененных каталогов в индекс git");
Для Каждого Каталог Из ПараметрыОбработки.ИзмененныеКаталоги Цикл Для Каждого Каталог Из ПараметрыОбработки.ИзмененныеКаталоги Цикл
@ -118,7 +119,7 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
Функция ПолучитьЖурналИзменений() Функция ПолучитьЖурналИзменений()
ПараметрыКомандыGit = Новый Массив; ПараметрыКомандыGit = Новый Массив;
ПараметрыКомандыGit.Добавить("diff-index --name-status --cached HEAD"); ПараметрыКомандыGit.Добавить("diff-index --name-status --cached HEAD");
РепозиторийGit.ВыполнитьКоманду(ПараметрыКомандыGit); РепозиторийGit.ВыполнитьКоманду(ПараметрыКомандыGit);
@ -127,35 +128,35 @@
РепозиторийGit.ВыполнитьКоманду(ПараметрыКомандыGit); РепозиторийGit.ВыполнитьКоманду(ПараметрыКомандыGit);
РезультатВывода = РепозиторийGit.ПолучитьВыводКоманды(); РезультатВывода = РепозиторийGit.ПолучитьВыводКоманды();
СтрокиВывода = СтрРазделить(РезультатВывода, Символы.ПС); СтрокиВывода = СтрРазделить(РезультатВывода, Символы.ПС);
ЖурналИзменений = Новый Массив; ЖурналИзменений = Новый Массив;
Для Каждого СтрокаВывода Из СтрокиВывода Цикл Для Каждого СтрокаВывода Из СтрокиВывода Цикл
Лог.Отладка(" <%1>", СтрокаВывода); Лог.Отладка(" <%1>", СтрокаВывода);
СтрокаВывода = СокрЛП(СтрокаВывода); СтрокаВывода = СокрЛП(СтрокаВывода);
ПозицияПробела = СтрНайти(СтрокаВывода, " "); ПозицияПробела = СтрНайти(СтрокаВывода, " ");
СимволИзменения = Лев(СтрокаВывода, 1); СимволИзменения = Лев(СтрокаВывода, 1);
Если СимволИзменения = "?" Тогда Если СимволИзменения = "?" Тогда
Продолжить; Продолжить;
КонецЕсли; КонецЕсли;
ТипИзменения = ВариантИзмененийФайловGit.ОпределитьВариантИзменения(СимволИзменения); ТипИзменения = ВариантИзмененийФайловGit.ОпределитьВариантИзменения(СимволИзменения);
ИмяФайла = СокрЛП(СтрЗаменить(Сред(СтрокаВывода, ПозицияПробела + 1), """", "")); ИмяФайла = СокрЛП(СтрЗаменить(Сред(СтрокаВывода, ПозицияПробела + 1), """", ""));
Если ТипИзменения = ВариантИзмененийФайловGit.Переименован Тогда Если ТипИзменения = ВариантИзмененийФайловGit.Переименован Тогда
// это два события - удален и добавлен // это два события - удален и добавлен
ПозицияСтрелки = СтрНайти(ИмяФайла, "->"); ПозицияСтрелки = СтрНайти(ИмяФайла, "->");
ИмяФайлаУдален = СокрЛП(Лев(ИмяФайла, ПозицияСтрелки - 1)); ИмяФайлаУдален = СокрЛП(Лев(ИмяФайла, ПозицияСтрелки - 1));
ЖурналИзменений.Добавить(Новый Структура("ИмяФайла, ТипИзменения", ИмяФайлаУдален, ВариантИзмененийФайловGit.Удален)); ЖурналИзменений.Добавить(Новый Структура("ИмяФайла, ТипИзменения", ИмяФайлаУдален, ВариантИзмененийФайловGit.Удален));
Лог.Отладка(" В журнале git %2 файл <%1>", ИмяФайлаУдален, ВариантИзмененийФайловGit.Удален); Лог.Отладка(" В журнале git %2 файл <%1>", ИмяФайлаУдален, ВариантИзмененийФайловGit.Удален);
ИмяФайла = СокрЛП(Сред(ИмяФайла, ПозицияСтрелки + 2)); ИмяФайла = СокрЛП(Сред(ИмяФайла, ПозицияСтрелки + 2));
ТипИзменения = ВариантИзмененийФайловGit.Добавлен; ТипИзменения = ВариантИзмененийФайловGit.Добавлен;
КонецЕсли; КонецЕсли;
ЖурналИзменений.Добавить(Новый Структура("ИмяФайла, ТипИзменения", ИмяФайла, ТипИзменения)); ЖурналИзменений.Добавить(Новый Структура("ИмяФайла, ТипИзменения", ИмяФайла, ТипИзменения));
@ -167,36 +168,82 @@
КонецФункции КонецФункции
Процедура ЗагрузитьСценарииОбработки(ТекущийКаталогСценариев) Процедура ЗагрузитьСценарииОбработки(ТекущийКаталогСценариев, УправлениеНастройками, КаталогРепозитория)
СценарииОбработки = Новый Массив; СценарииОбработки = Новый Массив;
ФайлыСценариев = НайтиФайлы(ТекущийКаталогСценариев, "*.os"); ФайлыГлобальныхСценариев = НайтиФайлы(ТекущийКаталогСценариев, "*.os");
Для Каждого ФайлСценария Из ФайлыСценариев Цикл ФайлыЛокальныхСценариев = Новый Массив;
ИменаЗагружаемыхСценариев = Новый Массив;
Если НЕ УправлениеНастройками.ЭтоНовый() Тогда
Если СтрСравнить(ФайлСценария.ИмяБезРасширения, "ШаблонСценария") = 0 Тогда Лог.Информация("Читаем настройки");
ИменаЗагружаемыхСценариев = УправлениеНастройками.Настройка("Precommt4onecСценарии\ГлобальныеСценарии");
Продолжить; Если УправлениеНастройками.Настройка("Precommt4onecСценарии\ИспользоватьСценарииРепозитория") Тогда
ЛокальныйКаталог = УправлениеНастройками.Настройка("Precommt4onecСценарии\КаталогЛокальныхСценариев");
ПутьКЛокальнымСценариям = ОбъединитьПути(КаталогРепозитория, ЛокальныйКаталог);
ФайлПутьКЛокальнымСценариям = Новый Файл(ПутьКЛокальнымСценариям);
Если Не ФайлПутьКЛокальнымСценариям.Существует() ИЛИ ФайлПутьКЛокальнымСценариям.ЭтоФайл() Тогда
Лог.Ошибка("Сценарии из репозитория не загружены т.к. отсутствует каталог %1", ЛокальныйКаталог);
Иначе
ФайлыЛокальныхСценариев = НайтиФайлы(ФайлПутьКЛокальнымСценариям.ПолноеИмя, "*.os");
КонецЕсли;
КонецЕсли; КонецЕсли;
Попытка КонецЕсли;
СценарийОбработки = ЗагрузитьСценарий(ФайлСценария.ПолноеИмя);
СценарииОбработки.Добавить(Новый Структура("ИмяСценария, Сценарий", СценарийОбработки.ИмяСценария(), СценарийОбработки));
Исключение ЗагрузитьСценарииИзКаталога(СценарииОбработки, ФайлыГлобальныхСценариев, ИменаЗагружаемыхСценариев);
ЗагрузитьСценарииИзКаталога(СценарииОбработки, ФайлыЛокальныхСценариев);
Лог.Ошибка("Ошибка загрузки сценария %1: %2", ФайлСценария.ПолноеИмя, ОписаниеОшибки());
Продолжить;
КонецПопытки;
КонецЦикла;
Если СценарииОбработки.Количество() = 0 Тогда Если СценарииОбработки.Количество() = 0 Тогда
ВызватьИсключение "Нет доступных сценариев обработки файлов"; ВызватьИсключение "Нет доступных сценариев обработки файлов";
КонецЕсли; КонецЕсли;
КонецПроцедуры КонецПроцедуры
Процедура ЗагрузитьСценарииИзКаталога(СценарииОбработки, ФайлыСценариев, Знач ИменаЗагружаемыхСценариев = Неопределено)
Если ИменаЗагружаемыхСценариев = Неопределено Тогда
ИменаЗагружаемыхСценариев = Новый Массив;
КонецЕсли;
Для Каждого ФайлСценария Из ФайлыСценариев Цикл
Если СтрСравнить(ФайлСценария.ИмяБезРасширения, "ШаблонСценария") = 0 Тогда
Продолжить;
КонецЕсли;
Если ИменаЗагружаемыхСценариев.Количество() И НЕ ИменаЗагружаемыхСценариев.Найти(ФайлСценария.Имя) Тогда
Продолжить;
КонецЕсли;
Попытка
СценарийОбработки = ЗагрузитьСценарий(ФайлСценария.ПолноеИмя);
СценарииОбработки.Добавить(Новый Структура("ИмяСценария, Сценарий", СценарийОбработки.ИмяСценария(), СценарийОбработки));
Исключение
Лог.Ошибка("Ошибка загрузки сценария %1: %2", ФайлСценария.ПолноеИмя, ОписаниеОшибки());
Продолжить;
КонецПопытки;
КонецЦикла;
КонецПроцедуры

View File

@ -1,7 +1,7 @@
{ {
"Precommt4onecСценарии": { "Precommt4onecСценарии": {
"ИспользоватьСценарииРепозитория": true, "ИспользоватьСценарииРепозитория": false,
"КаталогЛокальныхСценариев": "src\\d", "КаталогЛокальныхСценариев": "",
"ГлобальныеСценарии": [ "ГлобальныеСценарии": [
"РазборОбычныхФормНаИсходники.os", "РазборОбычныхФормНаИсходники.os",
"РазборОтчетовОбработокРасширений.os" "РазборОтчетовОбработокРасширений.os"