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:
commit
4bbe82837b
4
.gitignore
vendored
4
.gitignore
vendored
@ -2,5 +2,5 @@ bdd-log.xml
|
||||
*.ospx
|
||||
*.orig
|
||||
exec.log
|
||||
.vscode
|
||||
/tests.xml
|
||||
.vscode/
|
||||
/tests.xml
|
||||
|
25
README.md
25
README.md
@ -60,6 +60,10 @@ precommit4onec может читать настройки своей работ
|
||||
|
||||
Предоставляется возможность в репозитории иметь свои, отличные от глобальных, настройки. Для этого необходимо вместо флага `-global` в указанных выше командах передавать параметр `-rep-path` с указанием пути к каталогу репозитория.
|
||||
|
||||
Также можно настроить различное поведение для различных каталогов репозитория, для работы с подкаталогами (проектами) используется ключ `-child-path`.
|
||||
Настройки проектов полностью переопределяют базовые настройки. Например если в основной настройки указаны `ОтключенныеСценарии`,
|
||||
а для проекта `configuration\` они не заполнены, то для каталога `configuration` будут выполнены все сценарии.
|
||||
|
||||
Конфигурирование дает возможности:
|
||||
|
||||
- Изменить список сценариев обработки файлов
|
||||
@ -67,6 +71,27 @@ precommit4onec может читать настройки своей работ
|
||||
|
||||
Некоторые сценарии поддерживают возможность изменения своих настроек со значений по умолчанию на установленные в конфигурационном файле. На данный момент реализована возможность указывать необходимую версию платформы 1С:Предприятие в сценарии `РазборОтчетОбработокРасширений`.
|
||||
|
||||
### Структура файла настроек
|
||||
|
||||
```JSON
|
||||
{
|
||||
"Precommt4onecСценарии": {
|
||||
"ИспользоватьСценарииРепозитория": false, // Признак, выполнения проверок из репозитория
|
||||
"КаталогЛокальныхСценариев": "", // Относительный путь к каталогу локальных проверок
|
||||
"ГлобальныеСценарии": [...], // Список проверок, которые будут выполнятся
|
||||
"ОтключенныеСценарии": [...], // Список проверок, которые не будут выполнятся (имеет больший приоритет относительно ГлобальныеСценарии)
|
||||
"НастройкиСценариев": { // Настройки выполняемых проверок
|
||||
...
|
||||
},
|
||||
"Проекты":{ // Настройки проектов (подкаталогов репозитория). Настройки проектов полностью переопределяют настройки и имеют такую же структуру
|
||||
"configuration\\": { // Имя проекта (подкаталога)
|
||||
"ИспользоватьСценарииРепозитория": false,
|
||||
"ГлобальныеСценарии": []
|
||||
}
|
||||
}
|
||||
}
|
||||
}```
|
||||
|
||||
## Расширение функциональности
|
||||
|
||||
Для создания нового сценария обработки файлов необходимо воспользоваться шаблоном, находящимся в каталоге `СценарииОбработки` скрипта.
|
||||
|
@ -18,10 +18,10 @@
|
||||
ВсеШаги.Добавить("ВКаталогеРепозиторияЕстьФайл");
|
||||
ВсеШаги.Добавить("ЯКопируюФайлВКаталогРепозитория");
|
||||
ВсеШаги.Добавить("ЯФиксируюИзмененияВРепозиторииСКомментарием");
|
||||
ВсеШаги.Добавить("ЯУстанавливаюКодировкуВыводаКоманды");
|
||||
ВсеШаги.Добавить("УФайлаЕстьМетка");
|
||||
ВсеШаги.Добавить("СодержимоеФайлаИФайлаРазное");
|
||||
ВсеШаги.Добавить("ЯСоздаюНовыйРепозиторийБезИнициализацииВКаталогеИЗапоминаюЕгоКак");
|
||||
ВсеШаги.Добавить("ЯСоздаюФайлВКодировкеСТекстом");
|
||||
|
||||
Возврат ВсеШаги;
|
||||
КонецФункции
|
||||
@ -117,13 +117,6 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
// я устанавливаю кодировку вывода "Кодировка" команды "ИмяКоманды"
|
||||
Процедура ЯУстанавливаюКодировкуВыводаКоманды(Кодировка, ИмяКоманды) Экспорт
|
||||
КлючКонтекста = КлючКоманды(ИмяКоманды);
|
||||
Команда = БДД.ПолучитьИзКонтекста(КлючКонтекста);
|
||||
Команда.УстановитьКодировкуВывода(Кодировка);
|
||||
КонецПроцедуры
|
||||
|
||||
Функция КлючКоманды(Знач ИмяКоманды)
|
||||
Возврат "Команда-" + ИмяКоманды;
|
||||
КонецФункции
|
||||
@ -154,6 +147,15 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
|
||||
//Я создаю файл "СпециальныйКаталог/ФайлСТекстом.txt" в кодировке "cp866" с текстом "текст178"
|
||||
Процедура ЯСоздаюФайлВКодировкеСТекстом(Знач ПутьФайла, Знач Кодировка, Знач ТекстФайла) Экспорт
|
||||
ПутьФайла = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьФайла);
|
||||
ЗаписьТекста = Новый ЗаписьТекста(ПутьФайла, Кодировка);
|
||||
ЗаписьТекста.ЗаписатьСтроку(ТекстФайла);
|
||||
ЗаписьТекста.Закрыть();
|
||||
КонецПроцедуры
|
||||
|
||||
Функция ИнициализироватьРепозиторий(РепозиторийGit, ИмяРепозитория, АлиасКаталога)
|
||||
|
||||
КаталогРепозиториев = БДД.ПолучитьИзКонтекста(АлиасКаталога);
|
||||
|
85
features/ИнтерактивнаяНастройка.feature
Normal file
85
features/ИнтерактивнаяНастройка.feature
Normal 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\\"
|
||||
|
@ -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
|
||||
ОтключенныеСценарии =
|
||||
НастройкиСценариев = Соответствие
|
||||
ОтключениеПолнотекстовогоПоиска = Соответствие
|
||||
МетаданныеДляИсключения = Соответствие
|
||||
|
@ -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
|
||||
|
@ -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"
|
||||
|
169
src/Классы/КомандаВыполнитьСценарии.os
Normal file
169
src/Классы/КомандаВыполнитьСценарии.os
Normal 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;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
// В отличие от прекоммита, здесь лучше вывести все криты в конце одним блоком еще раз.
|
||||
Если КритичныеОшибки.Количество() Тогда
|
||||
|
||||
Лог.Ошибка("В результате выполнения возникли исключения:");
|
||||
|
||||
Для Каждого ОписаниеОшибки Из КритичныеОшибки Цикл
|
||||
|
||||
Лог.Ошибка(ОписаниеОшибки);
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
// При успешном выполнении возвращает код успеха
|
||||
Возврат Приложение.РезультатыКоманд().Успех;
|
||||
|
||||
КонецФункции // ВыполнитьКоманду
|
||||
|
@ -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 Цикл
|
||||
|
||||
ЗначениеМассива = ДоступныйМассив[Ит];
|
||||
ТекстПодсказкиМассив = Символы.Таб + ЗначениеМассива;
|
||||
Если ПолучитьНастройкуБулево(ТекстПодсказкиМассив, УстановленныеЗначения.Найти(ЗначениеМассива) <> Неопределено) Тогда
|
||||
|
||||
ВыбранныеЭлементы.Добавить(ЗначениеМассива);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат ВыбранныеЭлементы;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПолучитьНастройкуСтрока(ТекстПодсказки, ЗначениеПоУмолчанию = "")
|
||||
|
||||
ВыбранноеЗначение = "";
|
||||
Пока Истина Цикл
|
||||
|
||||
Сообщить(ТекстПодсказки + ?(ПустаяСтрока(ЗначениеПоУмолчанию), "", "[" + ЗначениеПоУмолчанию + "]"));
|
||||
ВвестиСтроку(ВыбранноеЗначение);
|
||||
|
||||
ВыбранноеЗначение = СокрЛП(ВыбранноеЗначение);
|
||||
Если Не ПустаяСтрока(ВыбранноеЗначение) Тогда
|
||||
|
||||
Прервать;
|
||||
|
||||
ИначеЕсли НЕ ПустаяСтрока(ЗначениеПоУмолчанию) Тогда
|
||||
|
||||
ВыбранноеЗначение = ЗначениеПоУмолчанию;
|
||||
Прервать;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат ВыбранноеЗначение;
|
||||
|
||||
КонецФункции
|
||||
|
@ -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", ФайлСценария.ПолноеИмя, ОписаниеОшибки());
|
||||
Продолжить;
|
||||
|
||||
КонецПопытки;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
КонецФункции
|
@ -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";
|
||||
|
||||
Для Каждого Настройка Из Настройки Цикл
|
||||
|
||||
ЗаписатьНастройку(СтрШаблон(ШаблонНастройки, ИмяПоУмолчанию(), Настройка.Ключ), Настройка.Значение);
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ОбновитьКонфигурацию() Экспорт
|
||||
ОбновлятьКонфигурацию = Истина;
|
||||
КонецПроцедуры
|
89
src/Модули/ИнтерактивныйРедактор.os
Normal file
89
src/Модули/ИнтерактивныйРедактор.os
Normal file
@ -0,0 +1,89 @@
|
||||
|
||||
Функция ПолучитьНастройкуБулево(ТекстПодсказки, Знач ЗначениеПоУмолчанию) Экспорт
|
||||
|
||||
Если НЕ ЗначениеЗаполнено(ЗначениеПоУмолчанию) Тогда
|
||||
|
||||
ЗначениеПоУмолчанию = Истина;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
ВыбранноеЗначение = Формат(ЗначениеПоУмолчанию, "БЛ=n; БИ=y");
|
||||
Пока Истина Цикл
|
||||
|
||||
Сообщить(ТекстПодсказки + " [" + Формат(ЗначениеПоУмолчанию, "БЛ=n; БИ=y") + "]. Введите y[es]/n[o]");
|
||||
ВвестиСтроку(ВыбранноеЗначение);
|
||||
|
||||
Если СтрНайти("yY", ВыбранноеЗначение) Тогда
|
||||
|
||||
ВыбранноеЗначение = Истина;
|
||||
Прервать;
|
||||
|
||||
ИначеЕсли СтрНайти("nN", ВыбранноеЗначение) Тогда
|
||||
|
||||
ВыбранноеЗначение = Ложь;
|
||||
Прервать;
|
||||
|
||||
ИначеЕсли ВыбранноеЗначение = Символы.ПС Тогда
|
||||
|
||||
ВыбранноеЗначение = Истина;
|
||||
Прервать;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат ВыбранноеЗначение;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПолучитьНастройкуМассив(ТекстПодсказки, ДоступныйМассив, Знач УстановленныеЗначения = Неопределено) Экспорт
|
||||
|
||||
Если УстановленныеЗначения = Неопределено Тогда
|
||||
|
||||
УстановленныеЗначения = ДоступныйМассив;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Сообщить(ТекстПодсказки);
|
||||
ВыбранныеЭлементы = Новый Массив;
|
||||
Для Ит = 0 По ДоступныйМассив.Количество() - 1 Цикл
|
||||
|
||||
ЗначениеМассива = ДоступныйМассив[Ит];
|
||||
ТекстПодсказкиМассив = Символы.Таб + ЗначениеМассива;
|
||||
Если ПолучитьНастройкуБулево(ТекстПодсказкиМассив, УстановленныеЗначения.Найти(ЗначениеМассива) <> Неопределено) Тогда
|
||||
|
||||
ВыбранныеЭлементы.Добавить(ЗначениеМассива);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат ВыбранныеЭлементы;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПолучитьНастройкуСтрока(ТекстПодсказки, ЗначениеПоУмолчанию = "") Экспорт
|
||||
|
||||
ВыбранноеЗначение = "";
|
||||
Пока Истина Цикл
|
||||
|
||||
Сообщить(ТекстПодсказки + ?(ПустаяСтрока(ЗначениеПоУмолчанию), "", "[" + ЗначениеПоУмолчанию + "]"));
|
||||
ВвестиСтроку(ВыбранноеЗначение);
|
||||
|
||||
ВыбранноеЗначение = СокрЛП(ВыбранноеЗначение);
|
||||
Если Не ПустаяСтрока(ВыбранноеЗначение) Тогда
|
||||
|
||||
Прервать;
|
||||
|
||||
ИначеЕсли НЕ ПустаяСтрока(ЗначениеПоУмолчанию) Тогда
|
||||
|
||||
ВыбранноеЗначение = ЗначениеПоУмолчанию;
|
||||
Прервать;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат ВыбранноеЗначение;
|
||||
|
||||
КонецФункции
|
460
src/Модули/МенеджерНастроек.os
Normal file
460
src/Модули/МенеджерНастроек.os
Normal file
@ -0,0 +1,460 @@
|
||||
Перем ЛокальныеНастройки;
|
||||
Перем ГлобальныеНастройки;
|
||||
Перем ИспользуютсяЛокальныеНастройки;
|
||||
|
||||
Перем КаталогРепозитория;
|
||||
Перем НастройкиИнициализированы;
|
||||
Перем КаталогГлобальныхНастроек;
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// ПРОГРАММНЫЙ ИНТЕРФЕЙС
|
||||
///////////////////////////////////////////////////////////////////
|
||||
|
||||
Функция Настройки() Экспорт
|
||||
|
||||
Если НЕ НастройкиИнициализированы Тогда
|
||||
|
||||
ВызватьИсключение "Настройки не загружены";
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Если ИспользуютсяЛокальныеНастройки() Тогда
|
||||
|
||||
Возврат ЛокальныеНастройки;
|
||||
|
||||
Иначе
|
||||
|
||||
Возврат ГлобальныеНастройки;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция НастройкиРепозитория(ПутьКаталогаРепозитория, ВернутьГлобальныеЕслиНетЛокальных = Истина) Экспорт
|
||||
|
||||
КаталогРепозитория = ПутьКаталогаРепозитория;
|
||||
|
||||
Если ВернутьГлобальныеЕслиНетЛокальных Тогда
|
||||
|
||||
ГлобальныеНастройки();
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Лог = МенеджерПриложения.ПолучитьЛог();
|
||||
|
||||
ЛокальныеНастройки = Новый НастройкиРепозитория(КаталогРепозитория);
|
||||
|
||||
ИспользуютсяЛокальныеНастройки = ЕстьНастройкиPrecommt4onec(ЛокальныеНастройки) ИЛИ НЕ ВернутьГлобальныеЕслиНетЛокальных;
|
||||
|
||||
Если ИспользуютсяЛокальныеНастройки Тогда
|
||||
|
||||
ВозвращаемаяНастройка = ЛокальныеНастройки;
|
||||
Лог.Информация("Используем локальные настройки");
|
||||
|
||||
Иначе
|
||||
|
||||
ВозвращаемаяНастройка = ГлобальныеНастройки;
|
||||
|
||||
Лог.Информация("Используем глобальные настройки");
|
||||
|
||||
Если НЕ ЕстьНастройкиPrecommt4onec(ГлобальныеНастройки) Тогда
|
||||
|
||||
Лог.Предупреждение("Файл глобальных настроек '%1' не содержит настройки прекоммита", МенеджерПриложения.ПутьКРодительскомуКаталогу());
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
НастройкиИнициализированы = Истина;
|
||||
|
||||
ПроверитьНастройкуПроектов();
|
||||
|
||||
Возврат ВозвращаемаяНастройка;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ГлобальныеНастройки() Экспорт
|
||||
|
||||
Если ГлобальныеНастройки = Неопределено Тогда
|
||||
|
||||
Если НЕ ЗначениеЗаполнено(КаталогГлобальныхНастроек) Тогда
|
||||
ГлобальныеНастройки = Новый НастройкиРепозитория(МенеджерПриложения.ПутьКРодительскомуКаталогу());
|
||||
Иначе
|
||||
ГлобальныеНастройки = Новый НастройкиРепозитория(КаталогГлобальныхНастроек);
|
||||
КонецЕсли;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
НастройкиИнициализированы = Истина;
|
||||
|
||||
Возврат ГлобальныеНастройки;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ЗначениеНастройки(КлючНастройки, Подпроект = Неопределено, ЗначениеПоУмолчанию = Неопределено) Экспорт
|
||||
|
||||
Значение = ЗначениеНастроекПоКлючу(Настройки(), КлючНастройки(Подпроект, КлючНастройки));
|
||||
|
||||
Возврат ?(Значение = Неопределено, ЗначениеПоУмолчанию, Значение);
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ИменаЗагружаемыхСценариев(Подпроект = "") Экспорт
|
||||
|
||||
ИменаИсключаемыхСценариев = ЗначениеНастройки("ОтключенныеСценарии", Подпроект);
|
||||
|
||||
ГлобальныеСценарии = ЗначениеНастройки("ГлобальныеСценарии", Подпроект);
|
||||
|
||||
Если ГлобальныеСценарии = Неопределено Тогда
|
||||
|
||||
ГлобальныеСценарии = ПолучитьЗначениеНастройки(ГлобальныеНастройки(), "ГлобальныеСценарии");
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
ИменаЗагружаемыхСценариев = Новый Массив;
|
||||
|
||||
Если ИменаИсключаемыхСценариев = Неопределено Тогда
|
||||
|
||||
ИменаИсключаемыхСценариев = Новый Массив();
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Для Каждого ИмяСценария Из ГлобальныеСценарии Цикл
|
||||
|
||||
Если ИменаИсключаемыхСценариев.Найти(ИмяСценария) = Неопределено Тогда
|
||||
|
||||
ИменаЗагружаемыхСценариев.Добавить(ИмяСценария);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат ИменаЗагружаемыхСценариев;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПолучитьСписокИсполняемыхСценариев(Знач ГлобальныеСценарии, Знач ОтключенныеСценарии) Экспорт
|
||||
|
||||
ИменаЗагружаемыхСценариев = Новый Массив;
|
||||
|
||||
Если ОтключенныеСценарии = Неопределено Тогда
|
||||
|
||||
ОтключенныеСценарии = Новый Массив();
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Для Каждого ИмяСценария Из ГлобальныеСценарии Цикл
|
||||
|
||||
Если ОтключенныеСценарии.Найти(ИмяСценария) = Неопределено Тогда
|
||||
|
||||
ИменаЗагружаемыхСценариев.Добавить(ИмяСценария);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат ИменаЗагружаемыхСценариев;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ИспользуютсяЛокальныеНастройки() Экспорт
|
||||
|
||||
Возврат ИспользуютсяЛокальныеНастройки = Истина;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#Область Проекты
|
||||
|
||||
Функция ПроектыКонфигурации() Экспорт
|
||||
|
||||
Проекты = Новый Массив;
|
||||
|
||||
БлокПроекты = ЗначениеНастройки(КлючПроекты());
|
||||
|
||||
Если ЗначениеЗаполнено(БлокПроекты) Тогда
|
||||
|
||||
Для Каждого Элемент Из БлокПроекты Цикл
|
||||
|
||||
Проекты.Добавить(Элемент.Ключ);
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Возврат Проекты;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция НастройкиПроекта(Подпроект = "") Экспорт
|
||||
|
||||
Значение = ПолучитьНастройкиПроекта(Настройки(), Подпроект);
|
||||
|
||||
Возврат Значение;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция НастройкаДляФайла(Знач ОтносительноеИмяФайла) Экспорт
|
||||
|
||||
Возврат НастройкиПроекта(ИмяПроектаДляФайла(ОтносительноеИмяФайла));
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ИмяПроектаДляФайла(Знач ОтносительноеИмяФайла) Экспорт
|
||||
|
||||
Если СтрНачинаетсяС(ОтносительноеИмяФайла, "/") ИЛИ СтрНачинаетсяС(ОтносительноеИмяФайла, "\") Тогда
|
||||
|
||||
ОтносительноеИмяФайла = Сред(ОтносительноеИмяФайла, 2);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
ОтносительноеИмяФайла = НРег(ФайловыеОперации.ПолучитьНормализованныйОтносительныйПуть(КаталогРепозитория, ОтносительноеИмяФайла));
|
||||
|
||||
Для Каждого ИмяПроекта Из ПроектыКонфигурации() Цикл
|
||||
|
||||
НормализованноеИмяПроекта = НРег(ИмяПроекта);
|
||||
|
||||
Если СтрНачинаетсяС(ОтносительноеИмяФайла, НормализованноеИмяПроекта) Тогда
|
||||
|
||||
Возврат ИмяПроекта;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат "";
|
||||
|
||||
КонецФункции
|
||||
|
||||
Процедура УдалитьПроекты() Экспорт
|
||||
|
||||
ЗначениеНастройки("").Удалить(КлючПроекты()); // Удаляем ветку "Проекты" из корня настроек прекоммит
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура УдалитьПроект(Подпроект) Экспорт
|
||||
|
||||
ИмяПроекта = ИмяПроектаДляФайла(Подпроект);
|
||||
|
||||
Если НЕ ЗначениеЗаполнено(ИмяПроекта) ИЛИ СтрДлина(ИмяПроекта) <> СтрДлина(Подпроект) Тогда
|
||||
МенеджерПриложения.ПолучитьЛог().Предупреждение("Не найден проект %1", Подпроект);
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
ЗначениеНастройки(КлючПроекты()).Удалить(ИмяПроекта);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Функция НормализованноеИмяПроекта(ИмяПроекта) Экспорт
|
||||
|
||||
Если НЕ ЗначениеЗаполнено(ИмяПроекта) Тогда
|
||||
|
||||
Возврат ИмяПроекта;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
НормализованноеИмяПроекта = ФайловыеОперации.ПолучитьНормализованныйОтносительныйПуть(КаталогРепозитория, ИмяПроекта);
|
||||
|
||||
Возврат НормализованноеИмяПроекта;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПроверитьНастройкуПроектов() Экспорт
|
||||
|
||||
Успешно = Истина;
|
||||
|
||||
Лог = МенеджерПриложения.ПолучитьЛог();
|
||||
Для Каждого ИмяПроекта Из ПроектыКонфигурации() Цикл
|
||||
|
||||
Если НормализованноеИмяПроекта(ИмяПроекта) <> ИмяПроекта Тогда
|
||||
|
||||
Лог.Предупреждение("Имя проекта '%1' указано не корректно (должно быть %2), возможно приложение будет работать не корректно", ИмяПроекта, НормализованноеИмяПроекта(ИмяПроекта));
|
||||
Успешно = Ложь;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат Успешно;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
Функция ЭтоНовый() Экспорт
|
||||
|
||||
Возврат Настройки().ЭтоНовый();
|
||||
|
||||
КонецФункции
|
||||
|
||||
Процедура ЗаписатьНастройки() Экспорт
|
||||
|
||||
Настройки().ЗаписатьНастройкиПриложения(КлючНастройкиPrecommit(), ЗначениеНастройки(""));
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура УдалитьНастройки() Экспорт
|
||||
|
||||
Если НЕ ИспользуютсяЛокальныеНастройки() Тогда
|
||||
|
||||
ВызватьИсключение "Нельзя удалять глобальную настройку";
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Настройки().УдалитьНастройкиПриложения(КлючНастройкиPrecommit());
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// СЛУЖЕБНЫЙ ФУНКЦИОНАЛ
|
||||
///////////////////////////////////////////////////////////////////
|
||||
|
||||
Функция КлючНастройкиPrecommit() Экспорт
|
||||
|
||||
Возврат "Precommt4onecСценарии";
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция КлючПроекты() Экспорт
|
||||
|
||||
Возврат "Проекты";
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПолучитьИменаСценариевКаталога(КаталогСценариев) Экспорт
|
||||
|
||||
НайденныеСценарии = Новый Массив;
|
||||
ФайлыСценариев = НайтиФайлы(КаталогСценариев, "*.os");
|
||||
Для Каждого ФайлСценария Из ФайлыСценариев Цикл
|
||||
|
||||
Если СтрСравнить(ФайлСценария.ИмяБезРасширения, "ШаблонСценария") = 0 Тогда
|
||||
|
||||
Продолжить;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
НайденныеСценарии.Добавить(ФайлСценария.Имя);
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат НайденныеСценарии;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция КлючНастройки(Знач Проект = Неопределено, КлючНастройки = Неопределено)
|
||||
|
||||
Ключ = Новый Массив();
|
||||
|
||||
Проект = НормализованноеИмяПроекта(Проект);
|
||||
|
||||
Если ЗначениеЗаполнено(Проект) И ЕстьПроект(Проект) Тогда
|
||||
|
||||
Ключ.Добавить(КлючПроекты());
|
||||
Ключ.Добавить(Проект);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Если ЗначениеЗаполнено(КлючНастройки) Тогда
|
||||
|
||||
Ключ.Добавить(КлючНастройки);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Возврат Ключ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ЕстьПроект(Проект)
|
||||
|
||||
Возврат ПроектыКонфигурации().Найти(Проект) <> Неопределено;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПолучитьНастройкиПроекта(Настройка, Подпроект) Экспорт
|
||||
|
||||
Значение = ЗначениеНастроекПоКлючу(Настройка, КлючНастройки(Подпроект));
|
||||
|
||||
Если Значение = Неопределено Тогда
|
||||
|
||||
Значение = ЗначениеНастроекПоКлючу(Настройка, "");
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Возврат Значение;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ЗначениеНастроекПоКлючу(Настройка, КлючНастройки)
|
||||
|
||||
Значение = Настройка.НастройкиПриложения(КлючНастройкиPrecommit());
|
||||
|
||||
Возврат ЗначениеПоКлючу(Значение, КлючНастройки);
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ЗначениеПоКлючу(Коллекция, КлючЗначения) Экспорт
|
||||
|
||||
Значение = Коллекция;
|
||||
|
||||
Если НЕ ЗначениеЗаполнено(КлючЗначения) Тогда
|
||||
|
||||
Возврат Значение;
|
||||
|
||||
ИначеЕсли ТипЗнч(КлючЗначения) = Тип("Строка") Тогда
|
||||
|
||||
Ключи = СтрРазделить(КлючЗначения, ".");
|
||||
|
||||
Иначе
|
||||
|
||||
Ключи = КлючЗначения;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Для каждого Ключ Из Ключи Цикл
|
||||
|
||||
Значение = Значение.Получить(Ключ);
|
||||
|
||||
Если Значение = Неопределено Тогда
|
||||
|
||||
Прервать;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат Значение;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ЕстьНастройкиPrecommt4onec(Настройка)
|
||||
|
||||
Возврат НЕ Настройка.ЭтоНовый() И ЗначениеНастроекПоКлючу(Настройка, "").Количество();
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПолучитьЗначениеНастройки(Настройка, КлючНастройки, Подпроект = Неопределено)
|
||||
|
||||
Значение = ЗначениеНастроекПоКлючу(Настройка, КлючНастройки(Подпроект, КлючНастройки));
|
||||
|
||||
Возврат Значение;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Процедура УстановитьКаталогГлобальныхНастроек(Каталог) Экспорт
|
||||
|
||||
КаталогГлобальныхНастроек = Каталог;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура СбросСостоянияМенеджера() Экспорт
|
||||
|
||||
ЛокальныеНастройки = Неопределено;
|
||||
ГлобальныеНастройки = Неопределено;
|
||||
ИспользуютсяЛокальныеНастройки = Ложь;
|
||||
|
||||
НастройкиИнициализированы = Ложь;
|
||||
КаталогГлобальныхНастроек = Неопределено;
|
||||
КаталогРепозитория = Неопределено;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
СбросСостоянияМенеджера();
|
@ -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");
|
||||
|
||||
КонецПроцедуры // ПриРегистрацииКомандПриложения
|
||||
|
25
src/Модули/РегулярныеВыражения.os
Normal file
25
src/Модули/РегулярныеВыражения.os
Normal file
@ -0,0 +1,25 @@
|
||||
Функция ПолучитьДочерниеЭлементыОписанияКонфигурации(Знач СодержимоеФайла) Экспорт
|
||||
|
||||
Элементы = Новый Структура("Количество,ДочерниеЭлементыСтрока,Совпадения", 0, "", Неопределено);
|
||||
|
||||
Регексп = Новый РегулярноеВыражение("(<ChildObjects>\s+?)([\w\W]+?)(\s+<\/ChildObjects>)");
|
||||
Регексп.ИгнорироватьРегистр = Истина;
|
||||
Регексп.Многострочный = Истина;
|
||||
|
||||
ДочерниеЭлементы = Регексп.НайтиСовпадения(СодержимоеФайла);
|
||||
Элементы.Количество = ДочерниеЭлементы.Количество();
|
||||
Элементы.Совпадения = ДочерниеЭлементы;
|
||||
|
||||
Если НЕ Элементы.Количество = 0 Тогда // Если количество 0 вернется пустая коллекция
|
||||
|
||||
Элементы.ДочерниеЭлементыСтрока = ДочерниеЭлементы[0].Группы[2].Значение;
|
||||
РегекспМетаданные = Новый РегулярноеВыражение("^\s+<([\w]+)>([а-яa-zA-ZА-Я0-9_]+)<\/[\w]+>");
|
||||
РегекспМетаданные.ИгнорироватьРегистр = Истина;
|
||||
РегекспМетаданные.Многострочный = Истина;
|
||||
Элементы.Совпадения = РегекспМетаданные.НайтиСовпадения(Элементы.ДочерниеЭлементыСтрока);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Возврат Элементы;
|
||||
|
||||
КонецФункции
|
117
src/Модули/РедакторНастроек.os
Normal file
117
src/Модули/РедакторНастроек.os
Normal file
@ -0,0 +1,117 @@
|
||||
Процедура СброситьНастройкиРепозитория(СброситьНастройкиПодпроектов = Ложь, Знач Подпроект = "") Экспорт
|
||||
|
||||
Если МенеджерНастроек.ЭтоНовый() Тогда
|
||||
|
||||
Возврат;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Если ЗначениеЗаполнено(Подпроект) Тогда
|
||||
|
||||
МенеджерНастроек.УдалитьПроект(Подпроект);
|
||||
МенеджерНастроек.ЗаписатьНастройки();
|
||||
|
||||
ИначеЕсли СброситьНастройкиПодпроектов Тогда
|
||||
|
||||
МенеджерНастроек.УдалитьПроекты();
|
||||
МенеджерНастроек.ЗаписатьНастройки();
|
||||
|
||||
Иначе
|
||||
|
||||
МенеджерНастроек.УдалитьНастройки(); // Удаляем ветку настроек прекоммит
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура СброситьГлобальныеНастройки() Экспорт
|
||||
|
||||
Если МенеджерНастроек.ИспользуютсяЛокальныеНастройки() Тогда
|
||||
|
||||
ВызватьИсключение
|
||||
"Обнаружен не корректный вызов.
|
||||
|Для сброса глобальных настроек необходимо загрузить глобальные настройки
|
||||
|вызвав МенеджерНастроек.ГлобальныеНастройки";
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
ИмяПриложения = МенеджерНастроек.КлючНастройкиPrecommit();
|
||||
Настройки = МенеджерНастроек.ГлобальныеНастройки();
|
||||
|
||||
СтандартныеНастройки = ПолучитьСтандартнуюСтруктуруНастроек();
|
||||
|
||||
ГлобальныеСценарии = СценарииОбработки.ГлобальныеСценарии();
|
||||
НастройкиСценариев = СценарииОбработки.НастройкиГлобальныхСценариев();
|
||||
|
||||
СтандартныеНастройки.Вставить("ГлобальныеСценарии", ГлобальныеСценарии);
|
||||
СтандартныеНастройки.Вставить("НастройкиСценариев", НастройкиСценариев);
|
||||
|
||||
Настройки.ЗаписатьНастройкиПриложения(ИмяПриложения, СтандартныеНастройки);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Функция ПолучитьСтандартнуюСтруктуруНастроек() Экспорт
|
||||
|
||||
Настройки = Новый Соответствие();
|
||||
|
||||
Настройки.Вставить("ИспользоватьСценарииРепозитория", Ложь);
|
||||
Настройки.Вставить("КаталогЛокальныхСценариев", "");
|
||||
Настройки.Вставить("ГлобальныеСценарии", Новый Массив);
|
||||
Настройки.Вставить("ОтключенныеСценарии", Новый Массив);
|
||||
Настройки.Вставить("НастройкиСценариев", Новый Соответствие());
|
||||
Возврат Настройки;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Процедура ЗаписатьНастройкиРепозитория(НовыеНастройки) Экспорт
|
||||
|
||||
УправлениеНастройками = МенеджерНастроек.Настройки();
|
||||
|
||||
Для каждого НоваяНастройка Из НовыеНастройки Цикл
|
||||
УправлениеНастройками.ЗаписатьНастройкиПриложения(НоваяНастройка.Ключ, НоваяНастройка.Значение);
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ОбновитьНастройки(БазовыеНастройки, НастройкиПроектов) Экспорт
|
||||
|
||||
Лог = МенеджерПриложения.ПолучитьЛог();
|
||||
|
||||
Лог.Отладка("Обновление настроек");
|
||||
КлючПроекты = МенеджерНастроек.КлючПроекты();
|
||||
|
||||
Если БазовыеНастройки = Неопределено Тогда
|
||||
|
||||
БазовыеНастройки = МенеджерНастроек.НастройкиПроекта("");
|
||||
|
||||
Иначе
|
||||
|
||||
БазовыеНастройки.Вставить(КлючПроекты, Новый Соответствие());
|
||||
|
||||
Для Каждого ИмяПроекта Из МенеджерНастроек.ПроектыКонфигурации() Цикл
|
||||
|
||||
БазовыеНастройки[КлючПроекты].Вставить(ИмяПроекта, МенеджерНастроек.НастройкиПроекта(ИмяПроекта));
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Если ЗначениеЗаполнено(НастройкиПроектов) Тогда
|
||||
|
||||
Если БазовыеНастройки[КлючПроекты] = Неопределено Тогда
|
||||
|
||||
БазовыеНастройки.Вставить(КлючПроекты, Новый Соответствие());
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Для Каждого Элемент Из НастройкиПроектов Цикл
|
||||
|
||||
БазовыеНастройки[КлючПроекты].Вставить(Элемент.Ключ, Элемент.Значение);
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
МенеджерНастроек.Настройки().ЗаписатьНастройкиПриложения(МенеджерНастроек.КлючНастройкиPrecommit(), БазовыеНастройки);
|
||||
|
||||
КонецПроцедуры
|
228
src/Модули/СценарииОбработки.os
Normal file
228
src/Модули/СценарииОбработки.os
Normal file
@ -0,0 +1,228 @@
|
||||
Функция Загрузить(КаталогРепозитория, Проект, Знач ПараметрИменаЗагружаемыхСценариев = Неопределено) Экспорт
|
||||
|
||||
ТекущийКаталогСценариев = МенеджерПриложения.КаталогСценариев();
|
||||
ВсеЗагруженные = Новый Массив;
|
||||
ФайлыГлобальныхСценариев = НайтиФайлы(ТекущийКаталогСценариев, "*.os");
|
||||
ФайлыЛокальныхСценариев = Новый Массив;
|
||||
|
||||
|
||||
Лог = МенеджерПриложения.ПолучитьЛог();
|
||||
|
||||
Если ПараметрИменаЗагружаемыхСценариев <> Неопределено Тогда
|
||||
|
||||
ИменаЗагружаемыхСценариев = ПараметрИменаЗагружаемыхСценариев;
|
||||
|
||||
Иначе
|
||||
|
||||
ИменаЗагружаемыхСценариев = МенеджерНастроек.ИменаЗагружаемыхСценариев(Проект);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Если НЕ МенеджерНастроек.ЭтоНовый() Тогда
|
||||
|
||||
Лог.Информация("Читаем настройки " + Проект);
|
||||
|
||||
ИспользоватьСценарииРепозитория = МенеджерНастроек.ЗначениеНастройки("ИспользоватьСценарииРепозитория", Проект, Ложь);
|
||||
|
||||
Если ИспользоватьСценарииРепозитория Тогда
|
||||
|
||||
ЛокальныйКаталог = МенеджерНастроек.ЗначениеНастройки("КаталогЛокальныхСценариев", Проект);
|
||||
ПутьКЛокальнымСценариям = ОбъединитьПути(КаталогРепозитория, ЛокальныйКаталог);
|
||||
ФайлПутьКЛокальнымСценариям = Новый Файл(ПутьКЛокальнымСценариям);
|
||||
|
||||
Если Не ФайлПутьКЛокальнымСценариям.Существует() ИЛИ ФайлПутьКЛокальнымСценариям.ЭтоФайл() Тогда
|
||||
|
||||
Лог.Ошибка("Сценарии из репозитория не загружены т.к. отсутствует каталог %1", ЛокальныйКаталог);
|
||||
|
||||
Иначе
|
||||
|
||||
ФайлыЛокальныхСценариев = НайтиФайлы(ФайлПутьКЛокальнымСценариям.ПолноеИмя, "*.os");
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
ЗагрузитьИзКаталога(ВсеЗагруженные, ФайлыГлобальныхСценариев, ИменаЗагружаемыхСценариев);
|
||||
ЗагрузитьИзКаталога(ВсеЗагруженные, ФайлыЛокальныхСценариев, , Истина);
|
||||
|
||||
Если ВсеЗагруженные.Количество() = 0 Тогда
|
||||
|
||||
ВызватьИсключение "Нет доступных сценариев обработки файлов";
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Возврат ВсеЗагруженные;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Процедура ЗагрузитьИзКаталога(ВсеЗагруженные, ФайлыСценариев,
|
||||
Знач ИменаЗагружаемыхСценариев = Неопределено,
|
||||
ЗагрузитьВсе = Ложь) Экспорт
|
||||
Лог = МенеджерПриложения.ПолучитьЛог();
|
||||
|
||||
Если ИменаЗагружаемыхСценариев = Неопределено Тогда
|
||||
|
||||
ИменаЗагружаемыхСценариев = Новый Массив;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Для Каждого ФайлСценария Из ФайлыСценариев Цикл
|
||||
|
||||
Если СтрСравнить(ФайлСценария.ИмяБезРасширения, "ШаблонСценария") = 0 Тогда
|
||||
|
||||
Продолжить;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Если НЕ ЗагрузитьВсе
|
||||
И ИменаЗагружаемыхСценариев.Найти(ФайлСценария.Имя) = Неопределено
|
||||
И ИменаЗагружаемыхСценариев.Найти(ФайлСценария.ИмяБезРасширения) = Неопределено Тогда
|
||||
|
||||
Продолжить;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Попытка
|
||||
|
||||
СценарийОбработки = ЗагрузитьСценарий(ФайлСценария.ПолноеИмя);
|
||||
ВсеЗагруженные.Добавить(СценарийОбработки);
|
||||
|
||||
Исключение
|
||||
|
||||
Лог.Ошибка("Ошибка загрузки сценария %1: %2", ФайлСценария.ПолноеИмя, ОписаниеОшибки());
|
||||
Продолжить;
|
||||
|
||||
КонецПопытки;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Функция ПолучитьСтандартныеПараметрыОбработки() Экспорт
|
||||
Лог = МенеджерПриложения.ПолучитьЛог();
|
||||
ПараметрыОбработки = Новый Структура();
|
||||
ПараметрыОбработки.Вставить("Лог", Лог);
|
||||
ПараметрыОбработки.Вставить("ФайлыДляПостОбработки", Новый Массив);
|
||||
ПараметрыОбработки.Вставить("ИзмененныеКаталоги", Новый Массив);
|
||||
ПараметрыОбработки.Вставить("КаталогРепозитория", Неопределено);
|
||||
ПараметрыОбработки.Вставить("Настройки", Неопределено);
|
||||
|
||||
Возврат ПараметрыОбработки;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// <Возвращает соответствие со сценариями и их настройками>
|
||||
//
|
||||
// Параметры:
|
||||
// КаталогРепозитория - <Строка> - <Адрес каталога репозитория>
|
||||
// ИменаЗагружаемыхСценариев - <Массив.Строка> - <Предназначен для переопределения сценариев,
|
||||
// Если задан загрузятся только они >
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// <Соответствие> - <ключ - Ключ структуры настроек прекоммит или
|
||||
// путь к каталогу, который обрабатывается
|
||||
// нестандартными правилами >
|
||||
//
|
||||
Функция ПолучитьСценарииСПараметрамиВыполнения(КаталогРепозитория, ИменаЗагружаемыхСценариев = Неопределено) Экспорт
|
||||
|
||||
ПараметрыОбработки = СценарииОбработки.ПолучитьСтандартныеПараметрыОбработки();
|
||||
ПараметрыОбработки.КаталогРепозитория = КаталогРепозитория;
|
||||
НастройкиПроектов = МенеджерНастроек.ПроектыКонфигурации();
|
||||
НаборНастроек = Новый Соответствие;
|
||||
|
||||
Для Каждого ИмяПроекта Из НастройкиПроектов Цикл
|
||||
Настройка = НастройкаОбработкиПроекта(ИмяПроекта, КаталогРепозитория, ИменаЗагружаемыхСценариев);
|
||||
НаборНастроек.Вставить(ИмяПроекта, Настройка);
|
||||
КонецЦикла;
|
||||
|
||||
ИмяПроекта = ""; // Базовые настройки
|
||||
Настройка = НастройкаОбработкиПроекта(ИмяПроекта, КаталогРепозитория, ИменаЗагружаемыхСценариев);
|
||||
НаборНастроек.Вставить(ИмяПроекта, Настройка);
|
||||
|
||||
Возврат НаборНастроек;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция НастройкаОбработкиПроекта(ИмяПроекта, КаталогРепозитория, Знач ИменаЗагружаемыхСценариев = Неопределено)
|
||||
|
||||
Настройка = Новый Структура("СценарииОбработки, НастройкиСценариев");
|
||||
Если ИменаЗагружаемыхСценариев = Неопределено Тогда
|
||||
ИменаЗагружаемыхСценариев = МенеджерНастроек.ИменаЗагружаемыхСценариев(ИмяПроекта)
|
||||
КонецЕсли;
|
||||
|
||||
Настройка.СценарииОбработки = СценарииОбработки.Загрузить(КаталогРепозитория,
|
||||
ИмяПроекта,
|
||||
ИменаЗагружаемыхСценариев);
|
||||
|
||||
Настройка.НастройкиСценариев = МенеджерНастроек.НастройкиПроекта(ИмяПроекта);
|
||||
|
||||
Возврат Настройка;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПолучитьПараметрыОбработкиФайла(ИмяФайла, НастройкиПроектов) Экспорт
|
||||
|
||||
ИмяОбщейНастройки = МенеджерНастроек.КлючНастройкиPrecommit();
|
||||
НайденнаяНастройка = НастройкиПроектов.Получить(ИмяОбщейНастройки);
|
||||
|
||||
Для Каждого ЭлементНастройки Из НастройкиПроектов Цикл
|
||||
|
||||
Если ЭлементНастройки.Ключ = ИмяОбщейНастройки Тогда
|
||||
|
||||
Продолжить;
|
||||
|
||||
ИначеЕсли СтрНачинаетсяС(ИмяФайла, ЭлементНастройки.Ключ) Тогда
|
||||
|
||||
НайденнаяНастройка = ЭлементНастройки.Значение;
|
||||
|
||||
Иначе
|
||||
// ничего
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат НайденнаяНастройка;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ГлобальныеСценарии() Экспорт
|
||||
|
||||
Возврат МенеджерНастроек.ПолучитьИменаСценариевКаталога(МенеджерПриложения.КаталогСценариев());
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция НастройкиГлобальныхСценариев() Экспорт
|
||||
|
||||
Возврат НастройкиСценариев(ГлобальныеСценарии(), МенеджерПриложения.КаталогСценариев());
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция НастройкиСценариев(ИменаСценариев, Знач КаталогСценариев = Неопределено) Экспорт
|
||||
|
||||
Если КаталогСценариев = Неопределено Тогда
|
||||
|
||||
КаталогСценариев = МенеджерПриложения.КаталогСценариев();
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
НастройкиСценариев = Новый Соответствие;
|
||||
Рефлектор = Новый Рефлектор;
|
||||
|
||||
Для Каждого ИмяСценария Из ИменаСценариев Цикл
|
||||
|
||||
ОбъектСценария = ЗагрузитьСценарий(ОбъединитьПути(КаталогСценариев, ИмяСценария));
|
||||
|
||||
Если Рефлектор.МетодСуществует(ОбъектСценария, "ПолучитьСтандартныеНастройкиСценария") Тогда
|
||||
|
||||
СтруктураНастроек = Рефлектор.ВызватьМетод(ОбъектСценария, "ПолучитьСтандартныеНастройкиСценария");
|
||||
НастройкиСценариев.Вставить(СтруктураНастроек.ИмяСценария, СтруктураНастроек.Настройка);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат НастройкиСценариев;
|
||||
|
||||
КонецФункции
|
@ -130,9 +130,13 @@
|
||||
// Строка - относительный путь файла
|
||||
//
|
||||
Функция ПолучитьНормализованныйОтносительныйПуть(Знач ПутьКорневогоКаталога, Знач ОтносительныйПутьФайла) Экспорт
|
||||
|
||||
|
||||
ПроверитьКорневойКаталог(ПутьКорневогоКаталога);
|
||||
|
||||
Если СтрНачинаетсяС(ОтносительныйПутьФайла, ПолучитьРазделительПути()) Тогда
|
||||
ОтносительныйПутьФайла = Сред(ОтносительныйПутьФайла, 2);
|
||||
КонецЕсли;
|
||||
|
||||
ПолныйПутьФайла = ОбъединитьПути(ПутьКорневогоКаталога, ОтносительныйПутьФайла);
|
||||
ОтносительныйПуть = ОтносительныйПуть(ПутьКорневогоКаталога, ПолныйПутьФайла, ПолучитьРазделительПути());
|
||||
Файл = Новый Файл(ПолныйПутьФайла);
|
||||
@ -163,6 +167,42 @@
|
||||
|
||||
КонецФункции
|
||||
|
||||
|
||||
Функция НайтиКаталоги(Путь) Экспорт
|
||||
|
||||
МассивКаталогов = Новый Массив;
|
||||
|
||||
ФайлКаталога = Новый Файл(Путь);
|
||||
|
||||
Если ФайлКаталога.Существует() И ФайлКаталога.ЭтоКаталог() Тогда
|
||||
|
||||
МассивФайлов = НайтиФайлы(ФайлКаталога.ПолноеИмя, "*");
|
||||
|
||||
Для Каждого Файл Из МассивФайлов Цикл
|
||||
|
||||
Если Файл.ЭтоКаталог() Тогда
|
||||
|
||||
МассивКаталогов.Добавить(Файл);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Возврат МассивКаталогов;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция КаталогСуществует(Знач Путь1, Знач Путь2 = Неопределено, Знач Путь3 = Неопределено, Знач Путь4 = Неопределено) Экспорт
|
||||
|
||||
ПолныйПуть = ОбъединитьПути(Путь1, Путь2, Путь3, Путь4);
|
||||
|
||||
Файл = Новый Файл(ПолныйПуть);
|
||||
Возврат Файл.Существует() И Файл.ЭтоКаталог();
|
||||
|
||||
КонецФункции
|
||||
|
||||
Процедура ПроверитьКорневойКаталог(ПутьКорневогоКаталога)
|
||||
|
||||
Если ПустаяСтрока(ПутьКорневогоКаталога) Тогда
|
||||
@ -171,4 +211,4 @@
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецПроцедуры
|
||||
КонецПроцедуры
|
||||
|
@ -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", ОбъектМетаданных.ТипМетаданных, ОбъектМетаданных.ИмяМетаданных));
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
@ -148,7 +148,7 @@
|
||||
СодержимоеФайла = Текст.Прочитать();
|
||||
Текст.Закрыть();
|
||||
|
||||
Регексп = Новый РегулярноеВыражение("(<\/languages>\s*?)([\w\W]*)(<\/mdclass\:Configuration>)");
|
||||
Регексп = Новый РегулярноеВыражение("(<\/languages>\s*)([\w\W]*)(<\/mdclass\:Configuration>)");
|
||||
Регексп.ИгнорироватьРегистр = ИСТИНА;
|
||||
Регексп.Многострочный = ИСТИНА;
|
||||
ПодчиненныеМетаданные = Регексп.НайтиСовпадения(СодержимоеФайла);
|
||||
|
31
tests/fixtures/Настройки/v8config.json
vendored
Normal file
31
tests/fixtures/Настройки/v8config.json
vendored
Normal 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,
|
||||
"ВерсияПлатформы": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
14
tests/fixtures/Настройки/v8configБезНастроекПрекоммит.json
vendored
Normal file
14
tests/fixtures/Настройки/v8configБезНастроекПрекоммит.json
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
{
|
||||
"GLOBAL": {
|
||||
"ВерсияПлатформы": "8.3.10.2580",
|
||||
"version": "2.0",
|
||||
"ФорматEDT": true
|
||||
},
|
||||
"АвтоТестирование": {
|
||||
"Выполнять": true,
|
||||
"ВыполнятьБазовые": true,
|
||||
"ВыполнятьxUnit": true,
|
||||
"РасширениеДляxUnit": true,
|
||||
"ВыполнятьVanessa": true
|
||||
}
|
||||
}
|
32
tests/fixtures/Настройки/v8configОтключенныеСценарии.json
vendored
Normal file
32
tests/fixtures/Настройки/v8configОтключенныеСценарии.json
vendored
Normal 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,
|
||||
"ВерсияПлатформы": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
40
tests/fixtures/Настройки/v8configОтключенныеСценарииПереопреденыГлобальные.json
vendored
Normal file
40
tests/fixtures/Настройки/v8configОтключенныеСценарииПереопреденыГлобальные.json
vendored
Normal 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,
|
||||
"ВерсияПлатформы": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
49
tests/fixtures/Настройки/v8configПроекты.json
vendored
Normal file
49
tests/fixtures/Настройки/v8configПроекты.json
vendored
Normal 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,
|
||||
"ВерсияПлатформы": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
176
tests/fixtures/СинхронизацияОбъектовМетаданныхИФайлов/Configuration.xml
vendored
Normal file
176
tests/fixtures/СинхронизацияОбъектовМетаданныхИФайлов/Configuration.xml
vendored
Normal 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>
|
1
tests/fixtures/СинхронизацияОбъектовМетаданныхИФайлов/WebServices/Ancillary/Ext/Module.bsl
vendored
Normal file
1
tests/fixtures/СинхронизацияОбъектовМетаданныхИФайлов/WebServices/Ancillary/Ext/Module.bsl
vendored
Normal file
@ -0,0 +1 @@
|
||||
тест
|
46
tests/fixtures/СинхронизацияОбъектовМетаданныхИФайлов/WebServices/ancillary.xml
vendored
Normal file
46
tests/fixtures/СинхронизацияОбъектовМетаданныхИФайлов/WebServices/ancillary.xml
vendored
Normal 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>
|
@ -0,0 +1 @@
|
||||
тест
|
117
tests/fixtures/ХранениеРазныхНастроек/v8config.json
vendored
Normal file
117
tests/fixtures/ХранениеРазныхНастроек/v8config.json
vendored
Normal 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,
|
||||
"ВерсияПлатформы": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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 @@
|
||||
|
||||
Функция ПодготовитьИзменяемыйТестовыйФайл(Знач ИмяТестовогоФайла)
|
||||
|
||||
ПутьКТесту = ОбъединитьПути(КаталогТестовыхФикстур(), ИмяТестовогоФайла);
|
||||
ПутьКТесту = ОбъединитьПути(КаталогТестовыхФикстур(), ИмяТестовогоФайла);
|
||||
ПутьКФайлу = МенеджерВременныхФайлов.СоздатьФайл(ИмяТестовогоФайла);
|
||||
КопироватьФайл(ПутьКТесту, ПутьКФайлу);
|
||||
Файл = Новый Файл(ПутьКФайлу);
|
||||
|
||||
Возврат Файл;
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
307
tests/ТестНастройкиРепозитория.os
Normal file
307
tests/ТестНастройкиРепозитория.os
Normal 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] = Значение;
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
282
tests/ТестРедакторНастроек.os
Normal file
282
tests/ТестРедакторНастроек.os
Normal 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] = Значение;
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
@ -16,6 +16,7 @@
|
||||
|
||||
ВсеТесты.Добавить("ТестДолжен_ПрочитатьФайл");
|
||||
ВсеТесты.Добавить("ТестДолжен_ЗаписатьФайл");
|
||||
ВсеТесты.Добавить("ТестДолжен_ПроверитьПоискКаталогов");
|
||||
|
||||
Возврат ВсеТесты;
|
||||
|
||||
@ -41,6 +42,37 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ТестДолжен_ПроверитьПоискКаталогов() Экспорт
|
||||
|
||||
ТестовыйКаталог = МенеджерВременныхФайлов.СоздатьКаталог();
|
||||
МенеджерВременныхФайлов.БазовыйКаталог = ТестовыйКаталог;
|
||||
|
||||
НайденныеКаталоги = ФайловыеОперации.НайтиКаталоги(ТестовыйКаталог);
|
||||
|
||||
Утверждения.ПроверитьРавенство(ТипЗнч(НайденныеКаталоги), Тип("Массив"));
|
||||
|
||||
Утверждения.ПроверитьРавенство(ФайловыеОперации.НайтиКаталоги(ТестовыйКаталог).Количество(), 0);
|
||||
|
||||
МенеджерВременныхФайлов.СоздатьКаталог();
|
||||
Утверждения.ПроверитьРавенство(ФайловыеОперации.НайтиКаталоги(ТестовыйКаталог).Количество(), 1);
|
||||
|
||||
МенеджерВременныхФайлов.СоздатьКаталог();
|
||||
Утверждения.ПроверитьРавенство(ФайловыеОперации.НайтиКаталоги(ТестовыйКаталог).Количество(), 2);
|
||||
|
||||
МенеджерВременныхФайлов.СоздатьКаталог();
|
||||
Утверждения.ПроверитьРавенство(ФайловыеОперации.НайтиКаталоги(ТестовыйКаталог).Количество(), 3);
|
||||
|
||||
МенеджерВременныхФайлов.СоздатьКаталог();
|
||||
Утверждения.ПроверитьРавенство(ФайловыеОперации.НайтиКаталоги(ТестовыйКаталог).Количество(), 4);
|
||||
|
||||
ИмяФайла = МенеджерВременныхФайлов.СоздатьФайл();
|
||||
Файл = Новый Файл(ИмяФайла);
|
||||
Утверждения.ПроверитьРавенство(Файл.Путь, ТестовыйКаталог + ПолучитьРазделительПути());
|
||||
Утверждения.ПроверитьРавенство(Файл.Существует(), Истина);
|
||||
Утверждения.ПроверитьРавенство(ФайловыеОперации.НайтиКаталоги(ТестовыйКаталог).Количество(), 4);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ПередЗапускомТеста() Экспорт
|
||||
|
||||
ВремТестер = Новый Тестер;
|
||||
|
@ -18,6 +18,7 @@
|
||||
"УдалениеЛишнихКонцевыхПробелов.os",
|
||||
"УдалениеЛишнихПустыхСтрок.os"
|
||||
],
|
||||
"ОтключенныеСценарии": [],
|
||||
"НастройкиСценариев": {
|
||||
"ОтключениеПолнотекстовогоПоиска": {
|
||||
"МетаданныеДляИсключения": {
|
||||
|
Loading…
x
Reference in New Issue
Block a user