1
0
mirror of https://github.com/bia-technologies/precommit4onec.git synced 2025-01-03 22:52:10 +02:00

Добавлена возможность настройки precommit

This commit is contained in:
Maxmov Valery 2017-09-15 17:30:03 +03:00
parent 58155e742e
commit 2741785217
6 changed files with 590 additions and 5 deletions

View File

@ -0,0 +1,266 @@
///////////////////////////////////////////////////////////////////////////////
//
// Служебный модуль с реализацией работы команды <configuration>
//
// (с) BIA Technologies, LLC
//
///////////////////////////////////////////////////////////////////////////////
#Использовать gitrunner
Перем Лог;
///////////////////////////////////////////////////////////////////////////////
Процедура НастроитьКоманду(Знач Команда, Знач Парсер) Экспорт
// Добавление параметров команды
Парсер.ДобавитьПараметрФлагКоманды(Команда, "-global", "Работа с глобальными настройками.");
// TODO: пока оция не используется Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-rep-path", "Каталог репозитория, настройки которого интересуют.");
Парсер.ДобавитьПараметрФлагКоманды(Команда, "-reset", "Сброс настроек на значения по умолчанию. Если редактируются настройки репозитория, то происходит удаление файла настроек.");
Парсер.ДобавитьПараметрФлагКоманды(Команда, "-config", "Интерактивное конфигурирование настроек.");
КонецПроцедуры // НастроитьКоманду
// Выполняет логику команды
//
// Параметры:
// ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений
// Приложение - Модуль - Модуль менеджера приложения
//
Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач Приложение) Экспорт
Лог = Приложение.ПолучитьЛог();
Если НЕ ПараметрыКоманды["-global"] Тогда
// TODO: Пока не используется И НЕ ЗначениеЗаполнено(ПараметрыКоманды["-rep-path"]) Тогда
// TODO: пока не используется Лог.Ошибка("Для конфгурирования необходимо передать флаг -global или указать каталог репозитория параметром -rep-path");
Лог.Ошибка("Для конфгурирования необходимо передать флаг -global");
Возврат Приложение.РезультатыКоманд().НеверныеПараметры;
КонецЕсли;
Если ПараметрыКоманды["-global"] Тогда
КаталогРепозитория = Приложение.ПутьКРодительскомуКаталогу();
Иначе
КаталогРепозитория = ПараметрыКоманды["-rep-path"];
КонецЕсли;
УправлениеНастройками = Новый НастройкиРепозитория(КаталогРепозитория);
Если ПараметрыКоманды["-reset"] Тогда
Если ПараметрыКоманды["-global"] Тогда
ЗаписатьГлобальныеНастройкиПоУмолчанию(УправлениеНастройками, Приложение.КаталогСценариев());
Иначе
СброситьНастройкиРепозитория(УправлениеНастройками);
КонецЕсли;
ИначеЕсли ПараметрыКоманды["-config"] Тогда
ИнтерактивнаяНастройка(КаталогРепозитория, УправлениеНастройками, ПараметрыКоманды["-global"], Приложение.КаталогСценариев());
Иначе
НапечататьНастройки(УправлениеНастройками);
КонецЕсли;
// При успешном выполнении возвращает код успеха
Возврат Приложение.РезультатыКоманд().Успех;
КонецФункции // ВыполнитьКоманду
Процедура НапечататьНастройки(УправлениеНастройками)
Если УправлениеНастройками.ЭтоНовый() Тогда
Лог.Информация("Файл настроек не обнаружен");
Возврат;
КонецЕсли;
НастройкиПрекоммита = УправлениеНастройками.НастройкиПриложения("Precommt4onecСценарии");
Если НЕ ЗначениеЗаполнено(НастройкиПрекоммита) Тогда
Лог.Информация("Настройки в файле отсутствуют");
Возврат;
КонецЕсли;
Сообщить("Установленные настройки: ");
Для Каждого НастройкаПрекоммита Из НастройкиПрекоммита Цикл
Если ТипЗнч(НастройкаПрекоммита.Значение) = Тип("Массив") Тогда
ЗначениеПараметра = СтрСоединить(НастройкаПрекоммита.Значение, ",");
Иначе
ЗначениеПараметра = НастройкаПрекоммита.Значение;
КонецЕсли;
Сообщить(Символы.Таб + НастройкаПрекоммита.Ключ + " = " + ЗначениеПараметра);
КонецЦикла;
КонецПроцедуры
Процедура ЗаписатьГлобальныеНастройкиПоУмолчанию(УправлениеНастройками, ТекущийКаталогСценариев)
ИмяПриложения = "Precommt4onecСценарии";
СброситьНастройкиРепозитория(УправлениеНастройками);
УправлениеНастройками.ЗаписатьНастройку(ИмяПриложения + "\ИспользоватьСценарииРепозитория", Ложь);
УправлениеНастройками.ЗаписатьНастройку(ИмяПриложения + "\КаталогЛокальныхСценариев", "");
ГлобальныеСценарии = ПолучитьИменаСценариев(ТекущийКаталогСценариев);
УправлениеНастройками.ЗаписатьНастройку(ИмяПриложения + "\ГлобальныеСценарии", ГлобальныеСценарии);
КонецПроцедуры
Процедура СброситьНастройкиРепозитория(УправлениеНастройками)
Если УправлениеНастройками.ЭтоНовый() Тогда
Возврат;
КонецЕсли;
ИмяПриложения = "Precommt4onecСценарии";
УправлениеНастройками.УдалитьНастройкиПриложения(ИмяПриложения);
КонецПроцедуры
Функция ПолучитьИменаСценариев(КаталогСценариев)
НайденныеСценарии = Новый Массив;
ФайлыСценариев = НайтиФайлы(КаталогСценариев, "*.os");
Для Каждого ФайлСценария Из ФайлыСценариев Цикл
Если СтрСравнить(ФайлСценария.ИмяБезРасширения, "ШаблонСценария") = 0 Тогда
Продолжить;
КонецЕсли;
НайденныеСценарии.Добавить(ФайлСценария.Имя);
КонецЦикла;
Возврат НайденныеСценарии;
КонецФункции
Процедура ИнтерактивнаяНастройка(КаталогРепозитория, УправлениеНастройками, ГлобальныеНастройки, КаталогГлобальныхСценариев)
Сообщить("Настройка конфигурации precommit");
Если ГлобальныеНастройки Тогда
ГлобальныеСценарии = ПолучитьНастройкуМассив("Выберите подключаемые глобальные сценарии: ", ПолучитьИменаСценариев(КаталогГлобальныхСценариев));
ИспользоватьСценарииРепозитория = ПолучитьНастройкуБулево("Нужно использовать сценарии локальных репозиториев?", ЛОЖЬ);
КаталогЛокальныхСценариев = "";
Если ИспользоватьСценарииРепозитория Тогда
КаталогЛокальныхСценариев = ПолучитьНастройкуСтрока("Укажите относительный путь к сценариям в репозитории: ");
КонецЕсли;
ИмяПриложения = "Precommt4onecСценарии";
СброситьНастройкиРепозитория(УправлениеНастройками);
УправлениеНастройками.ЗаписатьНастройку(ИмяПриложения + "\ИспользоватьСценарииРепозитория", ИспользоватьСценарииРепозитория);
УправлениеНастройками.ЗаписатьНастройку(ИмяПриложения + "\КаталогЛокальныхСценариев", КаталогЛокальныхСценариев);
УправлениеНастройками.ЗаписатьНастройку(ИмяПриложения + "\ГлобальныеСценарии", ГлобальныеСценарии);
Иначе
// todo
// пока нет, будет в будущем
КонецЕсли;
КонецПроцедуры
Функция ПолучитьНастройкуБулево(ТекстПодсказки, ЗначениеПоУмолчанию)
ВыбранноеЗначение = Формат(ЗначениеПоУмолчанию, "БЛ=n; БИ=y");
Пока ИСТИНА Цикл
Сообщить(ТекстПодсказки + " [" + Формат(ЗначениеПоУмолчанию, "БЛ=n; БИ=y") + "]. Введите y[es]/n[o]");
ВвестиСтроку(ВыбранноеЗначение);
Если СтрНайти("yY", ВыбранноеЗначение) Тогда
ВыбранноеЗначение = ИСТИНА;
Прервать;
ИначеЕсли СтрНайти("nN", ВыбранноеЗначение) Тогда
ВыбранноеЗначение = ЛОЖЬ;
Прервать;
ИначеЕсли ВыбранноеЗначение = Символы.ПС Тогда
ВыбранноеЗначение = ИСТИНА;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат ВыбранноеЗначение;
КонецФункции
Функция ПолучитьНастройкуМассив(ТекстПодсказки, ДоступныйМассив)
Сообщить(ТекстПодсказки);
ВыбранныеЭлементы = Новый Массив;
Для Ит = 0 По ДоступныйМассив.Количество() - 1 Цикл
ЗначениеМассива = ДоступныйМассив[Ит];
ТекстПодсказкиМассив = Символы.Таб + ЗначениеМассива;
Если ПолучитьНастройкуБулево(ТекстПодсказкиМассив, ИСТИНА) Тогда
ВыбранныеЭлементы.Добавить(ЗначениеМассива);
КонецЕсли;
КонецЦикла;
Возврат ВыбранныеЭлементы;
КонецФункции
Функция ПолучитьНастройкуСтрока(ТекстПодсказки)
ВыбранноеЗначение = "";
Пока Истина Цикл
Сообщить(ТекстПодсказки);
ВвестиСтроку(ВыбранноеЗначение);
ВыбранноеЗначение = СокрЛП(ВыбранноеЗначение);
Если Не ПустаяСтрока(ВыбранноеЗначение) Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Возврат ВыбранноеЗначение;
КонецФункции

View File

@ -32,7 +32,7 @@
Лог = Приложение.ПолучитьЛог();
ЗагрузитьСценарииОбработки();
ЗагрузитьСценарииОбработки(Приложение.КаталогСценариев());
КаталогРепозитория = ПараметрыКоманды["КаталогРепозитория"];
ФайлКаталогРепозитория = Новый Файл(КаталогРепозитория);
@ -167,10 +167,10 @@
КонецФункции
Процедура ЗагрузитьСценарииОбработки()
Процедура ЗагрузитьСценарииОбработки(ТекущийКаталогСценариев)
СценарииОбработки = Новый Массив;
ФайлыСценариев = НайтиФайлы(ОбъединитьПути(ТекущийСценарий().Каталог, "..", "СценарииОбработки"), "*.os");
ФайлыСценариев = НайтиФайлы(ТекущийКаталогСценариев, "*.os");
Для Каждого ФайлСценария Из ФайлыСценариев Цикл
Если СтрСравнить(ФайлСценария.ИмяБезРасширения, "ШаблонСценария") = 0 Тогда

View File

@ -0,0 +1,269 @@
///////////////////////////////////////////////////////////////////
//
// Работает с настройками в конфигурационном файле репозитория 1С
// в Git
//
// (с) BIA Technologies, LLC
//
///////////////////////////////////////////////////////////////////
#Использовать json
///////////////////////////////////////////////////////////////////
Перем ИнициализацияВыпонена; // содержит признак инициализации репозитория
Перем НовыйКонфиг; // содержит признак нового конфига
Перем Конфигурация; // описание конфигурации
Перем АдресКонфигурационногоФайла; // адрес нахождения конфигурационного файла
Перем ОбновлятьКонфигурацию; // флаг необходимости обновления конфигурации / затирания
///////////////////////////////////////////////////////////////////
// Программный интерфейс
///////////////////////////////////////////////////////////////////
// ЭтоНовый
// Возвращает признак нового конфига, т.е. отсутствие файла
//
// Возвращаемое значение:
// Булево - Признак отсутствия файла
//
Функция ЭтоНовый() Экспорт
Возврат НовыйКонфиг;
КонецФункции // ЭтоНовый()
// ГлобальныеНастройки
// Возврает набор глобальных настроек
//
// Возвращаемое значение:
// Соответствие - Набор глобальных настроек при их наличии, если настроек нет то будет возвращено пустое соответствие
//
Функция ГлобальныеНастройки() Экспорт
ПроверкаИницализации();
Возврат НастройкиПриложения("GLOBAL");
КонецФункции // ГлобальныеНастройки() Экспорт
// НастройкиПриложения
// Возврает набор настроек для приложения
//
// Параметры:
// ИмяПриложения - Строка - Имя приложения
//
// Возвращаемое значение:
// Соответствие - Набор гнастроек при их наличии, если настроек нет то будет возвращено пустое соответствие
//
Функция НастройкиПриложения(ИмяПриложения) Экспорт
ПроверкаИницализации();
Если ПустаяСтрока(ИмяПриложения) Тогда
ВызватьИсключение "Не указано имя приложения";
КонецЕсли;
ИскомыеНастройки = Конфигурация.Получить(ИмяПриложения);
Если ИскомыеНастройки = Неопределено Тогда
ИскомыеНастройки = Новый Соответствие;
КонецЕсли;
Возврат ИскомыеНастройки;
КонецФункции // НастройкиПриложения()
// Настройка
// Возвращает значение искомой настройки
//
// Параметры:
// ИмяНастройки - Строка - Имя искомой настройки. Возможные форматы
// - "МояНастройка" - для чтения глобальной настройки
// - "МоеПриложение\МояНастройка" - для чтения настройки приложения
//
// Возвращаемое значение:
// Произвольный - Значение настройки
//
Функция Настройка(ИмяНастройки)Экспорт
ПроверкаИницализации();
РазложенноеИмяНастройки = РазобратьИмяНастройки(ИмяНастройки);
ИскомоеПриложение = НастройкиПриложения(РазложенноеИмяНастройки.ИмяПриложения);
Возврат ИскомоеПриложение.Получить(РазложенноеИмяНастройки.ИмяНастройки);
КонецФункции // Настройка(ИмяНастройки)
// ЗаписатьНастройку
// Записывает настройку в конфигурационный файл
//
// Параметры:
// ИмяНастройки - Строка - Имя искомой настройки. Возможные форматы
// - "МояНастройка" - для чтения глобальной настройки
// - "МоеПриложение\МояНастройка" - для чтения настройки приложения
//
// Значение - Произвольный - Значение настройки, сериализуемое в JSON
//
Процедура ЗаписатьНастройку(ИмяНастройки, Значение) Экспорт
ПроверкаИницализации();
РазложенноеИмяНастройки = РазобратьИмяНастройки(ИмяНастройки);
ИскомоеПриложение = НастройкиПриложения(РазложенноеИмяНастройки.ИмяПриложения);
Если ОбновлятьКонфигурацию ИЛИ ИскомоеПриложение.Получить(РазложенноеИмяНастройки.ИмяНастройки) = Неопределено Тогда
ИскомоеПриложение.Вставить(РазложенноеИмяНастройки.ИмяНастройки, Значение);
КонецЕсли;
Конфигурация.Вставить(РазложенноеИмяНастройки.ИмяПриложения, ИскомоеПриложение);
ОбновитьКонфигурационныйФайл();
КонецПроцедуры // ЗаписатьНастройку(ИмяНастройки, Значение)
// ЗаписатьНастройкиПриложения
// Записывает набор настроек приложения
//
// Параметры:
// ИмяПриложения - Строка - Имя приложения
// Значение - Соответствие - Набор настроек приложения
//
Процедура ЗаписатьНастройкиПриложения(ИмяПриложения, Значение) Экспорт
ПроверкаИницализации();
Если ПустаяСтрока(ИмяПриложения) Тогда
ВызватьИсключение "Не указано имя приложения";
КонецЕсли;
Если ТипЗнч(Значение) <> Тип("Соответствие") Тогда
ВызватьИсключение "Тип значения должен быть Соответствие";
КонецЕсли;
Конфигурация.Вставить(ИмяПриложения, Значение);
ОбновитьКонфигурационныйФайл();
КонецПроцедуры // ЗаписатьНастройкиПриложения()
// УдалитьНастройкиПриложения
// Удаляет набор набор настроек приложения
//
// Параметры:
// ИмяПриложения - Строка - Имя приложения
//
Процедура УдалитьНастройкиПриложения(ИмяПриложения) Экспорт
ПроверкаИницализации();
Если ПустаяСтрока(ИмяПриложения) Тогда
ВызватьИсключение "Не указано имя приложения";
КонецЕсли;
Конфигурация.Удалить(ИмяПриложения);
ОбновитьКонфигурационныйФайл();
КонецПроцедуры // УдалитьНастройкиПриложения()
///////////////////////////////////////////////////////////////////
// Служебный функционал
///////////////////////////////////////////////////////////////////
Функция ПроверкаИницализации()
Если Не ИнициализацияВыпонена Тогда
ВызватьИсключение "Необходимо выполнить инициализацию"
КонецЕсли;
КонецФункции // ПроверкаИницализации()
Функция РазобратьИмяНастройки(Знач ИмяНастройки)
Если ПустаяСтрока(ИмяНастройки) Тогда
ВызватьИсключение "Не передано имя настройки"
КонецЕсли;
ИмяПриложения = "GLOBAL";
ПозицияРазделителя = СтрНайти(ИмяНастройки, "\");
Если ПозицияРазделителя > 0 Тогда
ИмяПриложения = Лев(ИмяНастройки, ПозицияРазделителя - 1);
ИмяНастройки = Сред(ИмяНастройки, ПозицияРазделителя + 1);
КонецЕсли;
Возврат Новый Структура("ИмяПриложения, ИмяНастройки", ИмяПриложения, ИмяНастройки);
КонецФункции // РазобратьИмяНастройки()
Функция ОбновитьКонфигурационныйФайл()
ПарсерJSON = Новый ПарсерJSON;
ТекстКонфигурации = ПарсерJSON.ЗаписатьJSON(Конфигурация);
Запись = Новый ЗаписьТекста(АдресКонфигурационногоФайла);
Запись.Записать(ТекстКонфигурации);
Запись.Закрыть();
НовыйКонфиг = ЛОЖЬ;
КонецФункции // ОбновитьКонфигурационныйФайл()
///////////////////////////////////////////////////////////////////
// ПриСозданииОбъекта
// Инициализирует объект при создании
//
// Параметры:
// КаталогРепозитория - Строка - Адрес каталога репозитория
// ОбновлятьКонф - Булево - флаг необходимости обновления конфигурации / затирания
//
Процедура ПриСозданииОбъекта(КаталогРепозитория, ОбновлятьКонф = ЛОЖЬ)
ИнициализацияВыпонена = ЛОЖЬ;
НовыйКонфиг = ЛОЖЬ;
Конфигурация = Неопределено;
АдресКонфигурационногоФайла = "";
ОбновлятьКонфигурацию = ?(ОбновлятьКонф = Неопределено, ЛОЖЬ, ОбновлятьКонф);
Файл = Новый Файл(КаталогРепозитория);
Если НЕ (Файл.Существует() И Файл.ЭтоКаталог()) Тогда
ВызватьИсключение "Каталог репозитория '" + КаталогРепозитория + "' не обнаружен либо это файл"
КонецЕсли;
АдресКонфигурационногоФайла = ОбъединитьПути(КаталогРепозитория, "v8config.json");
Файл = Новый Файл(АдресКонфигурационногоФайла);
Если Файл.Существует() Тогда
Чтение = Новый ЧтениеТекста(АдресКонфигурационногоФайла);
ТекстКонфигурации = Чтение.Прочитать();
Чтение.Закрыть();
ПарсерJSON = Новый ПарсерJSON;
Конфигурация = ПарсерJSON.ПрочитатьJSON(ТекстКонфигурации);
Иначе
НовыйКонфиг = ИСТИНА;
Конфигурация = Новый Соответствие;
КонецЕсли;
ИнициализацияВыпонена = ИСТИНА;
КонецПроцедуры // ПриСозданииОбъекта()

View File

@ -209,13 +209,27 @@
КонецФункции // ИмяПродукта
//Возвращает путь к исполняемому файлу
// Возвращает путь к исполняемому файлу
Функция ПутьКИсполняемомуФайлу() Экспорт
Возврат ОбъектНастроек.ПутьКИсполняемомуФайлу();
КонецФункции // ПутьКИсполняемомуФайлу
// Возвращает путь к каталогу основного скрипта
Функция ПутьКРодительскомуКаталогу() Экспорт
Возврат ОбъектНастроек.ПутьКРодительскомуКаталогу();
КонецФункции // ПутьКРодительскомуКаталогу
// Возвращает путь к каталогу сценариев
Функция КаталогСценариев() Экспорт
Возврат ОбъектНастроек.КаталогСценариев();
КонецФункции // КаталогСценариев
// Выводит справку по всем командам приложения
Процедура ВывестиСправкуПоКомандам() Экспорт

View File

@ -46,10 +46,35 @@
//
Функция ПутьКИсполняемомуФайлу() Экспорт
Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "..", "main.os");
Возврат ОбъединитьПути(ПутьКРодительскомуКаталогу(), "src", "main.os");
КонецФункции // ПутьКИсполняемомуФайлу
// ПутьКРодительскомуКаталогу
// Возвращает путь к каталогу основного скрипта
//
// Возвращаемое значение:
// Строка - Путь к каталогу основного скрипта
//
Функция ПутьКРодительскомуКаталогу() Экспорт
Файл = Новый Файл(ОбъединитьПути(ТекущийСценарий().Каталог, "..", ".."));
Возврат Файл.ПолноеИмя;
КонецФункции // ПутьКРодительскомуКаталогу
// КаталогСценариев
// Возвращает путь к каталогу сценариев
//
// Возвращаемое значение:
// Строка - Путь к каталогу сценариев
//
Функция КаталогСценариев() Экспорт
Возврат ОбъединитьПути(ПутьКРодительскомуКаталогу(), "src", "СценарииОбработки");
КонецФункции // КаталогСценариев
///////////////////////////////////////////////////////////////////////////////
// ЛОГИРОВАНИЕ
///////////////////////////////////////////////////////////////////////////////
@ -125,5 +150,6 @@
Приложение.ДобавитьКоманду(ИмяКомандыВерсия(), "КомандаVersion", "Выводит версию приложения");
Приложение.ДобавитьКоманду("precommit", "КомандаПрекоммит", "Выполняет сценарии precommit");
Приложение.ДобавитьКоманду("install", "КомандаИнсталл", "Выполняет подключение (установку) precommit hook'а в репозиторий");
Приложение.ДобавитьКоманду("configure", "КомандаКонфигуратион", "Выполняет настройку репозитория");
КонецПроцедуры // ПриРегистрацииКомандПриложения

10
v8config.json Normal file
View File

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