diff --git a/features/step_definitions/precommitonec_feature.os b/features/step_definitions/precommitonec_feature.os index 3bf0d9b..5d8533e 100644 --- a/features/step_definitions/precommitonec_feature.os +++ b/features/step_definitions/precommitonec_feature.os @@ -21,6 +21,7 @@ ВсеШаги.Добавить("УФайлаЕстьМетка"); ВсеШаги.Добавить("СодержимоеФайлаИФайлаРазное"); ВсеШаги.Добавить("ЯСоздаюНовыйРепозиторийБезИнициализацииВКаталогеИЗапоминаюЕгоКак"); + ВсеШаги.Добавить("ЯСоздаюФайлВКодировкеСТекстом"); Возврат ВсеШаги; КонецФункции @@ -146,6 +147,15 @@ КонецПроцедуры + +//Я создаю файл "СпециальныйКаталог/ФайлСТекстом.txt" в кодировке "cp866" с текстом "текст178" +Процедура ЯСоздаюФайлВКодировкеСТекстом(Знач ПутьФайла, Знач Кодировка, Знач ТекстФайла) Экспорт + ПутьФайла = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьФайла); + ЗаписьТекста = Новый ЗаписьТекста(ПутьФайла, Кодировка); + ЗаписьТекста.ЗаписатьСтроку(ТекстФайла); + ЗаписьТекста.Закрыть(); +КонецПроцедуры + Функция ИнициализироватьРепозиторий(РепозиторийGit, ИмяРепозитория, АлиасКаталога) КаталогРепозиториев = БДД.ПолучитьИзКонтекста(АлиасКаталога); diff --git a/features/ИнтерактивнаяНастройка.feature b/features/ИнтерактивнаяНастройка.feature new file mode 100644 index 0000000..2989e59 --- /dev/null +++ b/features/ИнтерактивнаяНастройка.feature @@ -0,0 +1,85 @@ +# language: ru + +Функциональность: Настройка конфигурации прекоммита + +Как разработчик +Я хочу иметь возможность изменять настройки precommit4onec +Чтобы автоматически выполнять обработку исходников перед фиксацией изменений в репозитории + +Контекст: + Допустим Я очищаю параметры команды "oscript" в контексте + И я очищаю параметры команды "git" в контексте + И Я устанавливаю кодировку вывода "utf-8" команды "git" + И я включаю отладку лога с именем "oscript.app.precommit4onec" + И я создаю временный каталог и запоминаю его как "КаталогРепозиториев" + И я переключаюсь во временный каталог "КаталогРепозиториев" + И я создаю новый репозиторий без инициализации "rep1" в каталоге "КаталогРепозиториев" и запоминаю его как "РабочийКаталог" + # И я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os install rep1" + И я установил рабочий каталог как текущий каталог + +Сценарий: Настройки глобальных сценариев + Когда Я создаю файл "answers.txt" в кодировке "cp866" с текстом + """ +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +local +n + """ + Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os configure -rep-path .\ -config < answers.txt" + Тогда Код возврата команды "oscript" равен 0 + И Я сообщаю вывод команды "oscript" + И Файл "v8config.json" содержит + """ + "ИспользоватьСценарииРепозитория": true, + "КаталогЛокальныхСценариев": "local", + "ГлобальныеСценарии": [ + "ДобавлениеПробеловПередКлючевымиСловами.os", + "ЗапретИспользованияПерейти.os", + "ИсправлениеНеКаноническогоНаписания.os", + "КорректировкаXMLФорм.os", + "ОтключениеПолнотекстовогоПоиска.os", + "ПроверкаДублейПроцедурИФункций.os", + "ПроверкаКорректностиОбластей.os", + "РазборОбычныхФормНаИсходники.os", + "РазборОтчетовОбработокРасширений.os", + "СинхронизацияОбъектовМетаданныхИФайлов.os", + "СортировкаДереваМетаданных.os", + "УдалениеДублейМетаданных.os", + "УдалениеЛишнихКонцевыхПробелов.os", + "УдалениеЛишнихПустыхСтрок.os" + ], + """ + +Сценарий: Настройки подпроекта + Когда Я создаю файл "answers.txt" в кодировке "cp866" с текстом + """ +n +n +n +y +tests +n +n +n +n + """ + И Я создаю каталог "tests" в рабочем каталоге + Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os configure -rep-path .\ -config < answers.txt" + И Я сообщаю вывод команды "oscript" + Тогда Код возврата команды "oscript" равен 0 + И Файл "v8config.json" содержит "tests\\" + diff --git a/src/Классы/КомандаКонфигуратион.os b/src/Классы/КомандаКонфигуратион.os index 9dd1446..ba3e363 100644 --- a/src/Классы/КомандаКонфигуратион.os +++ b/src/Классы/КомандаКонфигуратион.os @@ -69,6 +69,9 @@ ИначеЕсли ПараметрыКоманды["-config"] Тогда + НастройкиПроектов = Новый Соответствие(); + БазовыеНастройки = Неопределено; + Если ЗначениеЗаполнено(ПараметрыКоманды["-child-path"]) Тогда УказанныйПуть = ПараметрыКоманды["-child-path"]; @@ -76,21 +79,20 @@ Если ПроверитьАдресДополнительногоКаталога(КаталогРепозитория, УказанныйПуть, УправлениеНастройками) Тогда УказанныйПуть = ФайловыеОперации.ПолучитьНормализованныйОтносительныйПуть(КаталогРепозитория, УказанныйПуть); - НовыеНастройки = ИнтерактивнаяНастройка(УказанныйПуть, УправлениеНастройками, Ложь, Приложение.КаталогСценариев(), Истина); - УправлениеНастройками.ОбновитьКонфигурацию(); - УправлениеНастройками.ЗаписатьНастройкиПриложения(УказанныйПуть, НовыеНастройки.Получить(УказанныйПуть)); + НовыеНастройки = ИнтерактивнаяНастройка(УказанныйПуть, Ложь, Приложение.КаталогСценариев()); + НастройкиПроектов.Вставить(УказанныйПуть, НовыеНастройки); КонецЕсли; Иначе - НовыеНастройки = ИнтерактивнаяНастройка(КаталогРепозитория, УправлениеНастройками, РаботаСГлобальнымиНастройками, Приложение.КаталогСценариев()); - СконфигурироватьДополнительныеКаталоги(УправлениеНастройками, НовыеНастройки, Приложение.КаталогСценариев(), КаталогРепозитория); - РедакторНастроек.СброситьНастройкиРепозитория(); - РедакторНастроек.ЗаписатьНастройкиРепозитория(НовыеНастройки); + БазовыеНастройки = ИнтерактивнаяНастройка(КаталогРепозитория, РаботаСГлобальнымиНастройками, Приложение.КаталогСценариев()); + СконфигурироватьДополнительныеКаталоги(УправлениеНастройками, НастройкиПроектов, Приложение.КаталогСценариев(), КаталогРепозитория); КонецЕсли; - + + РедакторНастроек.ОбновитьНастройки(БазовыеНастройки, НастройкиПроектов); + Иначе НапечататьНастройки(УправлениеНастройками); @@ -193,9 +195,11 @@ КонецПроцедуры -Функция ИнтерактивнаяНастройка(КаталогРепозитория, УправлениеНастройками, ГлобальныеНастройки, КаталогГлобальныхСценариев, ЭтоДопПроект = Ложь) +Функция ИнтерактивнаяНастройка(КаталогРепозитория, ГлобальныеНастройки, КаталогГлобальныхСценариев) - ИмяПриложения = УправлениеНастройками.ИмяПоУмолчанию(); + УправлениеНастройками = МенеджерНастроек.Настройки(); + + ИмяПриложения = МенеджерНастроек.КлючНастройкиPrecommit(); ПолныеНастройки = Новый Соответствие; Сообщить(СтрШаблон("Настройка конфигурации precommit %1%2", Символы.ПС, КаталогРепозитория)); @@ -255,7 +259,7 @@ Лог.Отладка("Итоговый список исполняемых сценариев: %1%2", Символы.ПС, СтрСоединить(ИсполняемыеСценарии, Символы.ПС)); - НастройкиСценариев = СценарииОбработки.СформироватьНастройкиСценариев(ИсполняемыеСценарии, КаталогГлобальныхСценариев); + НастройкиСценариев = СценарииОбработки.НастройкиСценариев(ИсполняемыеСценарии, КаталогГлобальныхСценариев); НастройкиПриложения.Вставить("ИспользоватьСценарииРепозитория", ИспользоватьСценарииРепозитория); НастройкиПриложения.Вставить("КаталогЛокальныхСценариев", КаталогЛокальныхСценариев); @@ -277,28 +281,22 @@ НастройкиПриложения.Вставить("НастройкиСценариев", НастройкиСценариев); - Если ЭтоДопПроект Тогда - НастройкиКаталога = Новый Соответствие; - ПолныеНастройки.Вставить(КаталогРепозитория, НастройкиПриложения); - КонецЕсли; - - ПолныеНастройки.Вставить(ИмяПриложения, НастройкиПриложения); - - Возврат ПолныеНастройки; + Возврат НастройкиПриложения; КонецФункции -Процедура СконфигурироватьДополнительныеКаталоги(УправлениеНастройками, ОсновныеНастройки, КаталогГлобальныхСценариев, КаталогРепозитория) - +Процедура СконфигурироватьДополнительныеКаталоги(УправлениеНастройками, НастройкиПроектов, КаталогГлобальныхСценариев, КаталогРепозитория) + Пока ИнтерактивныйРедактор.ПолучитьНастройкуБулево("Сконфигурировать дополнительный каталог со своими правилами обработки?", Ложь) Цикл АдресКаталога = ИнтерактивныйРедактор.ПолучитьНастройкуСтрока("Введите относительный путь в репозитории к каталогу", ""); Если ПроверитьАдресДополнительногоКаталога(КаталогРепозитория, АдресКаталога, УправлениеНастройками) Тогда - АдресКаталога = ФайловыеОперации.ПолучитьНормализованныйОтносительныйПуть(КаталогРепозитория, АдресКаталога); - НастройкиДополнительные = ИнтерактивнаяНастройка(АдресКаталога, УправлениеНастройками, Ложь, КаталогГлобальныхСценариев, Истина); - ОсновныеНастройки.Вставить(АдресКаталога, НастройкиДополнительные.Получить(АдресКаталога)); + АдресКаталога = МенеджерНастроек.НормализованноеИмяПроекта(АдресКаталога); + НастройкиПроекта = ИнтерактивнаяНастройка(АдресКаталога, Ложь, КаталогГлобальныхСценариев); + + НастройкиПроектов.Вставить(АдресКаталога, НастройкиПроекта); КонецЕсли; diff --git a/src/Классы/НастройкиРепозитория.os b/src/Классы/НастройкиРепозитория.os index 4c09888..22c5e24 100644 --- a/src/Классы/НастройкиРепозитория.os +++ b/src/Классы/НастройкиРепозитория.os @@ -221,21 +221,9 @@ Запись.Закрыть(); НовыйКонфиг = Ложь; - + КонецПроцедуры // ОбновитьКонфигурационныйФайл() -Функция ИмяПоУмолчанию() Экспорт - - Возврат "Precommt4onecСценарии"; - -КонецФункции - -Функция ИмяБазовойНастройки() Экспорт - - Возврат "General"; - -КонецФункции - /////////////////////////////////////////////////////////////////// // ПриСозданииОбъекта @@ -289,18 +277,6 @@ КонецПроцедуры // ПриСозданииОбъекта() -Процедура ЗаписатьСтруктуруНастроек(Настройки) Экспорт - - ШаблонНастройки = "%1\%2"; - - Для Каждого Настройка Из Настройки Цикл - - ЗаписатьНастройку(СтрШаблон(ШаблонНастройки, ИмяПоУмолчанию(), Настройка.Ключ), Настройка.Значение); - - КонецЦикла; - -КонецПроцедуры - Процедура ОбновитьКонфигурацию() Экспорт ОбновлятьКонфигурацию = Истина; КонецПроцедуры \ No newline at end of file diff --git a/src/Модули/МенеджерНастроек.os b/src/Модули/МенеджерНастроек.os index a0229ee..f3fc4e9 100644 --- a/src/Модули/МенеджерНастроек.os +++ b/src/Модули/МенеджерНастроек.os @@ -225,6 +225,25 @@ КонецФункции +Процедура УдалитьПроекты() Экспорт + + ЗначениеНастройки("").Удалить(КлючПроекты()); // Удаляем ветку "Проекты" из корня настроек прекоммит + +КонецПроцедуры + +Процедура УдалитьПроект(Подпроект) Экспорт + + ИмяПроекта = ИмяПроектаДляФайла(Подпроект); + + Если НЕ ЗначениеЗаполнено(ИмяПроекта) ИЛИ СтрДлина(ИмяПроекта) <> СтрДлина(Подпроект) Тогда + МенеджерПриложения.ПолучитьЛог().Предупреждение("Не найден проект %1", Подпроект); + Возврат; + КонецЕсли; + + ЗначениеНастройки(КлючПроекты()).Удалить(ИмяПроекта); + +КонецПроцедуры + #КонецОбласти Функция ЭтоНовый() Экспорт @@ -251,25 +270,6 @@ КонецПроцедуры -Процедура УдалитьПроекты() Экспорт - - ЗначениеНастройки("").Удалить(КлючПроекты()); // Удаляем ветку "Проекты" из корня настроек прекоммит - -КонецПроцедуры - -Процедура УдалитьПроект(Подпроект) Экспорт - - ИмяПроекта = ИмяПроектаДляФайла(Подпроект); - - Если НЕ ЗначениеЗаполнено(ИмяПроекта) ИЛИ СтрДлина(ИмяПроекта) <> СтрДлина(Подпроект) Тогда - МенеджерПриложения.ПолучитьЛог().Предупреждение("Не найден проект %1", Подпроект); - Возврат; - КонецЕсли; - - ЗначениеНастройки(КлючПроекты()).Удалить(ИмяПроекта); - -КонецПроцедуры - /////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ФУНКЦИОНАЛ /////////////////////////////////////////////////////////////////// diff --git a/src/Модули/РедакторНастроек.os b/src/Модули/РедакторНастроек.os index 4483fc8..6a3530e 100644 --- a/src/Модули/РедакторНастроек.os +++ b/src/Модули/РедакторНастроек.os @@ -71,4 +71,47 @@ УправлениеНастройками.ЗаписатьНастройкиПриложения(НоваяНастройка.Ключ, НоваяНастройка.Значение); КонецЦикла; +КонецПроцедуры + +Процедура ОбновитьНастройки(БазовыеНастройки, НастройкиПроектов) Экспорт + + Лог = МенеджерПриложения.ПолучитьЛог(); + + Лог.Отладка("Обновление настроек"); + КлючПроекты = МенеджерНастроек.КлючПроекты(); + + Если БазовыеНастройки = Неопределено Тогда + + БазовыеНастройки = МенеджерНастроек.НастройкиПроекта(""); + + Иначе + + БазовыеНастройки.Вставить(КлючПроекты, Новый Соответствие()); + + Для Каждого ИмяПроекта Из МенеджерНастроек.ПроектыКонфигурации() Цикл + + БазовыеНастройки[КлючПроекты].Вставить(ИмяПроекта, МенеджерНастроек.НастройкиПроекта(ИмяПроекта)); + + КонецЦикла; + + КонецЕсли; + + Если ЗначениеЗаполнено(НастройкиПроектов) Тогда + + Если БазовыеНастройки[КлючПроекты] = Неопределено Тогда + + БазовыеНастройки.Вставить(КлючПроекты, Новый Соответствие()); + + КонецЕсли; + + Для Каждого Элемент Из НастройкиПроектов Цикл + + БазовыеНастройки[КлючПроекты].Вставить(Элемент.Ключ, Элемент.Значение); + + КонецЦикла; + + КонецЕсли; + + МенеджерНастроек.Настройки().ЗаписатьНастройкиПриложения(МенеджерНастроек.КлючНастройкиPrecommit(), БазовыеНастройки); + КонецПроцедуры \ No newline at end of file