1
0
mirror of https://github.com/bia-technologies/precommit4onec.git synced 2025-01-18 02:58:35 +02:00

Merge branch 'release/1.21'

This commit is contained in:
Maxmov Valery 2020-02-21 19:25:36 +03:00
commit 4bbe82837b
35 changed files with 2980 additions and 680 deletions

4
.gitignore vendored
View File

@ -2,5 +2,5 @@ bdd-log.xml
*.ospx
*.orig
exec.log
.vscode
/tests.xml
.vscode/
/tests.xml

View File

@ -60,6 +60,10 @@ precommit4onec может читать настройки своей работ
Предоставляется возможность в репозитории иметь свои, отличные от глобальных, настройки. Для этого необходимо вместо флага `-global` в указанных выше командах передавать параметр `-rep-path` с указанием пути к каталогу репозитория.
Также можно настроить различное поведение для различных каталогов репозитория, для работы с подкаталогами (проектами) используется ключ `-child-path`.
Настройки проектов полностью переопределяют базовые настройки. Например если в основной настройки указаны `ОтключенныеСценарии`,
а для проекта `configuration\` они не заполнены, то для каталога `configuration` будут выполнены все сценарии.
Конфигурирование дает возможности:
- Изменить список сценариев обработки файлов
@ -67,6 +71,27 @@ precommit4onec может читать настройки своей работ
Некоторые сценарии поддерживают возможность изменения своих настроек со значений по умолчанию на установленные в конфигурационном файле. На данный момент реализована возможность указывать необходимую версию платформы 1С:Предприятие в сценарии `РазборОтчетОбработокРасширений`.
### Структура файла настроек
```JSON
{
"Precommt4onecСценарии": {
"ИспользоватьСценарииРепозитория": false, // Признак, выполнения проверок из репозитория
"КаталогЛокальныхСценариев": "", // Относительный путь к каталогу локальных проверок
"ГлобальныеСценарии": [...], // Список проверок, которые будут выполнятся
"ОтключенныеСценарии": [...], // Список проверок, которые не будут выполнятся (имеет больший приоритет относительно ГлобальныеСценарии)
"НастройкиСценариев": { // Настройки выполняемых проверок
...
},
"Проекты":{ // Настройки проектов (подкаталогов репозитория). Настройки проектов полностью переопределяют настройки и имеют такую же структуру
"configuration\\": { // Имя проекта (подкаталога)
"ИспользоватьСценарииРепозитория": false,
"ГлобальныеСценарии": []
}
}
}
}```
## Расширение функциональности
Для создания нового сценария обработки файлов необходимо воспользоваться шаблоном, находящимся в каталоге `СценарииОбработки` скрипта.

View File

@ -18,10 +18,10 @@
ВсеШаги.Добавить("ВКаталогеРепозиторияЕстьФайл");
ВсеШаги.Добавить("ЯКопируюФайлВКаталогРепозитория");
ВсеШаги.Добавить("ЯФиксируюИзмененияВРепозиторииСКомментарием");
ВсеШаги.Добавить("ЯУстанавливаюКодировкуВыводаКоманды");
ВсеШаги.Добавить("УФайлаЕстьМетка");
ВсеШаги.Добавить("СодержимоеФайлаИФайлаРазное");
ВсеШаги.Добавить("ЯСоздаюНовыйРепозиторийБезИнициализацииВКаталогеИЗапоминаюЕгоКак");
ВсеШаги.Добавить("ЯСоздаюФайлВКодировкеСТекстом");
Возврат ВсеШаги;
КонецФункции
@ -117,13 +117,6 @@
КонецПроцедуры
// я устанавливаю кодировку вывода "Кодировка" команды "ИмяКоманды"
Процедура ЯУстанавливаюКодировкуВыводаКоманды(Кодировка, ИмяКоманды) Экспорт
КлючКонтекста = КлючКоманды(ИмяКоманды);
Команда = БДД.ПолучитьИзКонтекста(КлючКонтекста);
Команда.УстановитьКодировкуВывода(Кодировка);
КонецПроцедуры
Функция КлючКоманды(Знач ИмяКоманды)
Возврат "Команда-" + ИмяКоманды;
КонецФункции
@ -154,6 +147,15 @@
КонецПроцедуры
//Я создаю файл "СпециальныйКаталог/ФайлСТекстом.txt" в кодировке "cp866" с текстом "текст178"
Процедура ЯСоздаюФайлВКодировкеСТекстом(Знач ПутьФайла, Знач Кодировка, Знач ТекстФайла) Экспорт
ПутьФайла = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьФайла);
ЗаписьТекста = Новый ЗаписьТекста(ПутьФайла, Кодировка);
ЗаписьТекста.ЗаписатьСтроку(ТекстФайла);
ЗаписьТекста.Закрыть();
КонецПроцедуры
Функция ИнициализироватьРепозиторий(РепозиторийGit, ИмяРепозитория, АлиасКаталога)
КаталогРепозиториев = БДД.ПолучитьИзКонтекста(АлиасКаталога);

View File

@ -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\\"

View File

@ -10,26 +10,38 @@
Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os configure -global"
Тогда Код возврата команды "oscript" равен 0
И Я сообщаю вывод команды "oscript"
И Вывод команды "oscript" содержит "precommit4onec v1.20.1"
И Вывод команды "oscript" содержит "precommit4onec v1.21"
И Вывод команды "oscript" содержит "Установленные настройки:"
И Вывод команды "oscript" содержит "ИспользоватьСценарииРепозитория ="
И Вывод команды "oscript" содержит "КаталогЛокальныхСценариев ="
И Вывод команды "oscript" содержит "ГлобальныеСценарии ="
И Вывод команды "oscript" содержит "НастройкиСценариев ="
Сценарий: Сброс настроек, не должен приводить к удалению других настроек
Когда я создаю временный каталог и запоминаю его как "КаталогРепозиториев"
И я переключаюсь во временный каталог "КаталогРепозиториев"
И я создаю новый репозиторий без инициализации "rep1" в каталоге "КаталогРепозиториев" и запоминаю его как "РабочийКаталог"
И я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os install rep1"
И я установил рабочий каталог как текущий каталог
И Я копирую файл "tests\fixtures\ХранениеРазныхНастроек\v8config.json" в каталог репозитория "rep1"
И я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os configure -rep-path . -reset"
Тогда Файл "v8config.json" в рабочем каталоге содержит "GLOBAL"
Сценарий: Сброс настроек к значениям по умолчанию
Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os configure -global -reset"
Тогда Код возврата команды "oscript" равен 0
И Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os configure -global"
И Код возврата команды "oscript" равен 0
И Я сообщаю вывод команды "oscript"
И Вывод команды "oscript" содержит
И Вывод команды "oscript" содержит
"""
precommit4onec v1.20.1
Установленные настройки: Precommt4onecСценарии
precommit4onec v1.21
Установленные настройки: Базовые настройки
ИспользоватьСценарииРепозитория = Нет
КаталогЛокальныхСценариев =
ГлобальныеСценарии = ДобавлениеПробеловПередКлючевымиСловами.os,ЗапретИспользованияПерейти.os,ИсправлениеНеКаноническогоНаписания.os,КорректировкаXMLФорм.os,ОтключениеПолнотекстовогоПоиска.os,ПроверкаДублейПроцедурИФункций.os,ПроверкаКорректностиОбластей.os,РазборОбычныхФормНаИсходники.os,РазборОтчетовОбработокРасширений.os,СинхронизацияОбъектовМетаданныхИФайлов.os,СортировкаДереваМетаданных.os,УдалениеДублейМетаданных.os,УдалениеЛишнихКонцевыхПробелов.os,УдалениеЛишнихПустыхСтрок.os
ОтключенныеСценарии =
НастройкиСценариев = Соответствие
ОтключениеПолнотекстовогоПоиска = Соответствие
МетаданныеДляИсключения = Соответствие

View File

@ -14,7 +14,7 @@
Сценарий: Получение версии продукта
Когда Я выполняю команду "oscript" с параметрами "src/main.os version"
Тогда Я сообщаю вывод команды "oscript"
И Вывод команды "oscript" содержит "1.20.1"
И Вывод команды "oscript" содержит "1.21"
И Вывод команды "oscript" не содержит "precommit4onec v"
И Код возврата команды "oscript" равен 0
@ -22,13 +22,14 @@
Когда Я выполняю команду "oscript" с параметрами "src/main.os help"
Тогда Вывод команды "oscript" содержит
"""
precommit4onec v1.20.1
precommit4onec v1.21
Возможные команды:
help - Выводит справку по командам
version - Выводит версию приложения
precommit - Выполняет сценарии precommit
install - Выполняет подключение (установку) precommit hook'а в репозиторий
configure - Выполняет настройку репозитория
help - Выводит справку по командам
version - Выводит версию приложения
precommit - Выполняет сценарии precommit
install - Выполняет подключение (установку) precommit hook'а в репозиторий
configure - Выполняет настройку репозитория
exec-rules - Выполняет указанные сценарии в каталоге репозитория принудительно, без обращения к git
"""
И Код возврата команды "oscript" равен 0
@ -36,12 +37,13 @@
Когда Я выполняю команду "oscript" с параметрами "src/main.os"
Тогда Вывод команды "oscript" содержит
"""
precommit4onec v1.20.1
precommit4onec v1.21
Возможные команды:
help - Выводит справку по командам
version - Выводит версию приложения
precommit - Выполняет сценарии precommit
install - Выполняет подключение (установку) precommit hook'а в репозиторий
configure - Выполняет настройку репозитория
help - Выводит справку по командам
version - Выводит версию приложения
precommit - Выполняет сценарии precommit
install - Выполняет подключение (установку) precommit hook'а в репозиторий
configure - Выполняет настройку репозитория
exec-rules - Выполняет указанные сценарии в каталоге репозитория принудительно, без обращения к git
"""
И Код возврата команды "oscript" равен 5

View File

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

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

@ -40,58 +40,62 @@
Возврат Приложение.РезультатыКоманд().НеверныеПараметры;
КонецЕсли;
РаботаСГлобальнымиНастройками = ПараметрыКоманды["-global"];
Если ПараметрыКоманды["-global"] Тогда
Если РаботаСГлобальнымиНастройками Тогда
КаталогРепозитория = Приложение.ПутьКРодительскомуКаталогу();
МенеджерНастроек.ГлобальныеНастройки();
Иначе
КаталогРепозитория = ПараметрыКоманды["-rep-path"];
МенеджерНастроек.НастройкиРепозитория(КаталогРепозитория, Ложь);
КонецЕсли;
УправлениеНастройками = Новый НастройкиРепозитория(КаталогРепозитория);
Если ПараметрыКоманды["-reset"] Тогда
Если ПараметрыКоманды["-global"] Тогда
Если РаботаСГлобальнымиНастройками Тогда
ЗаписатьГлобальныеНастройкиПоУмолчанию(УправлениеНастройками, Приложение.КаталогСценариев());
РедакторНастроек.СброситьГлобальныеНастройки();
Иначе
СброситьНастройкиРепозитория(УправлениеНастройками, ПараметрыКоманды["-child"], ПараметрыКоманды["-child-path"], КаталогРепозитория);
РедакторНастроек.СброситьНастройкиРепозитория(ПараметрыКоманды["-child"], ПараметрыКоманды["-child-path"]);
КонецЕсли;
ИначеЕсли ПараметрыКоманды["-config"] Тогда
НастройкиПроектов = Новый Соответствие();
БазовыеНастройки = Неопределено;
Если ЗначениеЗаполнено(ПараметрыКоманды["-child-path"]) Тогда
УказанныйПуть = ПараметрыКоманды["-child-path"];
Если ПроверитьАдресДополнительногоКаталога(КаталогРепозитория, УказанныйПуть, УправлениеНастройками) Тогда
Если ПроверитьАдресДополнительногоКаталога(КаталогРепозитория, УказанныйПуть) Тогда
УказанныйПуть = ФайловыеОперации.ПолучитьНормализованныйОтносительныйПуть(КаталогРепозитория, УказанныйПуть);
НовыеНастройки = ИнтерактивнаяНастройка(УказанныйПуть, УправлениеНастройками, Ложь, Приложение.КаталогСценариев(), Истина);
УправлениеНастройками.ОбновитьКонфигурацию();
УправлениеНастройками.ЗаписатьНастройкиПриложения(УказанныйПуть, НовыеНастройки.Получить(УказанныйПуть));
НовыеНастройки = ИнтерактивнаяНастройка(УказанныйПуть);
НастройкиПроектов.Вставить(УказанныйПуть, НовыеНастройки);
КонецЕсли;
Иначе
НовыеНастройки = ИнтерактивнаяНастройка(КаталогРепозитория, УправлениеНастройками, ПараметрыКоманды["-global"], Приложение.КаталогСценариев());
СконфигурироватьДополнительныеКаталоги(УправлениеНастройками, НовыеНастройки, Приложение.КаталогСценариев(), КаталогРепозитория);
СброситьНастройкиРепозитория(УправлениеНастройками);
ЗаписатьНастройкиРепозитория(УправлениеНастройками, НовыеНастройки);
БазовыеНастройки = ИнтерактивнаяНастройка(КаталогРепозитория);
СконфигурироватьДополнительныеКаталоги(НастройкиПроектов, КаталогРепозитория);
КонецЕсли;
РедакторНастроек.ОбновитьНастройки(БазовыеНастройки, НастройкиПроектов);
Иначе
НапечататьНастройки(УправлениеНастройками);
НапечататьНастройки();
КонецЕсли;
@ -119,36 +123,44 @@
КонецФункции
Процедура НапечататьНастройки(УправлениеНастройками)
Процедура НапечататьНастройки()
Если УправлениеНастройками.ЭтоНовый() Тогда
Если МенеджерНастроек.ЭтоНовый() Тогда
Лог.Информация("Файл настроек не обнаружен");
Возврат;
КонецЕсли;
ВсеНастройки = УправлениеНастройками.ПолучитьПроектыКонфигурации();
НапечататьНастройкиПроекта("", "Базовые настройки");
ПроектыКонфигурации = МенеджерНастроек.ПроектыКонфигурации();
Для Каждого Настройка из ВсеНастройки Цикл
Для Каждого ИмяПроекта из ПроектыКонфигурации Цикл
НастройкиПрекоммита = УправлениеНастройками.НастройкиПриложения(Настройка);
Если НЕ ЗначениеЗаполнено(НастройкиПрекоммита) Тогда
Лог.Информация(СтрШаблон("Настройки %1 в файле отсутствуют", Настройка));
Продолжить;
КонецЕсли;
Сообщить("Установленные настройки: " + Настройка);
ВывестиНастройкиРекурсивно(НастройкиПрекоммита);
НапечататьНастройкиПроекта(ИмяПроекта, ИмяПроекта);
КонецЦикла;
КонецПроцедуры
Процедура НапечататьНастройкиПроекта(ИмяПроекта, ПредставлениеПроекта)
НастройкиПроекта = МенеджерНастроек.НастройкиПроекта(ИмяПроекта);
Если НЕ ЗначениеЗаполнено(НастройкиПроекта) Тогда
Лог.Информация(СтрШаблон("Настройки %1 в файле отсутствуют", ПредставлениеПроекта));
Возврат;
КонецЕсли;
Сообщить("Установленные настройки: " + ПредставлениеПроекта);
ВывестиНастройкиРекурсивно(НастройкиПроекта);
КонецПроцедуры
Процедура ВывестиНастройкиРекурсивно(НастройкиПрекоммита, Уровень = 1)
ПробельныеСимволы = "";
@ -183,157 +195,107 @@
КонецПроцедуры
Процедура ЗаписатьГлобальныеНастройкиПоУмолчанию(УправлениеНастройками, ТекущийКаталогСценариев)
ИмяПриложения = УправлениеНастройками.ИмяПоУмолчанию();
СброситьНастройкиРепозитория(УправлениеНастройками);
Настройки = УправлениеНастройками.ПолучитьСтандартнуюСтруктуруНастроек();
ГлобальныеСценарии = ПолучитьИменаСценариев(ТекущийКаталогСценариев);
НастройкиСценариев = СформироватьНастройкиСценариев(ГлобальныеСценарии, ТекущийКаталогСценариев);
Настройки.Вставить("ГлобальныеСценарии", ГлобальныеСценарии);
Настройки.Вставить("НастройкиСценариев", НастройкиСценариев);
УправлениеНастройками.ЗаписатьНастройкиПриложения(ИмяПриложения, Настройки);
КонецПроцедуры
Функция ИнтерактивнаяНастройка(КаталогРепозитория)
Процедура СброситьНастройкиРепозитория(УправлениеНастройками, ТолькоДополнительные = Ложь, ПутьКаталога = "", КаталогРепозитория = "")
Если УправлениеНастройками.ЭтоНовый() Тогда
Возврат;
КонецЕсли;
Если ЗначениеЗаполнено(ПутьКаталога) Тогда
ПутьКаталога = ФайловыеОперации.ПолучитьНормализованныйОтносительныйПуть(КаталогРепозитория, ПутьКаталога);
УправлениеНастройками.УдалитьНастройкиПриложения(ПутьКаталога);
Иначе
ВсеНастройки = УправлениеНастройками.ПолучитьПроектыКонфигурации(ТолькоДополнительные);
Для Каждого Настройка Из ВсеНастройки Цикл
УправлениеНастройками.УдалитьНастройкиПриложения(Настройка);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ЗаписатьНастройкиРепозитория(УправлениеНастройками, НовыеНастройки)
Для каждого НоваяНастройка Из НовыеНастройки Цикл
УправлениеНастройками.ЗаписатьНастройкиПриложения(НоваяНастройка.Ключ, НоваяНастройка.Значение);
КонецЦикла;
КонецПроцедуры
Функция ПолучитьИменаСценариев(КаталогСценариев)
НайденныеСценарии = Новый Массив;
ФайлыСценариев = НайтиФайлы(КаталогСценариев, "*.os");
Для Каждого ФайлСценария Из ФайлыСценариев Цикл
Если СтрСравнить(ФайлСценария.ИмяБезРасширения, "ШаблонСценария") = 0 Тогда
Продолжить;
КонецЕсли;
НайденныеСценарии.Добавить(ФайлСценария.Имя);
КонецЦикла;
Возврат НайденныеСценарии;
КонецФункции
Функция СформироватьНастройкиСценариев(МассивСценариев, КаталогСценариев)
НастройкиСценариев = Новый Соответствие;
Рефлектор = Новый Рефлектор;
Для Каждого Сценарий Из МассивСценариев Цикл
ОбъектСценария = ЗагрузитьСценарий(ОбъединитьПути(КаталогСценариев, Сценарий));
Если Рефлектор.МетодСуществует(ОбъектСценария, "ПолучитьСтандартныеНастройкиСценария") Тогда
СтруктураНастроек = Рефлектор.ВызватьМетод(ОбъектСценария, "ПолучитьСтандартныеНастройкиСценария");
НастройкиСценариев.Вставить(СтруктураНастроек.ИмяСценария, СтруктураНастроек.Настройка);
КонецЕсли;
КонецЦикла;
Возврат НастройкиСценариев;
КонецФункции
Функция ИнтерактивнаяНастройка(КаталогРепозитория, УправлениеНастройками, ГлобальныеНастройки, КаталогГлобальныхСценариев, ЭтоДопПроект = Ложь)
ИмяПриложения = УправлениеНастройками.ИмяПоУмолчанию();
ИмяПриложения = МенеджерНастроек.КлючНастройкиPrecommit();
ПолныеНастройки = Новый Соответствие;
Сообщить(СтрШаблон("Настройка конфигурации precommit %1%2", Символы.ПС, КаталогРепозитория));
ГлобальныеСценарии = ПолучитьНастройкуМассив("Выберите подключаемые глобальные сценарии: ",
ПолучитьИменаСценариев(КаталогГлобальныхСценариев), УправлениеНастройками.Настройка(ИмяПриложения + "\ГлобальныеСценарии"));
ГлобальныеСценарии = МенеджерНастроек.ЗначениеНастройки("ГлобальныеСценарии");
ОтключенныеСценарии = МенеджерНастроек.ЗначениеНастройки("ОтключенныеСценарии");
ИменаСценариев = СценарииОбработки.ГлобальныеСценарии();
Если ГлобальныеНастройки Тогда
Лог.Отладка("Сохраненные значения опции 'ГлобальныеСценарии': %1%2",
Символы.ПС, ?(НЕ ЗначениеЗаполнено(ГлобальныеСценарии), "<пусто>", СтрСоединить(ГлобальныеСценарии, Символы.ПС)));
Лог.Отладка("Сохраненные значения опции 'ОтключенныеСценарии': %1%2",
Символы.ПС, ?(НЕ ЗначениеЗаполнено(ОтключенныеСценарии), "<пусто>", СтрСоединить(ОтключенныеСценарии, Символы.ПС)));
Если ИнтерактивныйРедактор.ПолучитьНастройкуБулево("Выполнить настройку подключенных глобальных сценариев?", Истина) Тогда
ГлобальныеСценарии = ИнтерактивныйРедактор.ПолучитьНастройкуМассив("Выберите подключаемые глобальные сценарии: ",
ИменаСценариев, ГлобальныеСценарии);
Подсказка = "Нужно использовать сценарии локальных репозиториев?";
ИначеЕсли ИнтерактивныйРедактор.ПолучитьНастройкуБулево("Выполнить настройку отключенных глобальных сценариев?", Истина) Тогда
Иначе
ОтключенныеСценарии = ИнтерактивныйРедактор.ПолучитьНастройкуМассив("Выберите отключаемые глобальные сценарии: ",
ИменаСценариев, ?(ОтключенныеСценарии = Неопределено, Новый Массив, ОтключенныеСценарии));
КонецЕсли;
ИспользуютсяЛокальныеНастройки = МенеджерНастроек.ИспользуютсяЛокальныеНастройки();
Если ИспользуютсяЛокальныеНастройки Тогда
Подсказка = "Нужно использовать локальные сценарии?";
Иначе
Подсказка = "Нужно использовать сценарии локальных репозиториев?";
КонецЕсли;
ИспользоватьСценарииРепозитория = ПолучитьНастройкуБулево(Подсказка,
УправлениеНастройками.Настройка(ИмяПриложения + "\ИспользоватьСценарииРепозитория"));
ИспользоватьСценарииРепозитория = ИнтерактивныйРедактор.ПолучитьНастройкуБулево(Подсказка, МенеджерНастроек.ЗначениеНастройки("ИспользоватьСценарииРепозитория"));
КаталогЛокальныхСценариев = "";
Если ИспользоватьСценарииРепозитория Тогда
КаталогЛокальныхСценариев = ПолучитьНастройкуСтрока("Укажите относительный путь к сценариям в репозитории: ",
УправлениеНастройками.Настройка(ИмяПриложения + "\КаталогЛокальныхСценариев"));
КаталогЛокальныхСценариев = ИнтерактивныйРедактор.ПолучитьНастройкуСтрока("Укажите относительный путь к сценариям в репозитории: ",
МенеджерНастроек.ЗначениеНастройки("КаталогЛокальныхСценариев"));
КонецЕсли;
НастройкиПриложения = РедакторНастроек.ПолучитьСтандартнуюСтруктуруНастроек();
НастройкиПриложения = УправлениеНастройками.ПолучитьСтандартнуюСтруктуруНастроек();
НастройкиСценариев = СформироватьНастройкиСценариев(ГлобальныеСценарии, КаталогГлобальныхСценариев);
Если ГлобальныеСценарии <> Неопределено Тогда
ИсполняемыеСценарии = МенеджерНастроек.ПолучитьСписокИсполняемыхСценариев(ГлобальныеСценарии, ОтключенныеСценарии);
Иначе
ИсполняемыеСценарии = МенеджерНастроек.ПолучитьСписокИсполняемыхСценариев(ИменаСценариев, ОтключенныеСценарии);
КонецЕсли;
Лог.Отладка("Итоговый список исполняемых сценариев: %1%2", Символы.ПС, СтрСоединить(ИсполняемыеСценарии, Символы.ПС));
НастройкиСценариев = СценарииОбработки.НастройкиСценариев(ИсполняемыеСценарии);
НастройкиПриложения.Вставить("ИспользоватьСценарииРепозитория", ИспользоватьСценарииРепозитория);
НастройкиПриложения.Вставить("КаталогЛокальныхСценариев", КаталогЛокальныхСценариев);
НастройкиПриложения.Вставить("ГлобальныеСценарии", ГлобальныеСценарии);
Если ГлобальныеСценарии <> Неопределено Тогда
НастройкиПриложения["ГлобальныеСценарии"] = ГлобальныеСценарии;
Лог.Отладка("Новое значение опции 'ГлобальныеСценарии': %1", СтрСоединить(ГлобальныеСценарии, ", "));
ИначеЕсли ИспользуютсяЛокальныеНастройки Тогда
// Для локальных удалим ключ, чтоб использовались глобальные
НастройкиПриложения.Удалить("ГлобальныеСценарии");
Иначе
// Останется значение по умолчанию - пустой массив
КонецЕсли;
Если ОтключенныеСценарии <> Неопределено Тогда
НастройкиПриложения["ОтключенныеСценарии"] = ОтключенныеСценарии;
Лог.Отладка("Новое значение опции 'ОтключенныеСценарии': %1", СтрСоединить(ОтключенныеСценарии, ", "));
КонецЕсли;
НастройкиПриложения.Вставить("НастройкиСценариев", НастройкиСценариев);
ИмяПриложения = ?(ЭтоДопПроект,КаталогРепозитория, УправлениеНастройками.ИмяПоУмолчанию());
ПолныеНастройки.Вставить(ИмяПриложения, НастройкиПриложения);
Возврат ПолныеНастройки;
Возврат НастройкиПриложения;
КонецФункции
Процедура СконфигурироватьДополнительныеКаталоги(УправлениеНастройками, ОсновныеНастройки, КаталогГлобальныхСценариев, КаталогРепозитория)
Пока ПолучитьНастройкуБулево("Сконфигурировать дополнительный каталог со своими правилами обработки?", Ложь) Цикл
Процедура СконфигурироватьДополнительныеКаталоги(НастройкиПроектов, КаталогРепозитория)
Пока ИнтерактивныйРедактор.ПолучитьНастройкуБулево("Сконфигурировать дополнительный каталог со своими правилами обработки?", Ложь) Цикл
АдресКаталога = ПолучитьНастройкуСтрока("Введите относительный путь в репозитории к каталогу", "");
АдресКаталога = ИнтерактивныйРедактор.ПолучитьНастройкуСтрока("Введите относительный путь в репозитории к каталогу", "");
Если ПроверитьАдресДополнительногоКаталога(КаталогРепозитория, АдресКаталога, УправлениеНастройками) Тогда
Если ПроверитьАдресДополнительногоКаталога(КаталогРепозитория, АдресКаталога) Тогда
АдресКаталога = ФайловыеОперации.ПолучитьНормализованныйОтносительныйПуть(КаталогРепозитория, АдресКаталога);
НастройкиДополнительные = ИнтерактивнаяНастройка(АдресКаталога, УправлениеНастройками, Ложь, КаталогГлобальныхСценариев, Истина);
ОсновныеНастройки.Вставить(АдресКаталога, НастройкиДополнительные.Получить(АдресКаталога));
АдресКаталога = МенеджерНастроек.НормализованноеИмяПроекта(АдресКаталога);
НастройкиПроекта = ИнтерактивнаяНастройка(АдресКаталога);
НастройкиПроектов.Вставить(АдресКаталога, НастройкиПроекта);
КонецЕсли;
@ -341,19 +303,19 @@
КонецПроцедуры
Функция ПроверитьАдресДополнительногоКаталога(КаталогРепозитория, АдресКаталога, УправлениеНастройками)
Функция ПроверитьАдресДополнительногоКаталога(КаталогРепозитория, АдресКаталога)
РазрешеноДобавление = Истина;
КаталогВРепо = ФайловыеОперации.ПолучитьНормализованныйПолныйПуть(КаталогРепозитория, АдресКаталога);
НастроенныеПроекты = УправлениеНастройками.ПолучитьПроектыКонфигурации(Истина);
НастроенныеПроекты = МенеджерНастроек.ПроектыКонфигурации();
Файл = Новый Файл(КаталогВРепо);
Сообщение = "";
Если Файл.Существует() И Файл.ЭтоКаталог() Тогда
Для Каждого Проект Из НастроенныеПроекты Цикл
Для Каждого ИмяПроекта Из НастроенныеПроекты Цикл
КаталогНастроенныйВКонфигурации = ФайловыеОперации.ПолучитьНормализованныйПолныйПуть(КаталогРепозитория, Проект);
КаталогНастроенныйВКонфигурации = ФайловыеОперации.ПолучитьНормализованныйПолныйПуть(КаталогРепозитория, ИмяПроекта);
Если КаталогВРепо = КаталогНастроенныйВКонфигурации Тогда
@ -385,92 +347,3 @@
Возврат РазрешеноДобавление;
КонецФункции
Функция ПолучитьНастройкуБулево(ТекстПодсказки, Знач ЗначениеПоУмолчанию)
Если НЕ ЗначениеЗаполнено(ЗначениеПоУмолчанию) Тогда
ЗначениеПоУмолчанию = Истина;
КонецЕсли;
ВыбранноеЗначение = Формат(ЗначениеПоУмолчанию, "БЛ=n; БИ=y");
Пока Истина Цикл
Сообщить(ТекстПодсказки + " [" + Формат(ЗначениеПоУмолчанию, "БЛ=n; БИ=y") + "]. Введите y[es]/n[o]");
ВвестиСтроку(ВыбранноеЗначение);
Если СтрНайти("yY", ВыбранноеЗначение) Тогда
ВыбранноеЗначение = Истина;
Прервать;
ИначеЕсли СтрНайти("nN", ВыбранноеЗначение) Тогда
ВыбранноеЗначение = Ложь;
Прервать;
ИначеЕсли ВыбранноеЗначение = Символы.ПС Тогда
ВыбранноеЗначение = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат ВыбранноеЗначение;
КонецФункции
Функция ПолучитьНастройкуМассив(ТекстПодсказки, ДоступныйМассив, Знач УстановленныеЗначения = Неопределено)
Если УстановленныеЗначения = Неопределено Тогда
УстановленныеЗначения = ДоступныйМассив;
КонецЕсли;
Сообщить(ТекстПодсказки);
ВыбранныеЭлементы = Новый Массив;
Для Ит = 0 По ДоступныйМассив.Количество() - 1 Цикл
ЗначениеМассива = ДоступныйМассив[Ит];
ТекстПодсказкиМассив = Символы.Таб + ЗначениеМассива;
Если ПолучитьНастройкуБулево(ТекстПодсказкиМассив, УстановленныеЗначения.Найти(ЗначениеМассива) <> Неопределено) Тогда
ВыбранныеЭлементы.Добавить(ЗначениеМассива);
КонецЕсли;
КонецЦикла;
Возврат ВыбранныеЭлементы;
КонецФункции
Функция ПолучитьНастройкуСтрока(ТекстПодсказки, ЗначениеПоУмолчанию = "")
ВыбранноеЗначение = "";
Пока Истина Цикл
Сообщить(ТекстПодсказки + ?(ПустаяСтрока(ЗначениеПоУмолчанию), "", "[" + ЗначениеПоУмолчанию + "]"));
ВвестиСтроку(ВыбранноеЗначение);
ВыбранноеЗначение = СокрЛП(ВыбранноеЗначение);
Если Не ПустаяСтрока(ВыбранноеЗначение) Тогда
Прервать;
ИначеЕсли НЕ ПустаяСтрока(ЗначениеПоУмолчанию) Тогда
ВыбранноеЗначение = ЗначениеПоУмолчанию;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат ВыбранноеЗначение;
КонецФункции

View File

@ -17,7 +17,7 @@
// Добавление параметров команды
Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "КаталогРепозитория", "Каталог анализируемого репозитория");
Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-source-dir",
Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-source-dir",
"Каталог расположения исходных файлов относительно корня репозитория. По умолчанию <src>");
КонецПроцедуры // НастроитьКоманду
@ -33,28 +33,14 @@
Лог = Приложение.ПолучитьЛог();
КаталогРепозитория = ПараметрыКоманды["КаталогРепозитория"];
ФайлКаталогРепозитория = Новый Файл(КаталогРепозитория);
Если НЕ ФайлКаталогРепозитория.Существует() ИЛИ ФайлКаталогРепозитория.ЭтоФайл() Тогда
Лог.Ошибка("Каталог репозитория '%1' не существует или это файл", КаталогРепозитория);
Возврат Приложение.РезультатыКоманд().НеверныеПараметры;
КонецЕсли;
УправлениеНастройками = Новый НастройкиРепозитория(КаталогРепозитория);
Если УправлениеНастройками.ЭтоНовый()
ИЛИ УправлениеНастройками.НастройкиПриложения("Precommt4onecСценарии").Количество() = 0 Тогда
Лог.Информация("Используем глобальные настройки");
УправлениеНастройками = Новый НастройкиРепозитория(Приложение.ПутьКРодительскомуКаталогу());
Иначе
Лог.Информация("Используем локальные настройки");
КонецЕсли;
КаталогИсходныхФайлов = ПараметрыКоманды["-source-dir"];
Если НЕ ПроверитьПараметрыКоманды(КаталогРепозитория, Лог) Тогда
Возврат Приложение.РезультатыКоманд().НеверныеПараметры;
КонецЕсли;
Если Не ЗначениеЗаполнено(КаталогИсходныхФайлов) Тогда
КаталогИсходныхФайлов = "src";
@ -70,76 +56,28 @@
СоздатьКаталог(ТекущийКаталогИсходныхФайлов);
КонецЕсли;
КаталогРепозитория = ФайлКаталогРепозитория.ПолноеИмя;
РепозиторийGit = Новый ГитРепозиторий();
РепозиторийGit.УстановитьРабочийКаталог(КаталогРепозитория);
Если НЕ РепозиторийGit.ЭтоРепозиторий() Тогда
Лог.Ошибка("Каталог '%1' не является репозиторием git", КаталогРепозитория);
Возврат Приложение.РезультатыКоманд().НеверныеПараметры;
КонецЕсли;
НастройкиПроектов = УправлениеНастройками.ПолучитьПроектыКонфигурации();
НаборНастроек = Новый Соответствие;
УправлениеНастройками = МенеджерНастроек.НастройкиРепозитория(КаталогРепозитория);
Для Каждого ЭлементНастройки из НастройкиПроектов Цикл
Настройка = Новый Структура("СценарииОбработки, НастройкиСценариев");
Настройка.СценарииОбработки = ЗагрузитьСценарииОбработки(Приложение.КаталогСценариев(),
УправлениеНастройками,
КаталогРепозитория,
ЭлементНастройки);
Настройка.НастройкиСценариев = УправлениеНастройками.НастройкиПриложения(ЭлементНастройки);
НаборНастроек.Вставить(ЭлементНастройки, Настройка);
КонецЦикла;
НаборНастроек = СценарииОбработки.ПолучитьСценарииСПараметрамиВыполнения(КаталогРепозитория);
ЖурналИзменений = ПолучитьЖурналИзменений();
Ит = 0;
ПараметрыОбработки = Новый Структура("ФайлыДляПостОбработки, ИзмененныеКаталоги, КаталогРепозитория, Настройки",
Новый Массив, Новый Массив, КаталогРепозитория);
ПараметрыОбработки.Вставить("Лог", Лог);
Пока Ит < ЖурналИзменений.Количество() Цикл
АнализируемыйФайл = Новый Файл(ОбъединитьПути(КаталогРепозитория, ЖурналИзменений[Ит].ИмяФайла));
Лог.Отладка("Анализируется файл <%1>", АнализируемыйФайл.Имя);
ИмяФайла = ФайловыеОперации.ПолучитьНормализованныйОтносительныйПуть(КаталогРепозитория,
ЖурналИзменений[Ит].ИмяФайла);
НастройкаОбработки = ПолучитьПараметрыОбработкиФайла(ИмяФайла, УправлениеНастройками, НаборНастроек);
ПараметрыОбработки = Новый Структура("ФайлыДляПостОбработки, ИзмененныеКаталоги, КаталогРепозитория, ТекущийКаталогИсходныхФайлов, Настройки",
Новый Массив, Новый Массив, КаталогРепозитория, ТекущийКаталогИсходныхФайлов);
СценарииОбработки = НастройкаОбработки.СценарииОбработки;
НастройкиСценариев = НастройкаОбработки.НастройкиСценариев;
ПараметрыОбработки.Настройки = НастройкиСценариев.Получить("НастройкиСценариев");
Для Каждого СценарийОбработки Из СценарииОбработки Цикл
ПараметрыОбработки.Вставить("Лог", Лог);
ФайлОбработан = СценарийОбработки.Сценарий.ОбработатьФайл(АнализируемыйФайл,
ТекущийКаталогИсходныхФайлов,
ПараметрыОбработки);
Если НЕ ФайлОбработан Тогда
Продолжить;
КонецЕсли;
ФайлыКОбработке = Новый Массив();
Для каждого Изменение Из ЖурналИзменений Цикл
Для Каждого ФайлДляДопОбработки Из ПараметрыОбработки.ФайлыДляПостОбработки Цикл
ЖурналИзменений.Добавить(Новый Структура("ИмяФайла, ТипИзменения",
СтрЗаменить(ФайлДляДопОбработки, КаталогРепозитория, ""),
ВариантИзмененийФайловGit.Изменен));
КонецЦикла;
ПараметрыОбработки.ФайлыДляПостОбработки.Очистить();
КонецЦикла;
Ит = Ит + 1;
ФайлыКОбработке.Добавить(Новый Файл(ОбъединитьПути(КаталогРепозитория, Изменение.ИмяФайла)));
КонецЦикла;
ВыполнитьОбработкуФайлов(ФайлыКОбработке, НаборНастроек, ПараметрыОбработки);
// измененные каталоги необходимо добавить в индекс
Лог.Отладка("Добавление измененных каталогов в индекс git");
Для Каждого Каталог Из ПараметрыОбработки.ИзмененныеКаталоги Цикл
@ -155,29 +93,85 @@
///////////////////////////////////////////////////////////////////////////////
Функция ПолучитьПараметрыОбработкиФайла(ИмяФайла, УправлениеНастройками, НастройкиПроектов)
ИмяОбщейНастройки = УправлениеНастройками.ИмяПоУмолчанию();
НайденнаяНастройка = НастройкиПроектов.Получить(ИмяОбщейНастройки);
Для Каждого ЭлементНастройки Из НастройкиПроектов Цикл
Процедура ВыполнитьОбработкуФайлов(Файлы, НаборНастроек, ПараметрыОбработки)
КаталогРепозитория = ПараметрыОбработки.КаталогРепозитория;
Ит = 0;
Пока Ит < Файлы.Количество() Цикл
Если ЭлементНастройки.Ключ = ИмяОбщейНастройки Тогда
Продолжить;
АнализируемыйФайл = Файлы[Ит];
Лог.Отладка("Анализируется файл <%1>", АнализируемыйФайл.Имя);
ИмяФайла = ФайловыеОперации.ПолучитьНормализованныйОтносительныйПуть(КаталогРепозитория,
СтрЗаменить(АнализируемыйФайл.ПолноеИмя, КаталогРепозитория, ""));
ИначеЕсли СтрНачинаетсяС(ИмяФайла, ЭлементНастройки.Ключ) Тогда
ИмяПроекта = МенеджерНастроек.ИмяПроектаДляФайла(ИмяФайла);
НайденнаяНастройка = ЭлементНастройки.Значение;
НастройкаОбработки = НаборНастроек[ИмяПроекта];
Если НЕ ЗначениеЗаполнено(НастройкаОбработки) Тогда
ВызватьИсключение СтрШаблон("Не удалось получить настройки для %1", ИмяФайла);
Иначе
// ничего
КонецЕсли;
СценарииОбработкиФайлов = НастройкаОбработки.СценарииОбработки;
НастройкиСценариев = НастройкаОбработки.НастройкиСценариев;
ПараметрыОбработки.Настройки = НастройкиСценариев.Получить("НастройкиСценариев");
Для Каждого СценарийОбработки Из СценарииОбработкиФайлов Цикл
ФайлОбработан = СценарийОбработки.ОбработатьФайл(АнализируемыйФайл,
ПараметрыОбработки.ТекущийКаталогИсходныхФайлов,
ПараметрыОбработки);
Если НЕ ФайлОбработан Тогда
Продолжить;
КонецЕсли;
Для Каждого ФайлДляДопОбработки Из ПараметрыОбработки.ФайлыДляПостОбработки Цикл
Файлы.Добавить(Новый Файл(ФайлДляДопОбработки));
КонецЦикла;
ПараметрыОбработки.ФайлыДляПостОбработки.Очистить();
КонецЦикла;
Ит = Ит + 1;
КонецЦикла;
Возврат НайденнаяНастройка;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////
Функция ПроверитьПараметрыКоманды(КаталогРепозитория, Лог)
ФайлКаталогРепозитория = Новый Файл(КаталогРепозитория);
Если НЕ ФайлКаталогРепозитория.Существует() ИЛИ ФайлКаталогРепозитория.ЭтоФайл() Тогда
Лог.Ошибка("Каталог репозитория '%1' не существует или это файл", КаталогРепозитория);
Возврат Ложь;
КонецЕсли;
КаталогРепозитория = ФайлКаталогРепозитория.ПолноеИмя;
РепозиторийGit = Новый ГитРепозиторий();
РепозиторийGit.УстановитьРабочийКаталог(КаталогРепозитория);
Если НЕ РепозиторийGit.ЭтоРепозиторий() Тогда
Лог.Ошибка("Каталог '%1' не является репозиторием git", КаталогРепозитория);
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
Функция ПолучитьЖурналИзменений()
@ -185,20 +179,20 @@
ПараметрыКомандыGit = Новый Массив;
ПараметрыКомандыGit.Добавить("diff --name-status --staged --no-renames");
РепозиторийGit.ВыполнитьКоманду(ПараметрыКомандыGit);
РезультатВывода = РепозиторийGit.ПолучитьВыводКоманды();
СтрокиВывода = СтрРазделить(РезультатВывода, Символы.ПС);
ЖурналИзменений = Новый Массив;
РезультатВывода = РепозиторийGit.ПолучитьВыводКоманды();
СтрокиВывода = СтрРазделить(РезультатВывода, Символы.ПС);
ЖурналИзменений = Новый Массив;
Для Каждого СтрокаВывода Из СтрокиВывода Цикл
Лог.Отладка(" <%1>", СтрокаВывода);
СтрокаВывода = СокрЛП(СтрокаВывода);
ПозицияПробела = СтрНайти(СтрокаВывода, Символы.Таб);
СимволИзменения = Лев(СтрокаВывода, 1);
СтрокаВывода = СокрЛП(СтрокаВывода);
ПозицияПробела = СтрНайти(СтрокаВывода, Символы.Таб);
СимволИзменения = Лев(СтрокаВывода, 1);
ТипИзменения = ВариантИзмененийФайловGit.ОпределитьВариантИзменения(СимволИзменения);
ИмяФайла = СокрЛП(СтрЗаменить(Сред(СтрокаВывода, ПозицияПробела + 1), """", ""));
ТипИзменения = ВариантИзмененийФайловGit.ОпределитьВариантИзменения(СимволИзменения);
ИмяФайла = СокрЛП(СтрЗаменить(Сред(СтрокаВывода, ПозицияПробела + 1), """", ""));
ЖурналИзменений.Добавить(Новый Структура("ИмяФайла, ТипИзменения", ИмяФайла, ТипИзменения));
Лог.Отладка(" В журнале git %2 файл <%1>", ИмяФайла, ТипИзменения);
@ -207,87 +201,4 @@
Возврат ЖурналИзменений;
КонецФункции
Функция ЗагрузитьСценарииОбработки(ТекущийКаталогСценариев, УправлениеНастройками, КаталогРепозитория, КлючНастройки)
СценарииОбработки = Новый Массив;
ФайлыГлобальныхСценариев = НайтиФайлы(ТекущийКаталогСценариев, "*.os");
ФайлыЛокальныхСценариев = Новый Массив;
ИменаЗагружаемыхСценариев = Новый Массив;
Если НЕ УправлениеНастройками.ЭтоНовый() Тогда
Лог.Информация("Читаем настройки " + КлючНастройки);
ИменаЗагружаемыхСценариев = УправлениеНастройками.Настройка(КлючНастройки + "\ГлобальныеСценарии");
Если УправлениеНастройками.Настройка(КлючНастройки + "\ИспользоватьСценарииРепозитория") Тогда
ЛокальныйКаталог = УправлениеНастройками.Настройка(КлючНастройки + "\КаталогЛокальныхСценариев");
ПутьКЛокальнымСценариям = ОбъединитьПути(КаталогРепозитория, ЛокальныйКаталог);
ФайлПутьКЛокальнымСценариям = Новый Файл(ПутьКЛокальнымСценариям);
Если Не ФайлПутьКЛокальнымСценариям.Существует() ИЛИ ФайлПутьКЛокальнымСценариям.ЭтоФайл() Тогда
Лог.Ошибка("Сценарии из репозитория не загружены т.к. отсутствует каталог %1", ЛокальныйКаталог);
Иначе
ФайлыЛокальныхСценариев = НайтиФайлы(ФайлПутьКЛокальнымСценариям.ПолноеИмя, "*.os");
КонецЕсли;
КонецЕсли;
КонецЕсли;
ЗагрузитьСценарииИзКаталога(СценарииОбработки, ФайлыГлобальныхСценариев, ИменаЗагружаемыхСценариев);
ЗагрузитьСценарииИзКаталога(СценарииОбработки, ФайлыЛокальныхСценариев, , Истина);
Если СценарииОбработки.Количество() = 0 Тогда
ВызватьИсключение "Нет доступных сценариев обработки файлов";
КонецЕсли;
Возврат СценарииОбработки;
КонецФункции
Процедура ЗагрузитьСценарииИзКаталога(СценарииОбработки, ФайлыСценариев,
Знач ИменаЗагружаемыхСценариев = Неопределено,
ЗагрузитьВсе = Ложь)
Если ИменаЗагружаемыхСценариев = Неопределено Тогда
ИменаЗагружаемыхСценариев = Новый Массив;
КонецЕсли;
Для Каждого ФайлСценария Из ФайлыСценариев Цикл
Если СтрСравнить(ФайлСценария.ИмяБезРасширения, "ШаблонСценария") = 0 Тогда
Продолжить;
КонецЕсли;
Если НЕ ЗагрузитьВсе И ИменаЗагружаемыхСценариев.Найти(ФайлСценария.Имя) = Неопределено Тогда
Продолжить;
КонецЕсли;
Попытка
СценарийОбработки = ЗагрузитьСценарий(ФайлСценария.ПолноеИмя);
СценарииОбработки.Добавить(Новый Структура("ИмяСценария, Сценарий",
СценарийОбработки.ИмяСценария(), СценарийОбработки));
Исключение
Лог.Ошибка("Ошибка загрузки сценария %1: %2", ФайлСценария.ПолноеИмя, ОписаниеОшибки());
Продолжить;
КонецПопытки;
КонецЦикла;
КонецПроцедуры
КонецФункции

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////
//
//
///////////////////////////////////////////////////////////////////
// Работает с настройками в конфигурационном файле репозитория 1С
// в Git
//
@ -11,11 +11,12 @@
///////////////////////////////////////////////////////////////////
Перем ИнициализацияВыполнена; // содержит признак инициализации репозитория
Перем НовыйКонфиг; // содержит признак нового конфига
Перем Конфигурация; // описание конфигурации
Перем АдресКонфигурационногоФайла; // адрес нахождения конфигурационного файла
Перем ОбновлятьКонфигурацию; // флаг необходимости обновления конфигурации / затирания
Перем ИнициализацияВыполнена; // содержит признак инициализации репозитория
Перем НовыйКонфиг; // содержит признак нового конфига
Перем Конфигурация; // описание конфигурации
Перем АдресКонфигурационногоФайла; // адрес нахождения конфигурационного файла
Перем ОбновлятьКонфигурацию; // флаг необходимости обновления конфигурации / затирания
///////////////////////////////////////////////////////////////////
// Программный интерфейс
///////////////////////////////////////////////////////////////////
@ -49,8 +50,9 @@
ВызватьИсключение "Не указано имя приложения";
КонецЕсли;
ИскомыеНастройки = Конфигурация.Получить(ИмяПриложения);
Если ИскомыеНастройки = Неопределено Тогда
ИскомыеНастройки = Новый Соответствие;
@ -82,22 +84,6 @@
КонецФункции // Настройка(ИмяНастройки)
Функция ПолучитьПроектыКонфигурации(ТолькоДополнительные = Ложь) Экспорт
Массив = Новый Массив;
Для Каждого Элемент из Конфигурация Цикл
Если ТолькоДополнительные И Элемент.Ключ = ИмяПоУмолчанию() Тогда
Продолжить;
КонецЕсли;
Массив.Добавить(Элемент.Ключ);
КонецЦикла;
Возврат Массив;
КонецФункции
// ЗаписатьНастройку
// Записывает настройку в конфигурационный файл
//
@ -116,7 +102,7 @@
ИскомоеПриложение = НастройкиПриложения(РазложенноеИмяНастройки.ИмяПриложения);
Если ОбновлятьКонфигурацию ИЛИ ИскомоеПриложение.Получить(РазложенноеИмяНастройки.ИмяНастройки) = Неопределено Тогда
ИскомоеПриложение.Вставить(РазложенноеИмяНастройки.ИмяНастройки, Значение);
ИскомоеПриложение.Вставить(РазложенноеИмяНастройки.ИмяНастройки, Значение);
КонецЕсли;
Конфигурация.Вставить(РазложенноеИмяНастройки.ИмяПриложения, ИскомоеПриложение);
@ -163,8 +149,8 @@
Процедура УдалитьНастройкиПриложения(ИмяПриложения) Экспорт
ПроверкаИнициализации();
Если ПустаяСтрока(ИмяПриложения) Тогда
Если ПустаяСтрока(ИмяПриложения) Тогда
ВызватьИсключение "Не указано имя приложения";
@ -176,6 +162,22 @@
КонецПроцедуры // УдалитьНастройкиПриложения()
Процедура УдалитьНастройку(ИмяПриложения, ИмяНастройки) Экспорт
ПроверкаИнициализации();
Если ПустаяСтрока(ИмяПриложения) Тогда
ВызватьИсключение "Не указано имя приложения";
КонецЕсли;
тмп = Конфигурация.Получить(ИмяПриложения);
Тмп.Удалить(ИмяНастройки);
Конфигурация.Вставить(ИмяПриложения,Тмп);
ОбновитьКонфигурационныйФайл();
КонецПроцедуры // УдалитьНастройкиПриложения()
///////////////////////////////////////////////////////////////////
// Служебный функционал
///////////////////////////////////////////////////////////////////
@ -184,7 +186,7 @@
Если Не ИнициализацияВыполнена Тогда
ВызватьИсключение "Необходимо выполнить инициализацию"
ВызватьИсключение "Необходимо выполнить инициализацию";
КонецЕсли;
@ -194,11 +196,11 @@
Если ПустаяСтрока(ИмяНастройки) Тогда
ВызватьИсключение "Не передано имя настройки"
ВызватьИсключение "Не передано имя настройки";
КонецЕсли;
ПозицияРазделителя = СтрНайти(ИмяНастройки, "\",НаправлениеПоиска.СКонца);
ПозицияРазделителя = СтрНайти(ИмяНастройки, "\", НаправлениеПоиска.СКонца);
Если ПозицияРазделителя > 0 Тогда
ИмяПриложения = Лев(ИмяНастройки, ПозицияРазделителя - 1);
@ -210,7 +212,7 @@
КонецФункции // РазобратьИмяНастройки()
Функция ОбновитьКонфигурационныйФайл()
Процедура ОбновитьКонфигурационныйФайл()
ПарсерJSON = Новый ПарсерJSON;
ТекстКонфигурации = ПарсерJSON.ЗаписатьJSON(Конфигурация);
@ -219,14 +221,9 @@
Запись.Закрыть();
НовыйКонфиг = Ложь;
КонецФункции // ОбновитьКонфигурационныйФайл()
Функция ИмяПоУмолчанию() Экспорт
Возврат "Precommt4onecСценарии";
КонецФункции
КонецПроцедуры // ОбновитьКонфигурационныйФайл()
///////////////////////////////////////////////////////////////////
// ПриСозданииОбъекта
@ -244,13 +241,21 @@
АдресКонфигурационногоФайла = "";
ОбновлятьКонфигурацию = ?(ОбновлятьКонф = Неопределено, Ложь, ОбновлятьКонф);
Файл = Новый Файл(КаталогРепозитория);
Если НЕ (Файл.Существует() И Файл.ЭтоКаталог()) Тогда
АдресКонфигурационногоФайла = "";
Если НЕ Файл.Существует() Тогда
ВызватьИсключение "Каталог репозитория или файл настроек '" + КаталогРепозитория + "' не обнаружен";
ВызватьИсключение "Каталог репозитория '" + КаталогРепозитория + "' не обнаружен либо это файл"
ИначеЕсли Файл.ЭтоФайл() Тогда
АдресКонфигурационногоФайла = Файл.ПолноеИмя;
Иначе
АдресКонфигурационногоФайла = ОбъединитьПути(КаталогРепозитория, "v8config.json");
КонецЕсли;
АдресКонфигурационногоФайла = ОбъединитьПути(КаталогРепозитория, "v8config.json");
Файл = Новый Файл(АдресКонфигурационногоФайла);
Если Файл.Существует() Тогда
@ -268,34 +273,10 @@
КонецЕсли;
ИнициализацияВыполнена = Истина;
ИнициализацияВыполнена = Истина;
КонецПроцедуры // ПриСозданииОбъекта()
Функция ПолучитьСтандартнуюСтруктуруНастроек() Экспорт
Настройки = Новый Соответствие();
Настройки.Вставить("ИспользоватьСценарииРепозитория", Ложь);
Настройки.Вставить("КаталогЛокальныхСценариев", "");
Настройки.Вставить("ГлобальныеСценарии", Новый Массив);
Настройки.Вставить("НастройкиСценариев", Новый Соответствие());
Возврат Настройки;
КонецФункции
Процедура ЗаписатьСтруктуруНастроек(Настройки) Экспорт
ШаблонНастройки = "%1\%2";
Для Каждого Настройка Из Настройки Цикл
ЗаписатьНастройку(СтрШаблон(ШаблонНастройки, ИмяПоУмолчанию(), Настройка.Ключ), Настройка.Значение);
КонецЦикла;
КонецПроцедуры
Процедура ОбновитьКонфигурацию() Экспорт
ОбновлятьКонфигурацию = Истина;
КонецПроцедуры

View File

@ -0,0 +1,89 @@
Функция ПолучитьНастройкуБулево(ТекстПодсказки, Знач ЗначениеПоУмолчанию) Экспорт
Если НЕ ЗначениеЗаполнено(ЗначениеПоУмолчанию) Тогда
ЗначениеПоУмолчанию = Истина;
КонецЕсли;
ВыбранноеЗначение = Формат(ЗначениеПоУмолчанию, "БЛ=n; БИ=y");
Пока Истина Цикл
Сообщить(ТекстПодсказки + " [" + Формат(ЗначениеПоУмолчанию, "БЛ=n; БИ=y") + "]. Введите y[es]/n[o]");
ВвестиСтроку(ВыбранноеЗначение);
Если СтрНайти("yY", ВыбранноеЗначение) Тогда
ВыбранноеЗначение = Истина;
Прервать;
ИначеЕсли СтрНайти("nN", ВыбранноеЗначение) Тогда
ВыбранноеЗначение = Ложь;
Прервать;
ИначеЕсли ВыбранноеЗначение = Символы.ПС Тогда
ВыбранноеЗначение = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат ВыбранноеЗначение;
КонецФункции
Функция ПолучитьНастройкуМассив(ТекстПодсказки, ДоступныйМассив, Знач УстановленныеЗначения = Неопределено) Экспорт
Если УстановленныеЗначения = Неопределено Тогда
УстановленныеЗначения = ДоступныйМассив;
КонецЕсли;
Сообщить(ТекстПодсказки);
ВыбранныеЭлементы = Новый Массив;
Для Ит = 0 По ДоступныйМассив.Количество() - 1 Цикл
ЗначениеМассива = ДоступныйМассив[Ит];
ТекстПодсказкиМассив = Символы.Таб + ЗначениеМассива;
Если ПолучитьНастройкуБулево(ТекстПодсказкиМассив, УстановленныеЗначения.Найти(ЗначениеМассива) <> Неопределено) Тогда
ВыбранныеЭлементы.Добавить(ЗначениеМассива);
КонецЕсли;
КонецЦикла;
Возврат ВыбранныеЭлементы;
КонецФункции
Функция ПолучитьНастройкуСтрока(ТекстПодсказки, ЗначениеПоУмолчанию = "") Экспорт
ВыбранноеЗначение = "";
Пока Истина Цикл
Сообщить(ТекстПодсказки + ?(ПустаяСтрока(ЗначениеПоУмолчанию), "", "[" + ЗначениеПоУмолчанию + "]"));
ВвестиСтроку(ВыбранноеЗначение);
ВыбранноеЗначение = СокрЛП(ВыбранноеЗначение);
Если Не ПустаяСтрока(ВыбранноеЗначение) Тогда
Прервать;
ИначеЕсли НЕ ПустаяСтрока(ЗначениеПоУмолчанию) Тогда
ВыбранноеЗначение = ЗначениеПоУмолчанию;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат ВыбранноеЗначение;
КонецФункции

View File

@ -0,0 +1,460 @@
Перем ЛокальныеНастройки;
Перем ГлобальныеНастройки;
Перем ИспользуютсяЛокальныеНастройки;
Перем КаталогРепозитория;
Перем НастройкиИнициализированы;
Перем КаталогГлобальныхНастроек;
///////////////////////////////////////////////////////////////////
// ПРОГРАММНЫЙ ИНТЕРФЕЙС
///////////////////////////////////////////////////////////////////
Функция Настройки() Экспорт
Если НЕ НастройкиИнициализированы Тогда
ВызватьИсключение "Настройки не загружены";
КонецЕсли;
Если ИспользуютсяЛокальныеНастройки() Тогда
Возврат ЛокальныеНастройки;
Иначе
Возврат ГлобальныеНастройки;
КонецЕсли;
КонецФункции
Функция НастройкиРепозитория(ПутьКаталогаРепозитория, ВернутьГлобальныеЕслиНетЛокальных = Истина) Экспорт
КаталогРепозитория = ПутьКаталогаРепозитория;
Если ВернутьГлобальныеЕслиНетЛокальных Тогда
ГлобальныеНастройки();
КонецЕсли;
Лог = МенеджерПриложения.ПолучитьЛог();
ЛокальныеНастройки = Новый НастройкиРепозитория(КаталогРепозитория);
ИспользуютсяЛокальныеНастройки = ЕстьНастройкиPrecommt4onec(ЛокальныеНастройки) ИЛИ НЕ ВернутьГлобальныеЕслиНетЛокальных;
Если ИспользуютсяЛокальныеНастройки Тогда
ВозвращаемаяНастройка = ЛокальныеНастройки;
Лог.Информация("Используем локальные настройки");
Иначе
ВозвращаемаяНастройка = ГлобальныеНастройки;
Лог.Информация("Используем глобальные настройки");
Если НЕ ЕстьНастройкиPrecommt4onec(ГлобальныеНастройки) Тогда
Лог.Предупреждение("Файл глобальных настроек '%1' не содержит настройки прекоммита", МенеджерПриложения.ПутьКРодительскомуКаталогу());
КонецЕсли;
КонецЕсли;
НастройкиИнициализированы = Истина;
ПроверитьНастройкуПроектов();
Возврат ВозвращаемаяНастройка;
КонецФункции
Функция ГлобальныеНастройки() Экспорт
Если ГлобальныеНастройки = Неопределено Тогда
Если НЕ ЗначениеЗаполнено(КаталогГлобальныхНастроек) Тогда
ГлобальныеНастройки = Новый НастройкиРепозитория(МенеджерПриложения.ПутьКРодительскомуКаталогу());
Иначе
ГлобальныеНастройки = Новый НастройкиРепозитория(КаталогГлобальныхНастроек);
КонецЕсли;
КонецЕсли;
НастройкиИнициализированы = Истина;
Возврат ГлобальныеНастройки;
КонецФункции
Функция ЗначениеНастройки(КлючНастройки, Подпроект = Неопределено, ЗначениеПоУмолчанию = Неопределено) Экспорт
Значение = ЗначениеНастроекПоКлючу(Настройки(), КлючНастройки(Подпроект, КлючНастройки));
Возврат ?(Значение = Неопределено, ЗначениеПоУмолчанию, Значение);
КонецФункции
Функция ИменаЗагружаемыхСценариев(Подпроект = "") Экспорт
ИменаИсключаемыхСценариев = ЗначениеНастройки("ОтключенныеСценарии", Подпроект);
ГлобальныеСценарии = ЗначениеНастройки("ГлобальныеСценарии", Подпроект);
Если ГлобальныеСценарии = Неопределено Тогда
ГлобальныеСценарии = ПолучитьЗначениеНастройки(ГлобальныеНастройки(), "ГлобальныеСценарии");
КонецЕсли;
ИменаЗагружаемыхСценариев = Новый Массив;
Если ИменаИсключаемыхСценариев = Неопределено Тогда
ИменаИсключаемыхСценариев = Новый Массив();
КонецЕсли;
Для Каждого ИмяСценария Из ГлобальныеСценарии Цикл
Если ИменаИсключаемыхСценариев.Найти(ИмяСценария) = Неопределено Тогда
ИменаЗагружаемыхСценариев.Добавить(ИмяСценария);
КонецЕсли;
КонецЦикла;
Возврат ИменаЗагружаемыхСценариев;
КонецФункции
Функция ПолучитьСписокИсполняемыхСценариев(Знач ГлобальныеСценарии, Знач ОтключенныеСценарии) Экспорт
ИменаЗагружаемыхСценариев = Новый Массив;
Если ОтключенныеСценарии = Неопределено Тогда
ОтключенныеСценарии = Новый Массив();
КонецЕсли;
Для Каждого ИмяСценария Из ГлобальныеСценарии Цикл
Если ОтключенныеСценарии.Найти(ИмяСценария) = Неопределено Тогда
ИменаЗагружаемыхСценариев.Добавить(ИмяСценария);
КонецЕсли;
КонецЦикла;
Возврат ИменаЗагружаемыхСценариев;
КонецФункции
Функция ИспользуютсяЛокальныеНастройки() Экспорт
Возврат ИспользуютсяЛокальныеНастройки = Истина;
КонецФункции
#Область Проекты
Функция ПроектыКонфигурации() Экспорт
Проекты = Новый Массив;
БлокПроекты = ЗначениеНастройки(КлючПроекты());
Если ЗначениеЗаполнено(БлокПроекты) Тогда
Для Каждого Элемент Из БлокПроекты Цикл
Проекты.Добавить(Элемент.Ключ);
КонецЦикла;
КонецЕсли;
Возврат Проекты;
КонецФункции
Функция НастройкиПроекта(Подпроект = "") Экспорт
Значение = ПолучитьНастройкиПроекта(Настройки(), Подпроект);
Возврат Значение;
КонецФункции
Функция НастройкаДляФайла(Знач ОтносительноеИмяФайла) Экспорт
Возврат НастройкиПроекта(ИмяПроектаДляФайла(ОтносительноеИмяФайла));
КонецФункции
Функция ИмяПроектаДляФайла(Знач ОтносительноеИмяФайла) Экспорт
Если СтрНачинаетсяС(ОтносительноеИмяФайла, "/") ИЛИ СтрНачинаетсяС(ОтносительноеИмяФайла, "\") Тогда
ОтносительноеИмяФайла = Сред(ОтносительноеИмяФайла, 2);
КонецЕсли;
ОтносительноеИмяФайла = НРег(ФайловыеОперации.ПолучитьНормализованныйОтносительныйПуть(КаталогРепозитория, ОтносительноеИмяФайла));
Для Каждого ИмяПроекта Из ПроектыКонфигурации() Цикл
НормализованноеИмяПроекта = НРег(ИмяПроекта);
Если СтрНачинаетсяС(ОтносительноеИмяФайла, НормализованноеИмяПроекта) Тогда
Возврат ИмяПроекта;
КонецЕсли;
КонецЦикла;
Возврат "";
КонецФункции
Процедура УдалитьПроекты() Экспорт
ЗначениеНастройки("").Удалить(КлючПроекты()); // Удаляем ветку "Проекты" из корня настроек прекоммит
КонецПроцедуры
Процедура УдалитьПроект(Подпроект) Экспорт
ИмяПроекта = ИмяПроектаДляФайла(Подпроект);
Если НЕ ЗначениеЗаполнено(ИмяПроекта) ИЛИ СтрДлина(ИмяПроекта) <> СтрДлина(Подпроект) Тогда
МенеджерПриложения.ПолучитьЛог().Предупреждение("Не найден проект %1", Подпроект);
Возврат;
КонецЕсли;
ЗначениеНастройки(КлючПроекты()).Удалить(ИмяПроекта);
КонецПроцедуры
Функция НормализованноеИмяПроекта(ИмяПроекта) Экспорт
Если НЕ ЗначениеЗаполнено(ИмяПроекта) Тогда
Возврат ИмяПроекта;
КонецЕсли;
НормализованноеИмяПроекта = ФайловыеОперации.ПолучитьНормализованныйОтносительныйПуть(КаталогРепозитория, ИмяПроекта);
Возврат НормализованноеИмяПроекта;
КонецФункции
Функция ПроверитьНастройкуПроектов() Экспорт
Успешно = Истина;
Лог = МенеджерПриложения.ПолучитьЛог();
Для Каждого ИмяПроекта Из ПроектыКонфигурации() Цикл
Если НормализованноеИмяПроекта(ИмяПроекта) <> ИмяПроекта Тогда
Лог.Предупреждение("Имя проекта '%1' указано не корректно (должно быть %2), возможно приложение будет работать не корректно", ИмяПроекта, НормализованноеИмяПроекта(ИмяПроекта));
Успешно = Ложь;
КонецЕсли;
КонецЦикла;
Возврат Успешно;
КонецФункции
#КонецОбласти
Функция ЭтоНовый() Экспорт
Возврат Настройки().ЭтоНовый();
КонецФункции
Процедура ЗаписатьНастройки() Экспорт
Настройки().ЗаписатьНастройкиПриложения(КлючНастройкиPrecommit(), ЗначениеНастройки(""));
КонецПроцедуры
Процедура УдалитьНастройки() Экспорт
Если НЕ ИспользуютсяЛокальныеНастройки() Тогда
ВызватьИсключение "Нельзя удалять глобальную настройку";
КонецЕсли;
Настройки().УдалитьНастройкиПриложения(КлючНастройкиPrecommit());
КонецПроцедуры
///////////////////////////////////////////////////////////////////
// СЛУЖЕБНЫЙ ФУНКЦИОНАЛ
///////////////////////////////////////////////////////////////////
Функция КлючНастройкиPrecommit() Экспорт
Возврат "Precommt4onecСценарии";
КонецФункции
Функция КлючПроекты() Экспорт
Возврат "Проекты";
КонецФункции
Функция ПолучитьИменаСценариевКаталога(КаталогСценариев) Экспорт
НайденныеСценарии = Новый Массив;
ФайлыСценариев = НайтиФайлы(КаталогСценариев, "*.os");
Для Каждого ФайлСценария Из ФайлыСценариев Цикл
Если СтрСравнить(ФайлСценария.ИмяБезРасширения, "ШаблонСценария") = 0 Тогда
Продолжить;
КонецЕсли;
НайденныеСценарии.Добавить(ФайлСценария.Имя);
КонецЦикла;
Возврат НайденныеСценарии;
КонецФункции
Функция КлючНастройки(Знач Проект = Неопределено, КлючНастройки = Неопределено)
Ключ = Новый Массив();
Проект = НормализованноеИмяПроекта(Проект);
Если ЗначениеЗаполнено(Проект) И ЕстьПроект(Проект) Тогда
Ключ.Добавить(КлючПроекты());
Ключ.Добавить(Проект);
КонецЕсли;
Если ЗначениеЗаполнено(КлючНастройки) Тогда
Ключ.Добавить(КлючНастройки);
КонецЕсли;
Возврат Ключ;
КонецФункции
Функция ЕстьПроект(Проект)
Возврат ПроектыКонфигурации().Найти(Проект) <> Неопределено;
КонецФункции
Функция ПолучитьНастройкиПроекта(Настройка, Подпроект) Экспорт
Значение = ЗначениеНастроекПоКлючу(Настройка, КлючНастройки(Подпроект));
Если Значение = Неопределено Тогда
Значение = ЗначениеНастроекПоКлючу(Настройка, "");
КонецЕсли;
Возврат Значение;
КонецФункции
Функция ЗначениеНастроекПоКлючу(Настройка, КлючНастройки)
Значение = Настройка.НастройкиПриложения(КлючНастройкиPrecommit());
Возврат ЗначениеПоКлючу(Значение, КлючНастройки);
КонецФункции
Функция ЗначениеПоКлючу(Коллекция, КлючЗначения) Экспорт
Значение = Коллекция;
Если НЕ ЗначениеЗаполнено(КлючЗначения) Тогда
Возврат Значение;
ИначеЕсли ТипЗнч(КлючЗначения) = Тип("Строка") Тогда
Ключи = СтрРазделить(КлючЗначения, ".");
Иначе
Ключи = КлючЗначения;
КонецЕсли;
Для каждого Ключ Из Ключи Цикл
Значение = Значение.Получить(Ключ);
Если Значение = Неопределено Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Значение;
КонецФункции
Функция ЕстьНастройкиPrecommt4onec(Настройка)
Возврат НЕ Настройка.ЭтоНовый() И ЗначениеНастроекПоКлючу(Настройка, "").Количество();
КонецФункции
Функция ПолучитьЗначениеНастройки(Настройка, КлючНастройки, Подпроект = Неопределено)
Значение = ЗначениеНастроекПоКлючу(Настройка, КлючНастройки(Подпроект, КлючНастройки));
Возврат Значение;
КонецФункции
Процедура УстановитьКаталогГлобальныхНастроек(Каталог) Экспорт
КаталогГлобальныхНастроек = Каталог;
КонецПроцедуры
Процедура СбросСостоянияМенеджера() Экспорт
ЛокальныеНастройки = Неопределено;
ГлобальныеНастройки = Неопределено;
ИспользуютсяЛокальныеНастройки = Ложь;
НастройкиИнициализированы = Ложь;
КаталогГлобальныхНастроек = Неопределено;
КаталогРепозитория = Неопределено;
КонецПроцедуры
СбросСостоянияМенеджера();

View File

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

View File

@ -0,0 +1,25 @@
Функция ПолучитьДочерниеЭлементыОписанияКонфигурации(Знач СодержимоеФайла) Экспорт
Элементы = Новый Структура("Количество,ДочерниеЭлементыСтрока,Совпадения", 0, "", Неопределено);
Регексп = Новый РегулярноеВыражение("(<ChildObjects>\s+?)([\w\W]+?)(\s+<\/ChildObjects>)");
Регексп.ИгнорироватьРегистр = Истина;
Регексп.Многострочный = Истина;
ДочерниеЭлементы = Регексп.НайтиСовпадения(СодержимоеФайла);
Элементы.Количество = ДочерниеЭлементы.Количество();
Элементы.Совпадения = ДочерниеЭлементы;
Если НЕ Элементы.Количество = 0 Тогда // Если количество 0 вернется пустая коллекция
Элементы.ДочерниеЭлементыСтрока = ДочерниеЭлементы[0].Группы[2].Значение;
РегекспМетаданные = Новый РегулярноеВыражение("^\s+<([\w]+)>([а-яa-zA-ZА-Я0-9_]+)<\/[\w]+>");
РегекспМетаданные.ИгнорироватьРегистр = Истина;
РегекспМетаданные.Многострочный = Истина;
Элементы.Совпадения = РегекспМетаданные.НайтиСовпадения(Элементы.ДочерниеЭлементыСтрока);
КонецЕсли;
Возврат Элементы;
КонецФункции

View File

@ -0,0 +1,117 @@
Процедура СброситьНастройкиРепозитория(СброситьНастройкиПодпроектов = Ложь, Знач Подпроект = "") Экспорт
Если МенеджерНастроек.ЭтоНовый() Тогда
Возврат;
КонецЕсли;
Если ЗначениеЗаполнено(Подпроект) Тогда
МенеджерНастроек.УдалитьПроект(Подпроект);
МенеджерНастроек.ЗаписатьНастройки();
ИначеЕсли СброситьНастройкиПодпроектов Тогда
МенеджерНастроек.УдалитьПроекты();
МенеджерНастроек.ЗаписатьНастройки();
Иначе
МенеджерНастроек.УдалитьНастройки(); // Удаляем ветку настроек прекоммит
КонецЕсли;
КонецПроцедуры
Процедура СброситьГлобальныеНастройки() Экспорт
Если МенеджерНастроек.ИспользуютсяЛокальныеНастройки() Тогда
ВызватьИсключение
"Обнаружен не корректный вызов.
|Для сброса глобальных настроек необходимо загрузить глобальные настройки
|вызвав МенеджерНастроек.ГлобальныеНастройки";
КонецЕсли;
ИмяПриложения = МенеджерНастроек.КлючНастройкиPrecommit();
Настройки = МенеджерНастроек.ГлобальныеНастройки();
СтандартныеНастройки = ПолучитьСтандартнуюСтруктуруНастроек();
ГлобальныеСценарии = СценарииОбработки.ГлобальныеСценарии();
НастройкиСценариев = СценарииОбработки.НастройкиГлобальныхСценариев();
СтандартныеНастройки.Вставить("ГлобальныеСценарии", ГлобальныеСценарии);
СтандартныеНастройки.Вставить("НастройкиСценариев", НастройкиСценариев);
Настройки.ЗаписатьНастройкиПриложения(ИмяПриложения, СтандартныеНастройки);
КонецПроцедуры
Функция ПолучитьСтандартнуюСтруктуруНастроек() Экспорт
Настройки = Новый Соответствие();
Настройки.Вставить("ИспользоватьСценарииРепозитория", Ложь);
Настройки.Вставить("КаталогЛокальныхСценариев", "");
Настройки.Вставить("ГлобальныеСценарии", Новый Массив);
Настройки.Вставить("ОтключенныеСценарии", Новый Массив);
Настройки.Вставить("НастройкиСценариев", Новый Соответствие());
Возврат Настройки;
КонецФункции
Процедура ЗаписатьНастройкиРепозитория(НовыеНастройки) Экспорт
УправлениеНастройками = МенеджерНастроек.Настройки();
Для каждого НоваяНастройка Из НовыеНастройки Цикл
УправлениеНастройками.ЗаписатьНастройкиПриложения(НоваяНастройка.Ключ, НоваяНастройка.Значение);
КонецЦикла;
КонецПроцедуры
Процедура ОбновитьНастройки(БазовыеНастройки, НастройкиПроектов) Экспорт
Лог = МенеджерПриложения.ПолучитьЛог();
Лог.Отладка("Обновление настроек");
КлючПроекты = МенеджерНастроек.КлючПроекты();
Если БазовыеНастройки = Неопределено Тогда
БазовыеНастройки = МенеджерНастроек.НастройкиПроекта("");
Иначе
БазовыеНастройки.Вставить(КлючПроекты, Новый Соответствие());
Для Каждого ИмяПроекта Из МенеджерНастроек.ПроектыКонфигурации() Цикл
БазовыеНастройки[КлючПроекты].Вставить(ИмяПроекта, МенеджерНастроек.НастройкиПроекта(ИмяПроекта));
КонецЦикла;
КонецЕсли;
Если ЗначениеЗаполнено(НастройкиПроектов) Тогда
Если БазовыеНастройки[КлючПроекты] = Неопределено Тогда
БазовыеНастройки.Вставить(КлючПроекты, Новый Соответствие());
КонецЕсли;
Для Каждого Элемент Из НастройкиПроектов Цикл
БазовыеНастройки[КлючПроекты].Вставить(Элемент.Ключ, Элемент.Значение);
КонецЦикла;
КонецЕсли;
МенеджерНастроек.Настройки().ЗаписатьНастройкиПриложения(МенеджерНастроек.КлючНастройкиPrecommit(), БазовыеНастройки);
КонецПроцедуры

View File

@ -0,0 +1,228 @@
Функция Загрузить(КаталогРепозитория, Проект, Знач ПараметрИменаЗагружаемыхСценариев = Неопределено) Экспорт
ТекущийКаталогСценариев = МенеджерПриложения.КаталогСценариев();
ВсеЗагруженные = Новый Массив;
ФайлыГлобальныхСценариев = НайтиФайлы(ТекущийКаталогСценариев, "*.os");
ФайлыЛокальныхСценариев = Новый Массив;
Лог = МенеджерПриложения.ПолучитьЛог();
Если ПараметрИменаЗагружаемыхСценариев <> Неопределено Тогда
ИменаЗагружаемыхСценариев = ПараметрИменаЗагружаемыхСценариев;
Иначе
ИменаЗагружаемыхСценариев = МенеджерНастроек.ИменаЗагружаемыхСценариев(Проект);
КонецЕсли;
Если НЕ МенеджерНастроек.ЭтоНовый() Тогда
Лог.Информация("Читаем настройки " + Проект);
ИспользоватьСценарииРепозитория = МенеджерНастроек.ЗначениеНастройки("ИспользоватьСценарииРепозитория", Проект, Ложь);
Если ИспользоватьСценарииРепозитория Тогда
ЛокальныйКаталог = МенеджерНастроек.ЗначениеНастройки("КаталогЛокальныхСценариев", Проект);
ПутьКЛокальнымСценариям = ОбъединитьПути(КаталогРепозитория, ЛокальныйКаталог);
ФайлПутьКЛокальнымСценариям = Новый Файл(ПутьКЛокальнымСценариям);
Если Не ФайлПутьКЛокальнымСценариям.Существует() ИЛИ ФайлПутьКЛокальнымСценариям.ЭтоФайл() Тогда
Лог.Ошибка("Сценарии из репозитория не загружены т.к. отсутствует каталог %1", ЛокальныйКаталог);
Иначе
ФайлыЛокальныхСценариев = НайтиФайлы(ФайлПутьКЛокальнымСценариям.ПолноеИмя, "*.os");
КонецЕсли;
КонецЕсли;
КонецЕсли;
ЗагрузитьИзКаталога(ВсеЗагруженные, ФайлыГлобальныхСценариев, ИменаЗагружаемыхСценариев);
ЗагрузитьИзКаталога(ВсеЗагруженные, ФайлыЛокальныхСценариев, , Истина);
Если ВсеЗагруженные.Количество() = 0 Тогда
ВызватьИсключение "Нет доступных сценариев обработки файлов";
КонецЕсли;
Возврат ВсеЗагруженные;
КонецФункции
Процедура ЗагрузитьИзКаталога(ВсеЗагруженные, ФайлыСценариев,
Знач ИменаЗагружаемыхСценариев = Неопределено,
ЗагрузитьВсе = Ложь) Экспорт
Лог = МенеджерПриложения.ПолучитьЛог();
Если ИменаЗагружаемыхСценариев = Неопределено Тогда
ИменаЗагружаемыхСценариев = Новый Массив;
КонецЕсли;
Для Каждого ФайлСценария Из ФайлыСценариев Цикл
Если СтрСравнить(ФайлСценария.ИмяБезРасширения, "ШаблонСценария") = 0 Тогда
Продолжить;
КонецЕсли;
Если НЕ ЗагрузитьВсе
И ИменаЗагружаемыхСценариев.Найти(ФайлСценария.Имя) = Неопределено
И ИменаЗагружаемыхСценариев.Найти(ФайлСценария.ИмяБезРасширения) = Неопределено Тогда
Продолжить;
КонецЕсли;
Попытка
СценарийОбработки = ЗагрузитьСценарий(ФайлСценария.ПолноеИмя);
ВсеЗагруженные.Добавить(СценарийОбработки);
Исключение
Лог.Ошибка("Ошибка загрузки сценария %1: %2", ФайлСценария.ПолноеИмя, ОписаниеОшибки());
Продолжить;
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Функция ПолучитьСтандартныеПараметрыОбработки() Экспорт
Лог = МенеджерПриложения.ПолучитьЛог();
ПараметрыОбработки = Новый Структура();
ПараметрыОбработки.Вставить("Лог", Лог);
ПараметрыОбработки.Вставить("ФайлыДляПостОбработки", Новый Массив);
ПараметрыОбработки.Вставить("ИзмененныеКаталоги", Новый Массив);
ПараметрыОбработки.Вставить("КаталогРепозитория", Неопределено);
ПараметрыОбработки.Вставить("Настройки", Неопределено);
Возврат ПараметрыОбработки;
КонецФункции
// <Возвращает соответствие со сценариями и их настройками>
//
// Параметры:
// КаталогРепозитория - <Строка> - <Адрес каталога репозитория>
// ИменаЗагружаемыхСценариев - <Массив.Строка> - <Предназначен для переопределения сценариев,
// Если задан загрузятся только они >
//
// Возвращаемое значение:
// <Соответствие> - <ключ - Ключ структуры настроек прекоммит или
// путь к каталогу, который обрабатывается
// нестандартными правилами >
//
Функция ПолучитьСценарииСПараметрамиВыполнения(КаталогРепозитория, ИменаЗагружаемыхСценариев = Неопределено) Экспорт
ПараметрыОбработки = СценарииОбработки.ПолучитьСтандартныеПараметрыОбработки();
ПараметрыОбработки.КаталогРепозитория = КаталогРепозитория;
НастройкиПроектов = МенеджерНастроек.ПроектыКонфигурации();
НаборНастроек = Новый Соответствие;
Для Каждого ИмяПроекта Из НастройкиПроектов Цикл
Настройка = НастройкаОбработкиПроекта(ИмяПроекта, КаталогРепозитория, ИменаЗагружаемыхСценариев);
НаборНастроек.Вставить(ИмяПроекта, Настройка);
КонецЦикла;
ИмяПроекта = ""; // Базовые настройки
Настройка = НастройкаОбработкиПроекта(ИмяПроекта, КаталогРепозитория, ИменаЗагружаемыхСценариев);
НаборНастроек.Вставить(ИмяПроекта, Настройка);
Возврат НаборНастроек;
КонецФункции
Функция НастройкаОбработкиПроекта(ИмяПроекта, КаталогРепозитория, Знач ИменаЗагружаемыхСценариев = Неопределено)
Настройка = Новый Структура("СценарииОбработки, НастройкиСценариев");
Если ИменаЗагружаемыхСценариев = Неопределено Тогда
ИменаЗагружаемыхСценариев = МенеджерНастроек.ИменаЗагружаемыхСценариев(ИмяПроекта)
КонецЕсли;
Настройка.СценарииОбработки = СценарииОбработки.Загрузить(КаталогРепозитория,
ИмяПроекта,
ИменаЗагружаемыхСценариев);
Настройка.НастройкиСценариев = МенеджерНастроек.НастройкиПроекта(ИмяПроекта);
Возврат Настройка;
КонецФункции
Функция ПолучитьПараметрыОбработкиФайла(ИмяФайла, НастройкиПроектов) Экспорт
ИмяОбщейНастройки = МенеджерНастроек.КлючНастройкиPrecommit();
НайденнаяНастройка = НастройкиПроектов.Получить(ИмяОбщейНастройки);
Для Каждого ЭлементНастройки Из НастройкиПроектов Цикл
Если ЭлементНастройки.Ключ = ИмяОбщейНастройки Тогда
Продолжить;
ИначеЕсли СтрНачинаетсяС(ИмяФайла, ЭлементНастройки.Ключ) Тогда
НайденнаяНастройка = ЭлементНастройки.Значение;
Иначе
// ничего
КонецЕсли;
КонецЦикла;
Возврат НайденнаяНастройка;
КонецФункции
Функция ГлобальныеСценарии() Экспорт
Возврат МенеджерНастроек.ПолучитьИменаСценариевКаталога(МенеджерПриложения.КаталогСценариев());
КонецФункции
Функция НастройкиГлобальныхСценариев() Экспорт
Возврат НастройкиСценариев(ГлобальныеСценарии(), МенеджерПриложения.КаталогСценариев());
КонецФункции
Функция НастройкиСценариев(ИменаСценариев, Знач КаталогСценариев = Неопределено) Экспорт
Если КаталогСценариев = Неопределено Тогда
КаталогСценариев = МенеджерПриложения.КаталогСценариев();
КонецЕсли;
НастройкиСценариев = Новый Соответствие;
Рефлектор = Новый Рефлектор;
Для Каждого ИмяСценария Из ИменаСценариев Цикл
ОбъектСценария = ЗагрузитьСценарий(ОбъединитьПути(КаталогСценариев, ИмяСценария));
Если Рефлектор.МетодСуществует(ОбъектСценария, "ПолучитьСтандартныеНастройкиСценария") Тогда
СтруктураНастроек = Рефлектор.ВызватьМетод(ОбъектСценария, "ПолучитьСтандартныеНастройкиСценария");
НастройкиСценариев.Вставить(СтруктураНастроек.ИмяСценария, СтруктураНастроек.Настройка);
КонецЕсли;
КонецЦикла;
Возврат НастройкиСценариев;
КонецФункции

View File

@ -130,9 +130,13 @@
// Строка - относительный путь файла
//
Функция ПолучитьНормализованныйОтносительныйПуть(Знач ПутьКорневогоКаталога, Знач ОтносительныйПутьФайла) Экспорт
ПроверитьКорневойКаталог(ПутьКорневогоКаталога);
Если СтрНачинаетсяС(ОтносительныйПутьФайла, ПолучитьРазделительПути()) Тогда
ОтносительныйПутьФайла = Сред(ОтносительныйПутьФайла, 2);
КонецЕсли;
ПолныйПутьФайла = ОбъединитьПути(ПутьКорневогоКаталога, ОтносительныйПутьФайла);
ОтносительныйПуть = ОтносительныйПуть(ПутьКорневогоКаталога, ПолныйПутьФайла, ПолучитьРазделительПути());
Файл = Новый Файл(ПолныйПутьФайла);
@ -163,6 +167,42 @@
КонецФункции
Функция НайтиКаталоги(Путь) Экспорт
МассивКаталогов = Новый Массив;
ФайлКаталога = Новый Файл(Путь);
Если ФайлКаталога.Существует() И ФайлКаталога.ЭтоКаталог() Тогда
МассивФайлов = НайтиФайлы(ФайлКаталога.ПолноеИмя, "*");
Для Каждого Файл Из МассивФайлов Цикл
Если Файл.ЭтоКаталог() Тогда
МассивКаталогов.Добавить(Файл);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат МассивКаталогов;
КонецФункции
Функция КаталогСуществует(Знач Путь1, Знач Путь2 = Неопределено, Знач Путь3 = Неопределено, Знач Путь4 = Неопределено) Экспорт
ПолныйПуть = ОбъединитьПути(Путь1, Путь2, Путь3, Путь4);
Файл = Новый Файл(ПолныйПуть);
Возврат Файл.Существует() И Файл.ЭтоКаталог();
КонецФункции
Процедура ПроверитьКорневойКаталог(ПутьКорневогоКаталога)
Если ПустаяСтрока(ПутьКорневогоКаталога) Тогда
@ -171,4 +211,4 @@
КонецЕсли;
КонецПроцедуры
КонецПроцедуры

View File

@ -4,6 +4,8 @@
//
///////////////////////////////////////////////////////////////////////////////
Перем КорневойПуть;
// ИмяСценария
// Возвращает имя сценария обработки файлов
//
@ -40,7 +42,7 @@
Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария());
Если СинхронизироватьМетаданныеиФайлы(АнализируемыйФайл.ПолноеИмя, ДополнительныеПараметры.ИзмененныеКаталоги) Тогда
Если СинхронизироватьМетаданныеИФайлы(АнализируемыйФайл.ПолноеИмя, ДополнительныеПараметры.ИзмененныеКаталоги) Тогда
ДополнительныеПараметры.ИзмененныеКаталоги.Добавить(АнализируемыйФайл.ПолноеИмя);
@ -50,85 +52,56 @@
КонецЕсли;
Возврат ЛОЖЬ;
Возврат Ложь;
КонецФункции // ОбработатьФайл()
Функция СинхронизироватьМетаданныеиФайлы(Знач ИмяФайла, УдаленныеФайлы)
Функция СинхронизироватьМетаданныеИФайлы(Знач ИмяФайла, УдаленныеФайлы)
СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(ИмяФайла);
Регексп = Новый РегулярноеВыражение("(<ChildObjects>\s+?)([\w\W]+?)(\s+<\/ChildObjects>)");
Регексп.ИгнорироватьРегистр = ИСТИНА;
Регексп.Многострочный = ИСТИНА;
ПодчиненныеМетаданные = Регексп.НайтиСовпадения(СодержимоеФайла);
Если ПодчиненныеМетаданные.Количество() = 0 Тогда
Возврат Ложь;
ДочерниеЭлементы = РегулярныеВыражения.ПолучитьДочерниеЭлементыОписанияКонфигурации(СодержимоеФайла);
Если ДочерниеЭлементы.Количество = 0 Тогда
Возврат Ложь;
КонецЕсли;
ИсходнаяСтрока = ПодчиненныеМетаданные[0].Группы[2].Значение;
РегекспМетаданные = Новый РегулярноеВыражение("^\s+<([\w]+)>([а-яa-zA-ZА-Я0-9_]+)<\/[\w]+>");
РегекспМетаданные.ИгнорироватьРегистр = ИСТИНА;
РегекспМетаданные.Многострочный = Истина;
ОбъектыМетаданныхСтроки = РегекспМетаданные.НайтиСовпадения(ИсходнаяСтрока);
ОбъектыМетаданных = Новый ТаблицаЗначений;
ОбъектыМетаданных.Колонки.Добавить("ТипМетаданных");
ОбъектыМетаданных.Колонки.Добавить("ИмяМетаданных");
Для Каждого ОбъектМетаданных Из ОбъектыМетаданныхСтроки Цикл
НоваяЗапись = ОбъектыМетаданных.Добавить();
НоваяЗапись.ТипМетаданных = ОбъектМетаданных.Группы[1].Значение;
НоваяЗапись.ИмяМетаданных = ОбъектМетаданных.Группы[2].Значение;
КонецЦикла;
ОбъектыМетаданных.Свернуть("ТипМетаданных, ИмяМетаданных", "");
// Это те объекты, которые есть в описании конфигурации
ОбъектыМетаданных = ПолучитьОбъектыМетаданных(ДочерниеЭлементы.Совпадения);
// Список базовых типов метаданных
СписокКаталогов = СписокКаталоговТиповМетаданных();
КорневойПуть = Новый Файл(ИмяФайла);
КорневойПуть = КорневойПуть.Путь;
СписокДляУдаления = Новый СписокЗначений;
КорневойПуть = Новый Файл(ИмяФайла).Путь;
СписокДляУдаления = Новый Массив;
ЕдиныйТекстОшибки = "";
Для Каждого КаталогИзСписка Из СписокКаталогов Цикл
ТекстОшибок = Новый Массив;
Для Каждого КаталогСписка Из СписокКаталогов Цикл
ОбъектыМетаданныхТипа = ОбъектыМетаданных.НайтиСтроки(Новый Структура("ТипМетаданных", КаталогИзСписка.Представление));
Каталог = Новый Файл(ОбъединитьПути(КорневойПуть, КаталогИзСписка.Значение));
Если НЕ Каталог.Существует() Тогда
Если ОбъектыМетаданныхТипа.Количество() Тогда
// каталога нет, а должен быть
ЕдиныйТекстОшибки = ЕдиныйТекстОшибки + ?(ПустаяСтрока(ЕдиныйТекстОшибки), "", Символы.ПС) + "Отсутствует каталог " + КаталогИзСписка.Значение;
КонецЕсли;
Если ПроверитьКаталог(КаталогСписка, ОбъектыМетаданных, СписокДляУдаления, ТекстОшибок) Тогда
Продолжить;
КонецЕсли;
// Если типа метаданных нет, то просто удаляем каталог
Если НЕ ОбъектыМетаданныхТипа.Количество() Тогда
СписокДляУдаления.Добавить(Каталог.ПолноеИмя);
Продолжить;
КонецЕсли;
Каталог = Новый Файл(ОбъединитьПути(КорневойПуть, КаталогСписка.Значение));
// Проверка содержимого каталога
ВсеФайлыОбъектовТипа = НайтиФайлы(Каталог.ПолноеИмя, "*.xml");
НадоПропустить = Новый Массив;
НадоПропустить = Новый ТаблицаЗначений;
НадоПропустить.Колонки.Добавить("Имя");
НадоПропустить.Колонки.Добавить("НормализованноеИмя");
Для Каждого ФайлОбъектаТипа Из ВсеФайлыОбъектовТипа Цикл
Если НадоПропустить.Найти(ФайлОбъектаТипа.ИмяБезРасширения) <> Неопределено Тогда
Продолжить;
КонецЕсли;
НадоПропустить.Добавить(ФайлОбъектаТипа.ИмяБезРасширения);
СуществующиеОбъекты = ОбъектыМетаданных.НайтиСтроки(Новый Структура("ТипМетаданных, ИмяМетаданных", КаталогИзСписка.Представление, ФайлОбъектаТипа.ИмяБезРасширения));
Строка = НадоПропустить.Добавить();
Строка.Имя = ФайлОбъектаТипа.ИмяБезРасширения;
Строка.НормализованноеИмя = Нормализовать(ФайлОбъектаТипа.ИмяБезРасширения);
СтруктураОтбора = Новый Структура("ТипМетаданных, ИмяМетаданных",
КаталогСписка.Представление, ФайлОбъектаТипа.ИмяБезРасширения);
СуществующиеОбъекты = ОбъектыМетаданных.НайтиСтроки(СтруктураОтбора);
Если СуществующиеОбъекты.Количество() Тогда
Для Каждого УдаляемаяСтрока Из СуществующиеОбъекты Цикл
@ -136,7 +109,7 @@
ОбъектыМетаданных.Удалить(УдаляемаяСтрока);
КонецЦикла;
Продолжить;
КонецЕсли;
@ -147,65 +120,54 @@
СписокДляУдаления.Добавить(ФайлОбъектаТипаКаталог.ПолноеИмя);
КонецЦикла;
ВсеФайлыОбъектовТипа = НайтиФайлы(Каталог.ПолноеИмя, "*");
ВсеФайлыОбъектовТипа = ФайловыеОперации.НайтиКаталоги(Каталог.ПолноеИмя);
Для Каждого ФайлОбъектаТипа Из ВсеФайлыОбъектовТипа Цикл
Если НЕ ФайлОбъектаТипа.ЭтоКаталог() Тогда
Продолжить;
КонецЕсли;
Если НадоПропустить.Найти(ФайлОбъектаТипа.ИмяБезРасширения) <> Неопределено Тогда
Продолжить;
КонецЕсли;
// остатки файлов надо удалить
// Ситуация редкая, проверим в самом конце на регистр
Строки = НадоПропустить.НайтиСтроки(Новый Структура("НормализованноеИмя", Нормализовать(ФайлОбъектаТипа.ИмяБезРасширения)));
Если Строки.Количество() Тогда
ОшибкаСтр = СтрШаблон("Имя каталога %2 отличается от метаданного %1. Надо переименовать папку %3", Строки[0].Имя, ФайлОбъектаТипа.ИмяБезРасширения, ФайлОбъектаТипа.ПолноеИмя);
ТекстОшибок.Добавить(ОшибкаСтр);
Продолжить;
КонецЕсли;
// Остатки файлов надо удалить
СписокДляУдаления.Добавить(ФайлОбъектаТипа.ПолноеИмя);
КонецЦикла;
КонецЦикла;
МассивИсключенийМетаданных = ПолучитьМассивИсключенийМетаданных();
// проверка наличия объектов, для которых нет каталогов
Если ОбъектыМетаданных.Количество() Тогда
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Если МассивИсключенийМетаданных.Найти(ОбъектМетаданных.ТипМетаданных) <> Неопределено Тогда
Продолжить;
КонецЕсли;
ЕдиныйТекстОшибки = ЕдиныйТекстОшибки + ?(ПустаяСтрока(ЕдиныйТекстОшибки), "", Символы.ПС)
+ "Отсутствуют файлы для " + ОбъектМетаданных.ТипМетаданных + "." + ОбъектМетаданных.ИмяМетаданных;
КонецЦикла;
ПеренестиМетаданныеВОшибку(ОбъектыМетаданных, ТекстОшибок);
// Разбор файлов для удаления в строку с ошибкой
Если СписокДляУдаления.Количество() Тогда
СтрокаОшибки = "Необходимо удалить файлы ";
СтрокаОшибки = СтрокаОшибки + СтрСоединить(СписокДляУдаления, Символы.ПС + СтрокаОшибки);
ТекстОшибок.Добавить(СтрокаОшибки);
КонецЕсли;
Для Каждого ФайлДляУдаления Из СписокДляУдаления Цикл
ЕдиныйТекстОшибки = ЕдиныйТекстОшибки + ?(ПустаяСтрока(ЕдиныйТекстОшибки), "", Символы.ПС)
+ "Необходимо удалить файлы " + ФайлДляУдаления.Значение;
КонецЦикла;
ЕдиныйТекстОшибки = СтрСоединить(ТекстОшибок, Символы.ПС);
Если НЕ ПустаяСтрока(ЕдиныйТекстОшибки) Тогда
ВызватьИсключение ЕдиныйТекстОшибки;
КонецЕсли;
Возврат Истина;
КонецФункции
Функция ПолучитьМассивИсключенийМетаданных()
Функция ПолучитьМассивИсключенийМетаданных()
МассивИсключений = Новый Массив();
МассивИсключений.Добавить("Sequence");
@ -264,3 +226,81 @@
Возврат Список;
КонецФункции
// В данном случае для нормализации используются символы с которых не может начинаться имя метаданного в 1С для того,
// чтобы не вызвать пересечение при приведении к регистру
Функция Нормализовать(ИмяМетаданного)
Возврат ВРег("%" + ИмяМетаданного);
КонецФункции
Функция ПолучитьОбъектыМетаданных(КоллекцияСовпадений)
ОбъектыМетаданных = Новый ТаблицаЗначений;
ОбъектыМетаданных.Колонки.Добавить("ТипМетаданных");
ОбъектыМетаданных.Колонки.Добавить("ИмяМетаданных");
Для Каждого ОбъектМетаданных Из КоллекцияСовпадений Цикл
НоваяЗапись = ОбъектыМетаданных.Добавить();
НоваяЗапись.ТипМетаданных = ОбъектМетаданных.Группы[1].Значение;
НоваяЗапись.ИмяМетаданных = ОбъектМетаданных.Группы[2].Значение;
КонецЦикла;
ОбъектыМетаданных.Свернуть("ТипМетаданных, ИмяМетаданных", "");
Возврат ОбъектыМетаданных;
КонецФункции
Функция ПроверитьКаталог(КаталогСписка, ОбъектыМетаданных, СписокДляУдаления, ТекстОшибок)
ОстановитьПроверкуКаталога = Ложь;
ОбъектыМетаданныхТипа = ОбъектыМетаданных.НайтиСтроки(Новый Структура("ТипМетаданных", КаталогСписка.Представление));
Каталог = Новый Файл(ОбъединитьПути(КорневойПуть, КаталогСписка.Значение));
Если НЕ Каталог.Существует() Тогда
Если ОбъектыМетаданныхТипа.Количество() Тогда
// каталога нет, а должен быть
ТекстОшибок.Добавить(СтрШаблон("Отсутствует каталог %1", КаталогСписка.Значение));
КонецЕсли;
ОстановитьПроверкуКаталога = Истина;
КонецЕсли;
// Если типа метаданных нет, то просто удаляем каталог
Если НЕ ОстановитьПроверкуКаталога И НЕ ОбъектыМетаданныхТипа.Количество() Тогда
СписокДляУдаления.Добавить(Каталог.ПолноеИмя);
ОстановитьПроверкуКаталога = Истина;
КонецЕсли;
Возврат ОстановитьПроверкуКаталога;
КонецФункции
Процедура ПеренестиМетаданныеВОшибку(ОбъектыМетаданных, ТекстОшибок)
МассивИсключенийМетаданных = ПолучитьМассивИсключенийМетаданных();
// проверка наличия оставшихся объектов, для которых нет каталогов
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Если МассивИсключенийМетаданных.Найти(ОбъектМетаданных.ТипМетаданных) <> Неопределено Тогда
Продолжить;
КонецЕсли;
ТекстОшибок.Добавить(СтрШаблон("Отсутствуют файлы для %1.%2", ОбъектМетаданных.ТипМетаданных, ОбъектМетаданных.ИмяМетаданных));
КонецЦикла;
КонецПроцедуры

View File

@ -148,7 +148,7 @@
СодержимоеФайла = Текст.Прочитать();
Текст.Закрыть();
Регексп = Новый РегулярноеВыражение("(<\/languages>\s*?)([\w\W]*)(<\/mdclass\:Configuration>)");
Регексп = Новый РегулярноеВыражение("(<\/languages>\s*)([\w\W]*)(<\/mdclass\:Configuration>)");
Регексп.ИгнорироватьРегистр = ИСТИНА;
Регексп.Многострочный = ИСТИНА;
ПодчиненныеМетаданные = Регексп.НайтиСовпадения(СодержимоеФайла);

View File

@ -0,0 +1,31 @@
{
"GLOBAL": {
"ВерсияПлатформы": "8.3.10.2580",
"version": "2.0",
"ФорматEDT": true
},
"Precommt4onecСценарии": {
"ИспользоватьСценарииРепозитория": false,
"КаталогЛокальныхСценариев": "",
"ГлобальныеСценарии": [
"УдалениеДублейМетаданных.os",
"УдалениеЛишнихКонцевыхПробелов.os",
"УдалениеЛишнихПустыхСтрок.os"
],
"НастройкиСценариев": {
"ОтключениеПолнотекстовогоПоиска": {
"МетаданныеДляИсключения": {
"src\\_example.xml": [
"Номер",
"ТабличнаяЧасть1.Реквизит"
],
"src\\_example2.xml": []
}
},
"РазборОтчетовОбработокРасширений": {
"ИспользоватьНастройкиПоУмолчанию": true,
"ВерсияПлатформы": ""
}
}
}
}

View File

@ -0,0 +1,14 @@
{
"GLOBAL": {
"ВерсияПлатформы": "8.3.10.2580",
"version": "2.0",
"ФорматEDT": true
},
"АвтоТестирование": {
"Выполнять": true,
"ВыполнятьБазовые": true,
"ВыполнятьxUnit": true,
"РасширениеДляxUnit": true,
"ВыполнятьVanessa": true
}
}

View File

@ -0,0 +1,32 @@
{
"GLOBAL": {
"ВерсияПлатформы": "8.3.10.2580",
"version": "2.0",
"ФорматEDT": true
},
"Precommt4onecСценарии": {
"ИспользоватьСценарииРепозитория": false,
"КаталогЛокальныхСценариев": "",
"ОтключенныеСценарии": [
"ВставкаКопирайтовBIA.os",
"УдалениеДублейМетаданных.os",
"УдалениеЛишнихКонцевыхПробелов.os",
"УдалениеЛишнихПустыхСтрок.os"
],
"НастройкиСценариев": {
"ОтключениеПолнотекстовогоПоиска": {
"МетаданныеДляИсключения": {
"src\\_example.xml": [
"Номер",
"ТабличнаяЧасть1.Реквизит"
],
"src\\_example2.xml": []
}
},
"РазборОтчетовОбработокРасширений": {
"ИспользоватьНастройкиПоУмолчанию": true,
"ВерсияПлатформы": ""
}
}
}
}

View File

@ -0,0 +1,40 @@
{
"GLOBAL": {
"ВерсияПлатформы": "8.3.10.2580",
"version": "2.0",
"ФорматEDT": true
},
"Precommt4onecСценарии": {
"ИспользоватьСценарииРепозитория": false,
"КаталогЛокальныхСценариев": "",
"ГлобальныеСценарии": [
"РазборОбычныхФормНаИсходники.os",
"РазборОтчетовОбработокРасширений.os",
"СинхронизацияОбъектовМетаданныхИФайлов.os",
"СортировкаДереваМетаданных.os",
"УдалениеДублейМетаданных.os",
"УдалениеЛишнихКонцевыхПробелов.os",
"УдалениеЛишнихПустыхСтрок.os"
],
"ОтключенныеСценарии": [
"УдалениеДублейМетаданных.os",
"УдалениеЛишнихКонцевыхПробелов.os",
"УдалениеЛишнихПустыхСтрок.os"
],
"НастройкиСценариев": {
"ОтключениеПолнотекстовогоПоиска": {
"МетаданныеДляИсключения": {
"src\\_example.xml": [
"Номер",
"ТабличнаяЧасть1.Реквизит"
],
"src\\_example2.xml": []
}
},
"РазборОтчетовОбработокРасширений": {
"ИспользоватьНастройкиПоУмолчанию": true,
"ВерсияПлатформы": ""
}
}
}
}

View File

@ -0,0 +1,49 @@
{
"GLOBAL": {
"ВерсияПлатформы": "8.3.10.2580",
"version": "2.0",
"ФорматEDT": true
},
"Precommt4onecСценарии": {
"ИспользоватьСценарииРепозитория": true,
"КаталогЛокальныхСценариев": "",
"ОтключенныеСценарии": ["УдалениеДублейМетаданных.os"],
"НастройкиСценариев": {
"ОтключениеПолнотекстовогоПоиска": {
"МетаданныеДляИсключения": {
"src\\Документ1.mdo": []
}
},
"РазборОтчетовОбработокРасширений": {
"ИспользоватьНастройкиПоУмолчанию": true,
"ВерсияПлатформы": ""
},
"":{
}
},
"Проекты":{
"configuration\\": {
"ИспользоватьСценарииРепозитория": false,
"ГлобальныеСценарии": []
},
"ext\\extension1\\": {
"ИспользоватьСценарииРепозитория": true,
"ОтключенныеСценарии": [],
"КаталогЛокальныхСценариев": "localscenario",
"НастройкиСценариев": {
"ОтключениеПолнотекстовогоПоиска": {
"МетаданныеДляИсключения": {
"src\\Документ2.mdo": []
}
},
"РазборОтчетовОбработокРасширений": {
"ИспользоватьНастройкиПоУмолчанию": true,
"ВерсияПлатформы": ""
}
}
}
}
}
}

View File

@ -0,0 +1,176 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4">
<Configuration uuid="a9e56180-7614-44a3-b39f-37c57faf81db">
<InternalInfo>
<xr:ContainedObject>
<xr:ClassId>9cd510cd-abfc-11d4-9434-004095e12fc7</xr:ClassId>
<xr:ObjectId>61441f19-9f51-458a-b3c1-096710909ca5</xr:ObjectId>
</xr:ContainedObject>
<xr:ContainedObject>
<xr:ClassId>9fcd25a0-4822-11d4-9414-008048da11f9</xr:ClassId>
<xr:ObjectId>e0886af0-d116-4dda-8bb6-1395b88a5024</xr:ObjectId>
</xr:ContainedObject>
<xr:ContainedObject>
<xr:ClassId>e3687481-0a87-462c-a166-9f34594f9bba</xr:ClassId>
<xr:ObjectId>1c7012cd-fd33-4338-83d7-fd2b0f8ed99d</xr:ObjectId>
</xr:ContainedObject>
<xr:ContainedObject>
<xr:ClassId>9de14907-ec23-4a07-96f0-85521cb6b53b</xr:ClassId>
<xr:ObjectId>bcf5db24-8183-4235-a2e9-71c69d8241ee</xr:ObjectId>
</xr:ContainedObject>
<xr:ContainedObject>
<xr:ClassId>51f2d5d8-ea4d-4064-8892-82951750031e</xr:ClassId>
<xr:ObjectId>328ab8b4-edfe-4635-9540-12b512d5eb6d</xr:ObjectId>
</xr:ContainedObject>
<xr:ContainedObject>
<xr:ClassId>e68182ea-4237-4383-967f-90c1e3370bc7</xr:ClassId>
<xr:ObjectId>b0523782-50dc-4ee1-8d2b-97d3c9cfa538</xr:ObjectId>
</xr:ContainedObject>
</InternalInfo>
<Properties>
<Name>СервиснаяСистема</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>ServiceDataBase</v8:content>
</v8:item>
</Synonym>
<Comment/>
<NamePrefix/>
<ConfigurationExtensionCompatibilityMode>Version8_3_10</ConfigurationExtensionCompatibilityMode>
<DefaultRunMode>ManagedApplication</DefaultRunMode>
<UsePurposes>
<v8:Value xsi:type="app:ApplicationUsePurpose">PersonalComputer</v8:Value>
</UsePurposes>
<ScriptVariant>Russian</ScriptVariant>
<DefaultRoles>
<xr:Item xsi:type="xr:MDObjectRef">Role.Администратор</xr:Item>
</DefaultRoles>
<Vendor>BIA Tecnologies, LLC</Vendor>
<Version>3.1.0.0</Version>
<UpdateCatalogAddress/>
<IncludeHelpInContents>false</IncludeHelpInContents>
<UseManagedFormInOrdinaryApplication>true</UseManagedFormInOrdinaryApplication>
<UseOrdinaryFormInManagedApplication>true</UseOrdinaryFormInManagedApplication>
<AdditionalFullTextSearchDictionaries/>
<CommonSettingsStorage/>
<ReportsUserSettingsStorage/>
<ReportsVariantsStorage/>
<FormDataSettingsStorage/>
<DynamicListsUserSettingsStorage/>
<Content/>
<DefaultReportForm>CommonForm.ОбщаяФормаОтчета</DefaultReportForm>
<DefaultReportVariantForm/>
<DefaultReportSettingsForm/>
<DefaultDynamicListSettingsForm/>
<DefaultSearchForm/>
<RequiredMobileApplicationPermissions>
<v8:pair>
<v8:Key xsi:type="app:RequiredMobileApplicationPermissions">Multimedia</v8:Key>
<v8:Value xsi:type="xs:boolean">false</v8:Value>
</v8:pair>
<v8:pair>
<v8:Key xsi:type="app:RequiredMobileApplicationPermissions">Location</v8:Key>
<v8:Value xsi:type="xs:boolean">false</v8:Value>
</v8:pair>
<v8:pair>
<v8:Key xsi:type="app:RequiredMobileApplicationPermissions">Contacts</v8:Key>
<v8:Value xsi:type="xs:boolean">false</v8:Value>
</v8:pair>
<v8:pair>
<v8:Key xsi:type="app:RequiredMobileApplicationPermissions">Calendars</v8:Key>
<v8:Value xsi:type="xs:boolean">false</v8:Value>
</v8:pair>
<v8:pair>
<v8:Key xsi:type="app:RequiredMobileApplicationPermissions">Telephony</v8:Key>
<v8:Value xsi:type="xs:boolean">false</v8:Value>
</v8:pair>
<v8:pair>
<v8:Key xsi:type="app:RequiredMobileApplicationPermissions">PushNotification</v8:Key>
<v8:Value xsi:type="xs:boolean">false</v8:Value>
</v8:pair>
<v8:pair>
<v8:Key xsi:type="app:RequiredMobileApplicationPermissions">LocalNotification</v8:Key>
<v8:Value xsi:type="xs:boolean">false</v8:Value>
</v8:pair>
<v8:pair>
<v8:Key xsi:type="app:RequiredMobileApplicationPermissions">Print</v8:Key>
<v8:Value xsi:type="xs:boolean">false</v8:Value>
</v8:pair>
<v8:pair>
<v8:Key xsi:type="app:RequiredMobileApplicationPermissions">InAppPurchases</v8:Key>
<v8:Value xsi:type="xs:boolean">false</v8:Value>
</v8:pair>
<v8:pair>
<v8:Key xsi:type="app:RequiredMobileApplicationPermissions">Ads</v8:Key>
<v8:Value xsi:type="xs:boolean">false</v8:Value>
</v8:pair>
</RequiredMobileApplicationPermissions>
<MainClientApplicationWindowMode>Normal</MainClientApplicationWindowMode>
<DefaultInterface/>
<DefaultStyle/>
<DefaultLanguage>Language.Русский</DefaultLanguage>
<BriefInformation>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Сервисная ИС</v8:content>
</v8:item>
</BriefInformation>
<DetailedInformation>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Сервисная ИС для выполнения различных задач, не связанных с реальным бизнесом
</v8:content>
</v8:item>
</DetailedInformation>
<Copyright>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>© ООО "БиАйЭй-Технолоджиз" (BIA-Technologies LLC). 2014-2018. Все права защищены. Все торговые марки являются собственностью их правообладателей.</v8:content>
</v8:item>
</Copyright>
<VendorInformationAddress>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>www.bia-tech.ru</v8:content>
</v8:item>
</VendorInformationAddress>
<ConfigurationInformationAddress/>
<DataLockControlMode>Managed</DataLockControlMode>
<ObjectAutonumerationMode>AutoFree</ObjectAutonumerationMode>
<ModalityUseMode>DontUse</ModalityUseMode>
<SynchronousPlatformExtensionAndAddInCallUseMode>Use</SynchronousPlatformExtensionAndAddInCallUseMode>
<InterfaceCompatibilityMode>TaxiEnableVersion8_2</InterfaceCompatibilityMode>
<CompatibilityMode>Version8_3_10</CompatibilityMode>
<DefaultConstantsForm>CommonForm.НастройкаСистемы</DefaultConstantsForm>
</Properties>
<ChildObjects>
<Language>Русский</Language>
<Subsystem>ПодсистемыБСП</Subsystem>
<CommonPicture>GUID</CommonPicture>
<SessionParameter>автоТестирование</SessionParameter>
<Role>АвтоТестированиеАдминистратор</Role>
<CommonTemplate>HiddenStart</CommonTemplate>
<CommonModule>sFTPКлиентСервер</CommonModule>
<CommonAttribute>UID</CommonAttribute>
<XDTOPackage>bsp_ancillary</XDTOPackage>
<WebService>ancillary</WebService>
<WebService>bus_DataReceiving</WebService>
<EventSubscription>ВерсионированиеПриЗаписи</EventSubscription>
<ScheduledJob>РоботАвтоматическаяОбработкаИзмененийАдресногоКлассификатора</ScheduledJob>
<FunctionalOption>ВестиЖурналДействийПользователя</FunctionalOption>
<DefinedType>ТипUIDСтрока</DefinedType>
<CommonCommand>АудиторскийСлед</CommonCommand>
<CommandGroup>Печать</CommandGroup>
<Constant>АдресатыПолученияУведомленийОбИзмененияхВАлгоритмах</Constant>
<CommonForm>АвторизацияПользователя</CommonForm>
<Catalog>АдресаЭлектроннойПочты</Catalog>
<Document>АттестацияРазработчика</Document>
<Enum>ВариантХраненияФайлов</Enum>
<Report>анализЖурналаРегистрации</Report>
<DataProcessor>активныеПользователи</DataProcessor>
<InformationRegister>администраторыБаз</InformationRegister>
<ChartOfCharacteristicTypes>РасширенныеХарактеристикиОбъектов</ChartOfCharacteristicTypes>
</ChildObjects>
</Configuration>
</MetaDataObject>

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4">
<WebService uuid="d0090620-bf34-4897-bd00-a3b1cb21e35d">
<Properties>
<Name>techServices</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Tech services</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Namespace>http://local.dellin.ru/tech</Namespace>
<XDTOPackages>
<xr:Item>
<xr:Presentation/>
<xr:CheckState>0</xr:CheckState>
<xr:Value xsi:type="xr:MDObjectRef">XDTOPackage.dellin_tech</xr:Value>
</xr:Item>
</XDTOPackages>
<DescriptorFileName>techServices.1cws</DescriptorFileName>
<ReuseSessions>AutoUse</ReuseSessions>
<SessionMaxAge>20</SessionMaxAge>
</Properties>
<ChildObjects>
<Operation uuid="f23afc05-ff66-4d5e-8f90-9d0449c76218">
<Properties>
<Name>ping</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Ping</v8:content>
</v8:item>
</Synonym>
<Comment/>
<XDTOReturningValueType>xs:string</XDTOReturningValueType>
<Nillable>false</Nillable>
<Transactioned>false</Transactioned>
<ProcedureName>ping</ProcedureName>
<DataLockControlMode>Managed</DataLockControlMode>
</Properties>
<ChildObjects/>
</Operation>
</ChildObjects>
</WebService>
</MetaDataObject>

View File

@ -0,0 +1,117 @@
{
"GLOBAL": {
"ВерсияПлатформы": "8.3.10.2580",
"version": "2.0",
"ФорматEDT": true,
"ВыполнятьНа": "NODE"
},
"АвтоТестирование": {
"Выполнять": false,
"ВыполнятьxUnit": true,
"ВыполнятьVanessa": true,
"РасширениеДляxUnit": true
},
"АвтоДокументирование": {
"Выполнять": true,
"КодПространстваConfluence": "bsp",
"ПоследнийОбработанныйКоммит": "",
"Шаблоны": "",
"КомандыПередВыполнением": [
"tools\\clear-patches.os"
]
},
"АнализИсходников": {
"Выполнять": false,
"БазовыйBIA": true,
"ВыполнятьСинтаксическуюПроверкуКонфигурации": true,
"SonarQube": false,
"ДочерниеПроекты":[],
"SQИспользоватьСпециальнуюНоду": false
},
"АвтоСборка": {
"ВключитьНомерСборки": true,
"ОбновлятьВерсиюКонфигурации": true,
"КаталогРасположенияСборок": "\\\\dellin.local\\bia\\СРПО\\1с_install\\Конфигурации ДЛ\\БПСДЛ (тестовые версии)\\БСП",
"КаталогРасположенияСборокRelease": "\\\\dellin.local\\bia\\СРПО\\1с_install\\Конфигурации ДЛ\\БСП",
"КаталогиВерсийОбновления": [
"\\\\dellin.local\\bia\\СРПО\\1с_install\\Конфигурации ДЛ\\БСП",
"\\\\dellin.local\\bia\\СРПО\\1с_install\\Конфигурации ДЛ\\БСП MINI",
"\\\\dellin.local\\bia\\СРПО\\1с_install\\Конфигурации ДЛ\\БПСДЛ_2",
"\\\\dellin.local\\bia\\СРПО\\1с_install\\Конфигурации ДЛ\\БСП29\\prod"
],
"КомандыПередВыполнением": [
"tools\\clear-patches.os"
],
"КаталогРасположенияОбразов": "\\\\dellin.local\\bia\\СРПО\\1с_install\\Конфигурации ДЛ\\БСП\\spec",
"ВыполнятьНаСервернойБазе": false
},
"ТестоваяСервернаяБаза": {
"АдресСервера": "address",
"ИмяБазы": "basename",
"Пользователь": "autotest",
"Пароль": ""
},
"Продуктив": {
"ВыполнятьОбновлениеСтенда": false,
"АдресСервера": "address",
"ИмяБазы": "basename",
"Пользователь": "autotest",
"Пароль": "",
"КомандыПередВыполнением": [],
"ВыполнятьСценарииПослеОбновления": true,
"КомандыПослеОбновления": [
"tools\\addSonarRules.os"
]
},
"Уведомления": {
"Выполнять": true,
"Ответственные": [
{
"Адресат": "arch-bots",
"Транспорт": "rocketchat"
}
]
},
"Сонар":{
"Сервер": "c7-sonar-server.tlc.lan",
"Порт": "9000",
"Токен": "6c0a7cc2bf2e8f054562da6fabf3f2bf41e7a308",
"Профили": "bsl bia; Sonar way (outdated copy)"
},
"Precommt4onecСценарии": {
"ИспользоватьСценарииРепозитория": false,
"КаталогЛокальныхСценариев": "",
"ГлобальныеСценарии": [
"ДобавлениеПробеловПередКлючевымиСловами.os",
"ЗапретИспользованияПерейти.os",
"ИсправлениеНеКаноническогоНаписания.os",
"КорректировкаXMLФорм.os",
"ОтключениеПолнотекстовогоПоиска.os",
"ПроверкаДублейПроцедурИФункций.os",
"ПроверкаКорректностиОбластей.os",
"РазборОбычныхФормНаИсходники.os",
"РазборОтчетовОбработокРасширений.os",
"СинхронизацияОбъектовМетаданныхИФайлов.os",
"СортировкаДереваМетаданных.os",
"УдалениеДублейМетаданных.os",
"УдалениеЛишнихКонцевыхПробелов.os",
"УдалениеЛишнихПустыхСтрок.os"
],
"НастройкиСценариев": {
"ОтключениеПолнотекстовогоПоиска": {
"МетаданныеДляИсключения": {
"src\\_example.xml": [
"Номер",
"ТабличнаяЧасть1.Реквизит"
],
"src\\_example2.xml": []
}
},
"РазборОтчетовОбработокРасширений": {
"ИспользоватьНастройкиПоУмолчанию": true,
"ВерсияПлатформы": ""
}
}
}
}

View File

@ -6,6 +6,7 @@
Перем Лог;
Перем МенеджерВременныхФайлов;
#Область ПрограммныйИнтерфейс
// Основная точка входа
Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
@ -24,6 +25,8 @@
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийИсправлениеНеКаноническогоНаписанияИсправляетФайл");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийИсправлениеНеКаноническогоНаписанияНеИндексируетНеизмененные");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийИсправлениеНеКаноническогоНаписанияИсправляетТолькоНаписание");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСинхронизацияОбъектовМетаданныхВызываетИсключение");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗагрузкуСценариевПоИмени");
Возврат ВсеТесты;
@ -47,14 +50,16 @@
КонецПроцедуры
#Область ИсправлениеНеКаноническогоНаписания
Процедура ТестДолжен_ПроверитьЧтоСценарийИсправлениеНеКаноническогоНаписанияИсправляетФайл() Экспорт
ОбъектСценария = ПолучитьСценарий("ИсправлениеНеКаноническогоНаписания.os");
ОбъектСценария = ПолучитьСценарий("ИсправлениеНеКаноническогоНаписания.os");
ИмяФайла = "ИсправлениеНеКаноническогоНаписания.bsl";
Файл = ПодготовитьИзменяемыйТестовыйФайл(ИмяФайла);
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, ПолучитьДополнительныеНастройки());
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, ПолучитьДополнительныеНастройки());
Ожидаем.Что(Результат, Истина).ЭтоИстина();
КонецПроцедуры
@ -77,30 +82,25 @@
Процедура ТестДолжен_ПроверитьЧтоСценарийИсправлениеНеКаноническогоНаписанияНеИндексируетНеизмененные() Экспорт
ОбъектСценария = ПолучитьСценарий("ИсправлениеНеКаноническогоНаписания.os");
ОбъектСценария = ПолучитьСценарий("ИсправлениеНеКаноническогоНаписания.os");
ИмяФайла = "ИсправлениеНеКаноническогоНаписания.bsl";
Файл = ПодготовитьИзменяемыйТестовыйФайл(ИмяФайла);
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, ПолучитьДополнительныеНастройки());
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, ПолучитьДополнительныеНастройки());
ДопНастройки = ПолучитьДополнительныеНастройки();
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, ДопНастройки);
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, ДопНастройки);
Ожидаем.Что(ДопНастройки.ИзмененныеКаталоги.Количество(), Истина).Равно(0);
КонецПроцедуры
#КонецОбласти
#Область ОтключениеПолнотекстовогоПоиска
Процедура ТестДолжен_ПроверитьЧтоСценарийОтключенияПолнотекстовогоПоискаИмеетМетодПолученияНастроек() Экспорт
ОбъектСценария = ПолучитьСценарий("ОтключениеПолнотекстовогоПоиска.os");
СценарийИмеетМетод(ОбъектСценария, НазваниеМетодаНастроек());
КонецПроцедуры
Процедура ТестДолжен_ПроверитьЧтоСценарийРазбораОтчетовОбработокРасширенийИмеетМетодПолученияНастроек() Экспорт
ОбъектСценария = ПолучитьСценарий("РазборОтчетовОбработокРасширений.os");
ОбъектСценария = ПолучитьСценарий("ОтключениеПолнотекстовогоПоиска.os");
СценарийИмеетМетод(ОбъектСценария, НазваниеМетодаНастроек());
@ -108,26 +108,40 @@
Процедура ТестДолжен_ПроверитьЧтоСценарийОтключенияПолнотекстовогоПоискаВозвращаетНастройки() Экспорт
ОбъектСценария = ПолучитьСценарий("ОтключениеПолнотекстовогоПоиска.os");
ОбъектСценария = ПолучитьСценарий("ОтключениеПолнотекстовогоПоиска.os");
СценарийВозвращаетНастройки(ОбъектСценария, "ОтключениеПолнотекстовогоПоиска");
КонецПроцедуры
#КонецОбласти
#Область РазборОтчетовОбработокРасширений
Процедура ТестДолжен_ПроверитьЧтоСценарийРазбораОтчетовОбработокРасширенийИмеетМетодПолученияНастроек() Экспорт
ОбъектСценария = ПолучитьСценарий("РазборОтчетовОбработокРасширений.os");
СценарийИмеетМетод(ОбъектСценария, НазваниеМетодаНастроек());
КонецПроцедуры
Процедура ТестДолжен_ПроверитьЧтоСценарийРазбораОтчетовОбработокРасширенийВозвращаетНастройки() Экспорт
ОбъектСценария = ПолучитьСценарий("РазборОтчетовОбработокРасширений.os");
ОбъектСценария = ПолучитьСценарий("РазборОтчетовОбработокРасширений.os");
СценарийВозвращаетНастройки(ОбъектСценария, "РазборОтчетовОбработокРасширений");
КонецПроцедуры
#КонецОбласти
#Область ПроверкаДублейПроцедурИФункций
Процедура ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурВызываетИсключение() Экспорт
ОбъектСценария = ПолучитьСценарий("ПроверкаДублейПроцедурИФункций.os");
Файл = Новый Файл(ОбъединитьПути(КаталогТестовыхФикстур(), "ПроверкаДублейПроцедурНегативныйТест.bsl"));
СПараметрами = Новый Файл(ОбъединитьПути(КаталогТестовыхФикстур(), "ПроверкаДублейПроцедурСПараметрами.bsl"));
ОбъектСценария = ПолучитьСценарий("ПроверкаДублейПроцедурИФункций.os");
Файл = Новый Файл(ОбъединитьПути(КаталогТестовыхФикстур(), "ПроверкаДублейПроцедурНегативныйТест.bsl"));
СПараметрами = Новый Файл(ОбъединитьПути(КаталогТестовыхФикстур(), "ПроверкаДублейПроцедурСПараметрами.bsl"));
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "обнаружены неуникальные имена методов");
ВызываетсяИсключениеСТекстом(ОбъектСценария, СПараметрами, "обнаружены неуникальные имена методов");
@ -135,9 +149,9 @@
Процедура ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурОбработаетФайл() Экспорт
Файл = Новый Файл(ОбъединитьПути(КаталогТестовыхФикстур(), "ПроверкаДублейПроцедурПоложительныйТест.bsl"));
ОбъектСценария = ПолучитьСценарий("ПроверкаДублейПроцедурИФункций.os");
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, ПолучитьДополнительныеНастройки());
Файл = Новый Файл(ОбъединитьПути(КаталогТестовыхФикстур(), "ПроверкаДублейПроцедурПоложительныйТест.bsl"));
ОбъектСценария = ПолучитьСценарий("ПроверкаДублейПроцедурИФункций.os");
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, ПолучитьДополнительныеНастройки());
Ожидаем.Что(Результат, Истина).ЭтоИстина();
@ -145,9 +159,9 @@
Процедура ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурНеОбработаетНесуществующийФайл() Экспорт
Файл = Новый Файл(ПолучитьИмяВременногоФайла("bsl"));
ОбъектСценария = ПолучитьСценарий("ПроверкаДублейПроцедурИФункций.os");
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, ПолучитьДополнительныеНастройки());
Файл = Новый Файл(ПолучитьИмяВременногоФайла("bsl"));
ОбъектСценария = ПолучитьСценарий("ПроверкаДублейПроцедурИФункций.os");
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, ПолучитьДополнительныеНастройки());
Ожидаем.Что(Результат, Истина).ЭтоЛожь();
@ -155,18 +169,112 @@
Процедура ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурНеОбработаетНеИсходник() Экспорт
Файл = Новый Файл(МенеджерВременныхФайлов.СоздатьФайл("xml"));
ОбъектСценария = ПолучитьСценарий("ПроверкаДублейПроцедурИФункций.os");
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, ПолучитьДополнительныеНастройки());
Файл = Новый Файл(МенеджерВременныхФайлов.СоздатьФайл("xml"));
ОбъектСценария = ПолучитьСценарий("ПроверкаДублейПроцедурИФункций.os");
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, ПолучитьДополнительныеНастройки());
Ожидаем.Что(Результат, Истина).ЭтоЛожь();
КонецПроцедуры
Процедура ТестДолжен_ПроверитьЗагрузкуСценариевПоИмени() Экспорт
Файл = Новый Файл(МенеджерВременныхФайлов.СоздатьФайл("bsl"));
Имена = Новый Массив;
Имена.Добавить("ПроверкаДублейПроцедурИФункций");
Сценарии = СценарииОбработки.Загрузить(Файл.Путь, "", Имена);
Ожидаем.Что(Сценарии.Количество(), "Сценарий не получен").Равно(1);
Имена.Добавить("ПроверкаДублейПроцедурИФункций");
Сценарии = СценарииОбработки.Загрузить(Файл.Путь, "", Имена);
Ожидаем.Что(Сценарии.Количество(), "Добавлен один и тот же сценарий").Равно(1);
Имена.Добавить("ПроверкаДублейПроцедурИФункций.os");
Сценарии = СценарииОбработки.Загрузить(Файл.Путь, "", Имена);
Ожидаем.Что(Сценарии.Количество(), "Добавлен один и тот же сценарий").Равно(1);
Имена.Добавить("РазборОтчетовОбработокРасширений.os");
Сценарии = СценарииОбработки.Загрузить(Файл.Путь, "", Имена);
Ожидаем.Что(Сценарии.Количество(), "С массивом загружаемых сценариев что-то пошло не так").Равно(2);
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#Область СинхронизацияОбъектовМетаданныхИФайлов
Процедура ТестДолжен_ПроверитьЧтоСинхронизацияОбъектовМетаданныхВызываетИсключение() Экспорт
ОбъектСценария = ПолучитьСценарий("СинхронизацияОбъектовМетаданныхИФайлов.os");
Файл = Новый Файл(ОбъединитьПути(КаталогТестовыхФикстур(), "СинхронизацияОбъектовМетаданныхИФайлов\Configuration.xml"));
// Переименование типа без переименования каталога
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Имя каталога Ancillary отличается от метаданного ancillary");
// удаление типа без удаления файлов
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Необходимо удалить файлы");
// базовые элементы
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог ChartsOfCharacteristicTypes");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог Catalogs");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог CommandGroups");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог CommonAttributes");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог CommonCommands");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог CommonForms");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог CommonModules");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог CommonPictures");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог CommonTemplates");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог Constants");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог DataProcessors");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог DefinedTypes");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог Documents");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог Enums");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог EventSubscriptions");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог FunctionalOptions");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог InformationRegisters");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог Languages");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог Reports");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог Roles");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог ScheduledJobs");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог SessionParameters");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог Subsystems");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог XDTOPackages");
// элементы метаданых
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для Language.Русский");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для Subsystem.ПодсистемыБСП");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для CommonPicture.GUID");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для Role.АвтоТестированиеАдминистратор");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для SessionParameter.автоТестирование");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для CommonTemplate.HiddenStart");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для CommonModule.sFTPКлиентСервер");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для CommonAttribute.UID");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для XDTOPackage.bsp_ancillary");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для EventSubscription.ВерсионированиеПриЗаписи");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для ScheduledJob.РоботАвтоматическаяОбработкаИзмененийАдресногоКлассификатора");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для FunctionalOption.ВестиЖурналДействийПользователя");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для DefinedType.ТипUIDСтрока");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для CommonCommand.АудиторскийСлед");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для CommandGroup.Печать");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для Constant.АдресатыПолученияУведомленийОбИзмененияхВАлгоритмах");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для CommonForm.АвторизацияПользователя");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для Catalog.АдресаЭлектроннойПочты");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для Document.АттестацияРазработчика");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для Enum.ВариантХраненияФайлов");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для Report.анализЖурналаРегистрации");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для DataProcessor.активныеПользователи");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для InformationRegister.администраторыБаз");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для ChartOfCharacteristicTypes.РасширенныеХарактеристикиОбъектов");
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
Процедура ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, ТекстИсключения)
ДополнительныеНастройки = ПолучитьДополнительныеНастройки();
ПараметрыМетода = Новый Массив;
ДополнительныеНастройки = ПолучитьДополнительныеНастройки();
ПараметрыМетода = Новый Массив;
ПараметрыМетода.Добавить(Файл);
ПараметрыМетода.Добавить(Файл.Путь);
@ -187,8 +295,8 @@
Функция ПолучитьСценарий(ИмяСценария)
Сценарий = ОбъединитьПути(КаталогИсходников(), "src", "СценарииОбработки", ИмяСценария);
ОбъектСценария = ЗагрузитьСценарий(Сценарий);
Сценарий = ОбъединитьПути(КаталогИсходников(), "src", "СценарииОбработки", ИмяСценария);
ОбъектСценария = ЗагрузитьСценарий(Сценарий);
Возврат ОбъектСценария;
@ -196,12 +304,12 @@
Процедура СценарийВозвращаетНастройки(ОбъектСценария, ИмяНастройки)
Рефлектор = Новый Рефлектор;
СтруктураНастроек = Рефлектор.ВызватьМетод(ОбъектСценария, НазваниеМетодаНастроек());
Рефлектор = Новый Рефлектор;
СтруктураНастроек = Рефлектор.ВызватьМетод(ОбъектСценария, НазваниеМетодаНастроек());
Утверждения.ПроверитьРавенство(СтруктураНастроек.ИмяСценария, ИмяНастройки);
Утверждения.ПроверитьРавенство(ТипЗнч(СтруктураНастроек.Настройка), Тип("Соответствие"));
КонецПроцедуры
Процедура ВключитьПоказОтладки()
@ -212,11 +320,11 @@
Лог.УстановитьУровень(УровниЛога.Информация);
КонецПроцедуры
Функция КаталогТестовыхФикстур()
Функция КаталогТестовыхФикстур()
Возврат ОбъединитьПути(КаталогИсходников(), "tests\fixtures");
КонецФункции
Функция КаталогИсходников()
Функция КаталогИсходников()
Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "..");
КонецФункции
@ -228,10 +336,9 @@
Функция ПолучитьДополнительныеНастройки()
УправлениеНастройками = Новый НастройкиРепозитория(ТекущийКаталог());
Настройка = УправлениеНастройками.НастройкиПриложения(УправлениеНастройками.ИмяПоУмолчанию())
.Получить("НастройкиСценариев");
ДополнительныеНастройки = Новый Структура("Лог, Настройки, ИзмененныеКаталоги", Лог, Настройка, Новый Массив());
УправлениеНастройками = МенеджерНастроек.НастройкиРепозитория(ТекущийКаталог(), Ложь);
Настройка = МенеджерНастроек.НастройкиПроекта().Получить("НастройкиСценариев");
ДополнительныеНастройки = Новый Структура("Лог, Настройки, ИзмененныеКаталоги", Лог, Настройка, Новый Массив());
Возврат ДополнительныеНастройки;
@ -239,11 +346,13 @@
Функция ПодготовитьИзменяемыйТестовыйФайл(Знач ИмяТестовогоФайла)
ПутьКТесту = ОбъединитьПути(КаталогТестовыхФикстур(), ИмяТестовогоФайла);
ПутьКТесту = ОбъединитьПути(КаталогТестовыхФикстур(), ИмяТестовогоФайла);
ПутьКФайлу = МенеджерВременныхФайлов.СоздатьФайл(ИмяТестовогоФайла);
КопироватьФайл(ПутьКТесту, ПутьКФайлу);
Файл = Новый Файл(ПутьКФайлу);
Возврат Файл;
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,307 @@
#Использовать asserts
#Использовать logos
#Использовать tempfiles
#Использовать "../src"
Перем юТест;
Перем Лог;
Перем МенеджерВременныхФайлов;
// Основная точка входа
Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
ПередЗапускомТестов();
юТест = ЮнитТестирование;
ВсеТесты = Новый Массив;
ВсеТесты.Добавить("Тест_ИспользованиеГлобальныхНастроек");
ВсеТесты.Добавить("Тест_ИспользованиеЛокальныхНастроек");
ВсеТесты.Добавить("Тест_ОтключенныеНастройки");
ВсеТесты.Добавить("Тест_ОтключенныеНастройкиИПереопределенныеГлобальныеСценарии");
ВсеТесты.Добавить("Тест_НастройкиПроектов");
ВсеТесты.Добавить("Тест_НастройкиСценариев");
Возврат ВсеТесты;
КонецФункции
Процедура ПередЗапускомТестов()
МенеджерПриложения.Инициализировать(ПараметрыПриложения);
Попытка
ВремТестер = Новый Тестер;
Лог = Логирование.ПолучитьЛог(ВремТестер.ИмяЛога());
Исключение
Лог = Логирование.ПолучитьЛог("Test");
КонецПопытки;
КонецПроцедуры
Процедура ПередЗапускомТеста() Экспорт
ВключитьПоказОтладки();
МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов;
КонецПроцедуры
Процедура ПослеЗапускаТеста() Экспорт
МенеджерВременныхФайлов.Удалить();
МенеджерВременныхФайлов = Неопределено;
КонецПроцедуры
Процедура Тест_ИспользованиеГлобальныхНастроек() Экспорт
НастройкиПрекоммит = ЗагрузитьНастройкиИзФикстуры("v8configБезНастроекПрекоммит.json");
Ожидаем.Что(НастройкиПрекоммит, "Не удалось загрузить настройки").Заполнено();
КонецПроцедуры
Процедура Тест_ИспользованиеЛокальныхНастроек() Экспорт
НастройкиПрекоммит = ЗагрузитьНастройкиИзФикстуры("v8config.json");
Ожидаем.Что(НастройкиПрекоммит, "Не удалось загрузить настройки").Заполнено();
ОжидаемыеСценарии = Новый Массив();
ОжидаемыеСценарии.Добавить("УдалениеДублейМетаданных.os");
ОжидаемыеСценарии.Добавить("УдалениеЛишнихКонцевыхПробелов.os");
ОжидаемыеСценарии.Добавить("УдалениеЛишнихПустыхСтрок.os");
ПроверитьОжидаемыеСценарии(НастройкиПрекоммит["ГлобальныеСценарии"], ОжидаемыеСценарии);
КонецПроцедуры
Процедура Тест_ОтключенныеНастройки() Экспорт
НастройкиПрекоммит = ЗагрузитьНастройкиИзФикстуры("v8configОтключенныеСценарии.json");
Ожидаем.Что(НастройкиПрекоммит, "Не удалось загрузить настройки").Заполнено();
ОжидаемыеСценарии = Новый Массив();
ОжидаемыеСценарии.Добавить("ДобавлениеПробеловПередКлючевымиСловами.os");
ОжидаемыеСценарии.Добавить("ЗапретИспользованияПерейти.os");
ОжидаемыеСценарии.Добавить("ИсправлениеНеКаноническогоНаписания.os");
ОжидаемыеСценарии.Добавить("КорректировкаXMLФорм.os");
ОжидаемыеСценарии.Добавить("ОтключениеПолнотекстовогоПоиска.os");
ОжидаемыеСценарии.Добавить("ПроверкаДублейПроцедурИФункций.os");
ОжидаемыеСценарии.Добавить("ПроверкаКорректностиОбластей.os");
ОжидаемыеСценарии.Добавить("РазборОбычныхФормНаИсходники.os");
ОжидаемыеСценарии.Добавить("РазборОтчетовОбработокРасширений.os");
ОжидаемыеСценарии.Добавить("СинхронизацияОбъектовМетаданныхИФайлов.os");
ОжидаемыеСценарии.Добавить("СортировкаДереваМетаданных.os");
ИменаЗагружаемыхСценариев = МенеджерНастроек.ИменаЗагружаемыхСценариев();
ПроверитьОжидаемыеСценарии(ИменаЗагружаемыхСценариев, ОжидаемыеСценарии);
ИменаЗагружаемыхСценариев = МенеджерНастроек.ИменаЗагружаемыхСценариев("Несуществующий проект");
ПроверитьОжидаемыеСценарии(ИменаЗагружаемыхСценариев, ОжидаемыеСценарии);
КонецПроцедуры
Процедура Тест_ОтключенныеНастройкиИПереопределенныеГлобальныеСценарии() Экспорт
НастройкиПрекоммит = ЗагрузитьНастройкиИзФикстуры("v8configОтключенныеСценарииПереопреденыГлобальные.json");
Ожидаем.Что(НастройкиПрекоммит, "Не удалось загрузить настройки").Заполнено();
ОжидаемыеСценарии = Новый Массив();
ОжидаемыеСценарии.Добавить("РазборОбычныхФормНаИсходники.os");
ОжидаемыеСценарии.Добавить("РазборОтчетовОбработокРасширений.os");
ОжидаемыеСценарии.Добавить("СинхронизацияОбъектовМетаданныхИФайлов.os");
ОжидаемыеСценарии.Добавить("СортировкаДереваМетаданных.os");
ИменаЗагружаемыхСценариев = МенеджерНастроек.ИменаЗагружаемыхСценариев();
ПроверитьОжидаемыеСценарии(ИменаЗагружаемыхСценариев, ОжидаемыеСценарии);
ИменаЗагружаемыхСценариев = МенеджерНастроек.ИменаЗагружаемыхСценариев("Несуществующий проект");
ПроверитьОжидаемыеСценарии(ИменаЗагружаемыхСценариев, ОжидаемыеСценарии);
КонецПроцедуры
Процедура Тест_НастройкиПроектов() Экспорт
ВсеСценарии = МенеджерНастроек.ПолучитьИменаСценариевКаталога(МенеджерПриложения.КаталогСценариев());
Каталог = СоздатьТестовыйКаталог("v8configПроекты.json");
Настройки = МенеджерНастроек.НастройкиРепозитория(Каталог);
НастройкиПрекоммит = Настройки.НастройкиПриложения(МенеджерНастроек.КлючНастройкиPrecommit());
Ожидаем.Что(МенеджерНастроек.ПроектыКонфигурации(), "Не найден проект настроек").Содержит("configuration\");
Ожидаем.Что(МенеджерНастроек.ПроектыКонфигурации(), "Не найден проект настроек").Содержит("ext\extension1\");
ПроверитьЗначение("ИспользоватьСценарииРепозитория", "configuration\", Ложь);
ПроверитьЗначение("ИспользоватьСценарииРепозитория", "ext\extension1\", Истина);
ПроверитьЗначение("ИспользоватьСценарииРепозитория", "ext\extension2\", Истина, "Несуществующий проект");
ПроверитьЗначение("КаталогЛокальныхСценариев", "ext\extension1\", "localscenario");
ПроверитьЗначение("КаталогЛокальныхСценариев", "ext\extension2\", "", "Несуществующий проект");
Сценарии = МенеджерНастроек.ИменаЗагружаемыхСценариев("configuration\");
Ожидаем.Что(Сценарии.Количество(), "Сценарии проекта 'configuration'").Равно(0);
Сценарии = МенеджерНастроек.ИменаЗагружаемыхСценариев("ext\extension1\");
Ожидаем.Что(Сценарии.Количество(), "Сценарии проекта 'ext\extension1'").Равно(ВсеСценарии.Количество());
Сценарии = МенеджерНастроек.ИменаЗагружаемыхСценариев("ext\extension2\");
Ожидаем.Что(Сценарии.Количество(), "Сценарии проекта 'ext\extension2' несуществующий проект").Равно(ВсеСценарии.Количество() - 1);
НастройкаConfiguration = МенеджерНастроек.НастройкиПроекта("configuration\");
Ожидаем.Что(НастройкаConfiguration,
"Не корректные настройки проекта")
.Не_().Равно(НастройкиПрекоммит);
НастройкаExtension1 = МенеджерНастроек.НастройкиПроекта("ext\extension1\");
Ожидаем.Что(НастройкаExtension1,
"Не корректные настройки проекта")
.Не_().Равно(НастройкиПрекоммит);
Ожидаем.Что(МенеджерНастроек.НастройкиПроекта("configuration2"),
"Не корректные настройки проекта. Для отсутствующего проекта должны возвращаться общие настройки")
.Равно(НастройкиПрекоммит);
ВариантыПроверки = Новый ТаблицаЗначений();
ВариантыПроверки.Колонки.Добавить("ИмяФайла");
ВариантыПроверки.Колонки.Добавить("Настройка");
ДобавитьВариантНастройки(ВариантыПроверки, "configuration\module.bsl", НастройкаConfiguration);
ДобавитьВариантНастройки(ВариантыПроверки, "ext\extension1\module.bsl", НастройкаExtension1);
ДобавитьВариантНастройки(ВариантыПроверки, "\confiGuration\module.bsl", НастройкаConfiguration);
ДобавитьВариантНастройки(ВариантыПроверки, "test\module.bsl", НастройкиПрекоммит);
ДобавитьВариантНастройки(ВариантыПроверки, "module.bsl", НастройкиПрекоммит);
ДобавитьВариантНастройки(ВариантыПроверки, "", НастройкиПрекоммит);
Для каждого Вариант Из ВариантыПроверки Цикл
Ожидаем.Что(МенеджерНастроек.НастройкаДляФайла(Вариант.ИмяФайла),
СтрШаблон("Не верно определена настройка для файла '%1'", Вариант.ИмяФайла))
.Равно(Вариант.Настройка);
КонецЦикла;
КонецПроцедуры
Процедура Тест_НастройкиСценариев() Экспорт
НастройкиПрекоммит = ЗагрузитьНастройкиИзФикстуры("v8configПроекты.json");
ВариантыПроверки = Новый ТаблицаЗначений();
ВариантыПроверки.Колонки.Добавить("ИмяФайла");
ВариантыПроверки.Колонки.Добавить("ИмяСценария");
ВариантыПроверки.Колонки.Добавить("ИмяНастройки");
ВариантыПроверки.Колонки.Добавить("ЗначениеНастройки");
ДобавитьВариантНастройки(ВариантыПроверки, "ext\extension1\module.bsl", "ОтключениеПолнотекстовогоПоиска", "МетаданныеДляИсключения", "src\Документ2.mdo");
ДобавитьВариантНастройки(ВариантыПроверки, "configuration\module.bsl", "ОтключениеПолнотекстовогоПоиска", "МетаданныеДляИсключения", Неопределено);
ДобавитьВариантНастройки(ВариантыПроверки, "tests\module.bsl", "ОтключениеПолнотекстовогоПоиска", "МетаданныеДляИсключения", "src\Документ1.mdo");
Для Каждого Вариант Из ВариантыПроверки Цикл
Настройка = МенеджерНастроек.НастройкаДляФайла(Вариант.ИмяФайла);
КлючНастройки = СтрШаблон("НастройкиСценариев.%1.%2", Вариант.ИмяСценария, Вариант.ИмяНастройки);
ЗначениеНастройки = МенеджерНастроек.ЗначениеПоКлючу(Настройка, КлючНастройки);
Если НЕ ЗначениеЗаполнено(Вариант.ЗначениеНастройки) Тогда
Ожидаем.Что(ЗначениеНастройки,
СтрШаблон("Не верно определена настройка сценария '%2' для файла '%1'", Вариант.ИмяФайла, Вариант.ИмяСценария))
.Равно(Неопределено);
Иначе
Ожидаем.Что(ЗначениеНастройки[Вариант.ЗначениеНастройки],
СтрШаблон("Не верно определена настройка сценария '%2' для файла '%1'", Вариант.ИмяФайла, Вариант.ИмяСценария))
.НЕ_().Равно(Неопределено);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьЗначение(Ключ, Проект, ОжидаемоеЗначение, Дополнение = "")
Ожидаем.Что(МенеджерНастроек.ЗначениеНастройки(Ключ, Проект),
СтрШаблон("Не верное значение настройки '%1.%2' %3", Проект, Ключ, Дополнение))
.Равно(ОжидаемоеЗначение);
КонецПроцедуры
#Область Служебные
Процедура ПроверитьОжидаемыеСценарии(ГлобальныеСценарии, ОжидаемыеСценарии)
Ожидаем.Что(ГлобальныеСценарии, "Нет глобальных сценариев").Заполнено();
Ожидаем.Что(ГлобальныеСценарии.Количество(), "Не корректный список сценариев").Равно(ОжидаемыеСценарии.Количество());
Для каждого ИмяСценария Из ОжидаемыеСценарии Цикл
Ожидаем.Что(ГлобальныеСценарии, "Не содержит нужные сценарии").Содержит(ИмяСценария)
КонецЦикла;
КонецПроцедуры
Процедура ВключитьПоказОтладки()
Лог.УстановитьУровень(УровниЛога.Отладка);
КонецПроцедуры
Процедура ВыключитьПоказОтладки()
Лог.УстановитьУровень(УровниЛога.Информация);
КонецПроцедуры
Функция ЗагрузитьНастройкиИзФикстуры(ИмяФикстуры)
КаталогРепозитория = СоздатьТестовыйКаталог(ИмяФикстуры);
Настройки = МенеджерНастроек.НастройкиРепозитория(КаталогРепозитория);
Возврат Настройки.НастройкиПриложения(МенеджерНастроек.КлючНастройкиPrecommit());
КонецФункции
Функция СоздатьТестовыйКаталог(ИмяФикстуры)
Каталог = МенеджерВременныхФайлов.СоздатьКаталог();
КаталогФикстур = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "Настройки");
Фикстура = ОбъединитьПути(КаталогФикстур, ИмяФикстуры);
КопироватьФайл(Фикстура, ОбъединитьПути(Каталог, "v8config.json"));
СоздатьКаталог(ОбъединитьПути(Каталог, "configuration"));
СоздатьКаталог(ОбъединитьПути(Каталог, "ext"));
СоздатьКаталог(ОбъединитьПути(Каталог, "ext", "extension1"));
СоздатьКаталог(ОбъединитьПути(Каталог, "ext", "extension2"));
Возврат Каталог;
КонецФункции
Процедура ДобавитьВариантНастройки(Варианты, Значение1 = Неопределено, Значение2 = Неопределено, Значение3 = Неопределено, Значение4 = Неопределено)
Строка = Варианты.Добавить();
Для Инд = 1 По 4 Цикл
Значение = Вычислить(СтрШаблон("Значение%1", Инд));
Если Значение <> Неопределено Тогда
Строка[Инд - 1] = Значение;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#КонецОбласти

View File

@ -0,0 +1,282 @@
#Использовать asserts
#Использовать logos
#Использовать tempfiles
#Использовать "../src"
Перем юТест;
Перем Лог;
Перем МенеджерВременныхФайлов;
// Основная точка входа
Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
ПередЗапускомТестов();
юТест = ЮнитТестирование;
ВсеТесты = Новый Массив;
ВсеТесты.Добавить("Тест_СброситьНастройкиРепозитория");
ВсеТесты.Добавить("Тест_СброситьГлобальныеНастройки");
ВсеТесты.Добавить("Тест_ПолучитьСтандартнуюСтруктуруНастроек");
ВсеТесты.Добавить("Тест_ОбновитьНастройки");
Возврат ВсеТесты;
КонецФункции
#Область ПередПослеТеста
Процедура ПередЗапускомТестов()
МенеджерПриложения.Инициализировать(ПараметрыПриложения);
Попытка
ВремТестер = Новый Тестер;
Лог = Логирование.ПолучитьЛог(ВремТестер.ИмяЛога());
Исключение
Лог = Логирование.ПолучитьЛог("Test");
КонецПопытки;
КонецПроцедуры
Процедура ПередЗапускомТеста() Экспорт
ВключитьПоказОтладки();
МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов;
МенеджерНастроек.СбросСостоянияМенеджера();
КонецПроцедуры
Процедура ПослеЗапускаТеста() Экспорт
МенеджерВременныхФайлов.Удалить();
МенеджерВременныхФайлов = Неопределено;
КонецПроцедуры
#КонецОбласти
#Область Тесты
Процедура Тест_СброситьНастройкиРепозитория() Экспорт
Каталог = СоздатьТестовыйКаталог("v8configПроекты.json");
// Сброс по проектно
МенеджерНастроек.НастройкиРепозитория(Каталог, Ложь);
Ожидаем.Что(МенеджерНастроек.ПроектыКонфигурации(), "Не найден проект").Содержит("configuration\");
Ожидаем.Что(МенеджерНастроек.ПроектыКонфигурации(), "Не найден проект").Содержит("ext\extension1\");
РедакторНастроек.СброситьНастройкиРепозитория(Истина, "ext\extension1\");
Ожидаем.Что(МенеджерНастроек.ПроектыКонфигурации(), "Проект не удален").НЕ_().Содержит("ext\extension1\");
Ожидаем.Что(МенеджерНастроек.ПроектыКонфигурации(), "Не найден проект").Содержит("configuration\");
РедакторНастроек.СброситьНастройкиРепозитория(Истина, "configuration\extension1\");
Ожидаем.Что(МенеджерНастроек.ПроектыКонфигурации(), "Удален лишний репозиторий").Содержит("configuration\");
// Перезагрузим настройки
МенеджерНастроек.НастройкиРепозитория(Каталог, Ложь);
Ожидаем.Что(МенеджерНастроек.ПроектыКонфигурации(), "Настройки не сохранены").НЕ_().Содержит("ext\extension1\");
Ожидаем.Что(МенеджерНастроек.ПроектыКонфигурации(), "Настройки сохранены не корректно").Содержит("configuration\");
// Сброс всех подпроектов
Каталог = СоздатьТестовыйКаталог("v8configПроекты.json");
МенеджерНастроек.НастройкиРепозитория(Каталог, Ложь);
РедакторНастроек.СброситьНастройкиРепозитория(Истина);
Ожидаем.Что(МенеджерНастроек.ПроектыКонфигурации(), "Не выполнен сброс настроек подпроектов").ИмеетДлину(0);
Ожидаем.Что(МенеджерНастроек.ЗначениеНастройки("ОтключенныеСценарии"), "Не корректны настройки").ИмеетДлину(1);
// Перезагрузим настройки
МенеджерНастроек.НастройкиРепозитория(Каталог, Ложь);
Ожидаем.Что(МенеджерНастроек.ПроектыКонфигурации(), "Настройки не сохранены").ИмеетДлину(0);
Ожидаем.Что(МенеджерНастроек.ЗначениеНастройки("ОтключенныеСценарии"), "Не корректны настройки после загрузки").ИмеетДлину(1);
// Полный сброс настроек прекоммит
Каталог = СоздатьТестовыйКаталог("v8configПроекты.json");
МенеджерНастроек.НастройкиРепозитория(Каталог, Ложь);
РедакторНастроек.СброситьНастройкиРепозитория();
Ожидаем.Что(МенеджерНастроек.ПроектыКонфигурации(), "Не выполнен сброс настроек").ИмеетДлину(0);
Ожидаем.Что(МенеджерНастроек.ЗначениеНастройки("ОтключенныеСценарии"), "Не корректны настройки").НЕ_().Заполнено();
// Перезагрузим настройки
МенеджерНастроек.НастройкиРепозитория(Каталог, Ложь);
Ожидаем.Что(МенеджерНастроек.ПроектыКонфигурации(), "Настройки не сохранены").ИмеетДлину(0);
Ожидаем.Что(МенеджерНастроек.ЗначениеНастройки("ОтключенныеСценарии"), "Не корректны настройки после загрузки").НЕ_().Заполнено();
Ожидаем.Что(МенеджерНастроек.Настройки().НастройкиПриложения(МенеджерНастроек.КлючНастройкиPrecommit())).НЕ_().Заполнено();
КонецПроцедуры
Процедура Тест_СброситьГлобальныеНастройки() Экспорт
Каталог = СоздатьТестовыйКаталог("v8configПроекты.json");
МенеджерНастроек.УстановитьКаталогГлобальныхНастроек(Каталог);
МенеджерНастроек.ГлобальныеНастройки();
РедакторНастроек.СброситьГлобальныеНастройки();
МенеджерНастроек.НастройкиРепозитория(Каталог, Ложь);
Ожидаем.Что(МенеджерНастроек.ПроектыКонфигурации(), "Не удалены подпроекты").НЕ_().Заполнено();
Ожидаем.Что(МенеджерНастроек.ЗначениеНастройки("ОтключенныеСценарии"), "Не сброшены ОтключенныеСценарии").НЕ_().Заполнено();
Для Каждого ИмяСценария Из СценарииОбработки.ГлобальныеСценарии() Цикл
Ожидаем.Что(МенеджерНастроек.ЗначениеНастройки("ГлобальныеСценарии"), "Не сброшены ГлобальныеСценарии").Содержит(ИмяСценария);
КонецЦикла;
КонецПроцедуры
Процедура Тест_ПолучитьСтандартнуюСтруктуруНастроек() Экспорт
СтандартныеНастройки = РедакторНастроек.ПолучитьСтандартнуюСтруктуруНастроек();
Ожидаем.Что(СтандартныеНастройки)
.ИмеетТип("Соответствие")
.ИмеетДлину(5);
Эталон = Новый Соответствие();
Эталон.Вставить("ИспользоватьСценарииРепозитория", "Булево");
Эталон.Вставить("КаталогЛокальныхСценариев", "Строка");
Эталон.Вставить("ГлобальныеСценарии", "Массив");
Эталон.Вставить("ОтключенныеСценарии", "Массив");
Эталон.Вставить("НастройкиСценариев", "Соответствие");
Для Каждого Элемент Из Эталон Цикл
Ожидаем.Что(СтандартныеНастройки[Элемент.Ключ], "Не верное свойство " + Элемент.Ключ).ИмеетТип(Элемент.Значение);
КонецЦикла;
КонецПроцедуры
Процедура Тест_ОбновитьНастройки() Экспорт
Варианты = Новый ТаблицаЗначений();
Варианты.Колонки.Добавить("Описание");
Варианты.Колонки.Добавить("ИмяФикстуры");
Варианты.Колонки.Добавить("НовыеНастройки");
Варианты.Колонки.Добавить("НовыеПроекты");
Варианты.Колонки.Добавить("ОжидаемыеПроекты");
БазовыеНастройки = РедакторНастроек.ПолучитьСтандартнуюСтруктуруНастроек();
НастройкиПроектов = Новый Соответствие();
НастройкиПроектов.Вставить("configuration\", РедакторНастроек.ПолучитьСтандартнуюСтруктуруНастроек());
ДобавитьВариантНастройки(Варианты, "Только базовые настройки", "v8config.json", БазовыеНастройки, , "");
ДобавитьВариантНастройки(Варианты, "К базовым настройкам добавляем проекты", "v8config.json", БазовыеНастройки, НастройкиПроектов, "configuration\");
ДобавитьВариантНастройки(Варианты, "Настройки с проектами, обновляем только базовые настройки", "v8configПроекты.json", БазовыеНастройки, , "configuration\,ext\extension1");
ДобавитьВариантНастройки(Варианты, "Обновление настройки подпроекта", "v8configПроекты.json", БазовыеНастройки, НастройкиПроектов, "configuration\,ext\extension1\");
НастройкиПроектов = Новый Соответствие();
НастройкиПроектов.Вставить("configuration2\", РедакторНастроек.ПолучитьСтандартнуюСтруктуруНастроек());
ДобавитьВариантНастройки(Варианты, "Добавление настройки подпроекта", "v8configПроекты.json", БазовыеНастройки, НастройкиПроектов, "configuration\,configuration2\,ext\extension1\");
Для Каждого Вариант Из Варианты Цикл
Лог.Отладка("Обработка файла %1", Вариант.ИмяФикстуры);
МенеджерНастроек.СбросСостоянияМенеджера();
Каталог = СоздатьТестовыйКаталог(Вариант.ИмяФикстуры);
МенеджерНастроек.НастройкиРепозитория(Каталог, Ложь);
РедакторНастроек.ОбновитьНастройки(Вариант.НовыеНастройки, Вариант.НовыеПроекты);
МенеджерНастроек.СбросСостоянияМенеджера();
МенеджерНастроек.НастройкиРепозитория(Каталог, Ложь);
Префикс = СтрШаблон("Вариант ""%1""", Вариант.Описание);
Для Каждого Элемент Из Вариант.НовыеНастройки Цикл
Сообщение = СтрШаблон("%1. Не верное значение поля '%2'", Префикс, Элемент.Ключ);
ОжидаемоеЗначение = Элемент.Значение;
Если ТипЗнч(ОжидаемоеЗначение) = Тип("Массив") Тогда
Ожидаем.Что(МенеджерНастроек.ЗначениеНастройки(Элемент.Ключ), Сообщение).ИмеетТип("Массив").ИмеетДлину(ОжидаемоеЗначение.Количество());
ИначеЕсли ТипЗнч(ОжидаемоеЗначение) = Тип("Соответствие") Тогда
Ожидаем.Что(МенеджерНастроек.ЗначениеНастройки(Элемент.Ключ), Сообщение).ИмеетТип("Соответствие").ИмеетДлину(ОжидаемоеЗначение.Количество());
Иначе
Ожидаем.Что(МенеджерНастроек.ЗначениеНастройки(Элемент.Ключ), Сообщение).Равно(ОжидаемоеЗначение);
КонецЕсли;
КонецЦикла;
ИменаПроектов = СтрРазделить(Вариант.ОжидаемыеПроекты, ",");
Для Каждого ИмяПроекта Из ИменаПроектов Цикл
Сообщение = СтрШаблон("%1. Нет настроек для проекта '%2'", Префикс, ИмяПроекта);
Ожидаем.Что(МенеджерНастроек.НастройкиПроекта(ИмяПроекта), Сообщение).Заполнено();
КонецЦикла;
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Область Служебные
Процедура ВключитьПоказОтладки()
Лог.УстановитьУровень(УровниЛога.Отладка);
КонецПроцедуры
Процедура ВыключитьПоказОтладки()
Лог.УстановитьУровень(УровниЛога.Информация);
КонецПроцедуры
Функция СоздатьТестовыйКаталог(ИмяФикстуры)
Каталог = МенеджерВременныхФайлов.СоздатьКаталог();
КаталогФикстур = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "Настройки");
Фикстура = ОбъединитьПути(КаталогФикстур, ИмяФикстуры);
КопироватьФайл(Фикстура, ОбъединитьПути(Каталог, "v8config.json"));
СоздатьКаталог(ОбъединитьПути(Каталог, "configuration"));
СоздатьКаталог(ОбъединитьПути(Каталог, "configuration2"));
СоздатьКаталог(ОбъединитьПути(Каталог, "ext"));
СоздатьКаталог(ОбъединитьПути(Каталог, "ext", "extension1"));
СоздатьКаталог(ОбъединитьПути(Каталог, "ext", "extension2"));
Возврат Каталог;
КонецФункции
Процедура ДобавитьВариантНастройки(Варианты, Значение1 = Неопределено, Значение2 = Неопределено, Значение3 = Неопределено, Значение4 = Неопределено, Значение5 = Неопределено)
Строка = Варианты.Добавить();
Для Инд = 1 По 5 Цикл
Значение = Вычислить(СтрШаблон("Значение%1", Инд));
Если Значение <> Неопределено Тогда
Строка[Инд - 1] = Значение;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#КонецОбласти

View File

@ -16,6 +16,7 @@
ВсеТесты.Добавить("ТестДолжен_ПрочитатьФайл");
ВсеТесты.Добавить("ТестДолжен_ЗаписатьФайл");
ВсеТесты.Добавить("ТестДолжен_ПроверитьПоискКаталогов");
Возврат ВсеТесты;
@ -41,6 +42,37 @@
КонецПроцедуры
Процедура ТестДолжен_ПроверитьПоискКаталогов() Экспорт
ТестовыйКаталог = МенеджерВременныхФайлов.СоздатьКаталог();
МенеджерВременныхФайлов.БазовыйКаталог = ТестовыйКаталог;
НайденныеКаталоги = ФайловыеОперации.НайтиКаталоги(ТестовыйКаталог);
Утверждения.ПроверитьРавенство(ТипЗнч(НайденныеКаталоги), Тип("Массив"));
Утверждения.ПроверитьРавенство(ФайловыеОперации.НайтиКаталоги(ТестовыйКаталог).Количество(), 0);
МенеджерВременныхФайлов.СоздатьКаталог();
Утверждения.ПроверитьРавенство(ФайловыеОперации.НайтиКаталоги(ТестовыйКаталог).Количество(), 1);
МенеджерВременныхФайлов.СоздатьКаталог();
Утверждения.ПроверитьРавенство(ФайловыеОперации.НайтиКаталоги(ТестовыйКаталог).Количество(), 2);
МенеджерВременныхФайлов.СоздатьКаталог();
Утверждения.ПроверитьРавенство(ФайловыеОперации.НайтиКаталоги(ТестовыйКаталог).Количество(), 3);
МенеджерВременныхФайлов.СоздатьКаталог();
Утверждения.ПроверитьРавенство(ФайловыеОперации.НайтиКаталоги(ТестовыйКаталог).Количество(), 4);
ИмяФайла = МенеджерВременныхФайлов.СоздатьФайл();
Файл = Новый Файл(ИмяФайла);
Утверждения.ПроверитьРавенство(Файл.Путь, ТестовыйКаталог + ПолучитьРазделительПути());
Утверждения.ПроверитьРавенство(Файл.Существует(), Истина);
Утверждения.ПроверитьРавенство(ФайловыеОперации.НайтиКаталоги(ТестовыйКаталог).Количество(), 4);
КонецПроцедуры
Процедура ПередЗапускомТеста() Экспорт
ВремТестер = Новый Тестер;

View File

@ -18,6 +18,7 @@
"УдалениеЛишнихКонцевыхПробелов.os",
"УдалениеЛишнихПустыхСтрок.os"
],
"ОтключенныеСценарии": [],
"НастройкиСценариев": {
"ОтключениеПолнотекстовогоПоиска": {
"МетаданныеДляИсключения": {