Merge branch 'develop' into feature/doc_debug

This commit is contained in:
Oleg Karataev committed 2025-11-11 17:17:45 +03:00
commit 4d537020e4
21 files changed
+682 -283

No files matched your search

+1 -1
View File
@@ -1,6 +1,6 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2014-2024 BIA-Technologies Limited Liability Company
// Copyright 2014-2025 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
+1 -2
View File
@@ -1,7 +1,6 @@
The MIT License (MIT)
Copyright (c) 2016 Andrei Ovsiankin
Copyright (c) 2017-2019 BIA Technologies, LLC
Copyright (c) 2017-2925 BIA Technologies, LLC
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+3 -1
View File
@@ -80,7 +80,7 @@ precommit4onec может читать настройки своей работ
- Изменить список сценариев обработки файлов
- Активизировать алгоритм подключения сценариев из каталогов репозитория
Некоторые сценарии поддерживают возможность изменения своих настроек со значений по умолчанию на установленные в конфигурационном файле. На данный момент реализована возможность указывать необходимую версию платформы 1С:Предприятие в сценарии `РазборОтчетОбработокРасширений`.
Некоторые сценарии поддерживают возможность изменения своих настроек со значений по умолчанию на установленные в конфигурационном файле. На данный момент реализована возможность указывать необходимую версию платформы 1С:Предприятие в сценарии `РазборОтчетОбработокРасширений`. Для всех сценариев поддерживается возможность указания маски обрабатываемых файлов с помощью свойств: `ВключатьФайлы`, `ИсключатьФайлы`.
### Структура файла настроек
@@ -96,6 +96,8 @@ precommit4onec может читать настройки своей работ
"КаталогЛокальныхСценариев": "", // Относительный путь к каталогу локальных проверок
"ГлобальныеСценарии": [...], // Список проверок, которые будут выполнятся
"ОтключенныеСценарии": [...], // Список проверок, которые не будут выполнятся (имеет больший приоритет относительно ГлобальныеСценарии)
"ВключатьФайлы": [], // Массив масок регулярных выражений, если указан, будут обрабатываться только файлы, соответствующие одной из масок
"ИсключатьФайлы": [], // Массив масок регулярных выражений, если указан, будут пропускаться файлы, соответствующие одной из масок
"НастройкиСценариев": { // Настройки выполняемых проверок
...
},
@@ -21,28 +21,28 @@
И я копирую файл "tests/fixtures/demo/DemoОтчет.erf" в каталог репозитория "РабочийКаталог"
И я копирую файл "tests/fixtures/demo/DemoРасширение.cfe" в каталог репозитория "РабочийКаталог"
И я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os exec-rules <РабочийКаталог> -source-dir ."
Тогда В каталоге "." репозитория "РабочийКаталог" есть файл "erf/DemoОтчет/DemoОтчет/Forms/ОсновнаяОФ/Ext/Form/Module.bsl"
И В каталоге "." репозитория "РабочийКаталог" есть файл "erf/DemoОтчет/DemoОтчет/Forms/ОсновнаяОФ/Ext/Form/form"
И В каталоге "." репозитория "РабочийКаталог" есть файл "erf/DemoОтчет/DemoОтчет.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "erf/DemoОтчет/DemoОтчет/Templates/ОсновнаяСхемаКомпоновкиДанных.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "erf/DemoОтчет/DemoОтчет/Templates/ОсновнаяСхемаКомпоновкиДанных/Ext/Template.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "erf/DemoОтчет/DemoОтчет/Forms/ОсновнаяОФ.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "erf/DemoОтчет/DemoОтчет/Forms/ОсновнаяОФ/Ext/Form.bin"
И В каталоге "." репозитория "РабочийКаталог" есть файл "erf/DemoОтчет/DemoОтчет/Forms/ОсновнаяУФ.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "erf/DemoОтчет/DemoОтчет/Forms/ОсновнаяУФ/Ext/Form.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "epf/DemoОбработка/DemoОбработка.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "epf/DemoОбработка/DemoОбработка/Forms/ОсновнаяОФ.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "epf/DemoОбработка/DemoОбработка/Forms/ОсновнаяОФ/Ext/Form.bin"
И В каталоге "." репозитория "РабочийКаталог" есть файл "epf/DemoОбработка/DemoОбработка/Forms/ОсновнаяУФ.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "epf/DemoОбработка/DemoОбработка/Forms/ОсновнаяУФ/Ext/Form.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "epf/DemoОбработка/DemoОбработка/Forms/ОсновнаяОФ/Ext/Form/Module.bsl"
И В каталоге "." репозитория "РабочийКаталог" есть файл "epf/DemoОбработка/DemoОбработка/Forms/ОсновнаяОФ/Ext/Form/form"
И В каталоге "." репозитория "РабочийКаталог" есть файл "cfe/DemoРасширение/ConfigDumpInfo.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "cfe/DemoРасширение/Configuration.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "cfe/DemoРасширение/CommonModules/DemoРасш_Demo.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "cfe/DemoРасширение/CommonModules/DemoРасш_Demo/Ext/Module.bsl"
И В каталоге "." репозитория "РабочийКаталог" есть файл "cfe/DemoРасширение/Subsystems/DemoРасш_Demo.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "cfe/DemoРасширение/Languages/Русский.xml"
Тогда В каталоге "." репозитория "РабочийКаталог" есть файл "DemoОтчет/DemoОтчет/Forms/ОсновнаяОФ/Ext/Form/Module.bsl"
И В каталоге "." репозитория "РабочийКаталог" есть файл "DemoОтчет/DemoОтчет/Forms/ОсновнаяОФ/Ext/Form/form"
И В каталоге "." репозитория "РабочийКаталог" есть файл "DemoОтчет/DemoОтчет.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "DemoОтчет/DemoОтчет/Templates/ОсновнаяСхемаКомпоновкиДанных.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "DemoОтчет/DemoОтчет/Templates/ОсновнаяСхемаКомпоновкиДанных/Ext/Template.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "DemoОтчет/DemoОтчет/Forms/ОсновнаяОФ.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "DemoОтчет/DemoОтчет/Forms/ОсновнаяОФ/Ext/Form.bin"
И В каталоге "." репозитория "РабочийКаталог" есть файл "DemoОтчет/DemoОтчет/Forms/ОсновнаяУФ.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "DemoОтчет/DemoОтчет/Forms/ОсновнаяУФ/Ext/Form.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "DemoОбработка/DemoОбработка.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "DemoОбработка/DemoОбработка/Forms/ОсновнаяОФ.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "DemoОбработка/DemoОбработка/Forms/ОсновнаяОФ/Ext/Form.bin"
И В каталоге "." репозитория "РабочийКаталог" есть файл "DemoОбработка/DemoОбработка/Forms/ОсновнаяУФ.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "DemoОбработка/DemoОбработка/Forms/ОсновнаяУФ/Ext/Form.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "DemoОбработка/DemoОбработка/Forms/ОсновнаяОФ/Ext/Form/Module.bsl"
И В каталоге "." репозитория "РабочийКаталог" есть файл "DemoОбработка/DemoОбработка/Forms/ОсновнаяОФ/Ext/Form/form"
И В каталоге "." репозитория "РабочийКаталог" есть файл "DemoРасширение/ConfigDumpInfo.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "DemoРасширение/Configuration.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "DemoРасширение/CommonModules/DemoРасш_Demo.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "DemoРасширение/CommonModules/DemoРасш_Demo/Ext/Module.bsl"
И В каталоге "." репозитория "РабочийКаталог" есть файл "DemoРасширение/Subsystems/DemoРасш_Demo.xml"
И В каталоге "." репозитория "РабочийКаталог" есть файл "DemoРасширение/Languages/Русский.xml"
Сценарий: Успешный коммит в репозиторий
Когда Я копирую файл "tests/fixtures/ПроверкаДублейПроцедурПоложительныйТест.bsl" в каталог репозитория "РабочийКаталог"
+1 -1
View File
@@ -17,7 +17,7 @@
.РазработкаЗависитОт("asserts")
.РазработкаЗависитОт("tempfiles", "1.1.1")
.РазработкаЗависитОт("fs")
.РазработкаЗависитОт("coverage", "0.6.1")
.РазработкаЗависитОт("coverage", "0.6.1")
.ВключитьФайл("src")
.ВключитьФайл("v8config.json")
.ВключитьФайл("LICENSE")
@@ -56,70 +56,24 @@
ИменаЗагружаемыхСценариев = Параметры.Сценарии;
ЗатребованныеСценарии = Параметры.ИменаСценариев;
ОбрабатываемыеФайлы = Параметры.ОбрабатываемыеФайлы;
КаталогиИсходныхПоФайлам = Параметры.КаталогиФайлов;
УправлениеНастройками = МенеджерНастроек.НастройкиРепозитория(АдресПоискаКонфигурационногоФайла);
НаборНастроек = СценарииОбработки.ПолучитьСценарииСПараметрамиВыполнения(КаталогРепозитория, ИменаЗагружаемыхСценариев);
КритичныеОшибки = Новый Массив;
ПараметрыОбработки = СценарииОбработки.ПолучитьСтандартныеПараметрыОбработки();
ПараметрыОбработки.Лог = Лог;
ПараметрыОбработки.НастройкиИБ = НастройкиИБ;
ПараметрыОбработки.ЗатребованныеСценарии = ЗатребованныеСценарии;
ПараметрыОбработки.КаталогРепозитория = КаталогРепозитория;
Ит = 0;
Пока Ит < ОбрабатываемыеФайлы.Количество() Цикл
АнализируемыйФайл = ОбрабатываемыеФайлы[Ит];
Если АнализируемыйФайл.ЭтоКаталог() Тогда
Ит = Ит + 1;
Продолжить;
КонецЕсли;
Лог.Информация("Анализируется файл <%1>", АнализируемыйФайл.ПолноеИмя);
ИмяФайла = ФайловыеОперации.ПолучитьНормализованныйОтносительныйПуть(КаталогРепозитория,
СтрЗаменить(АнализируемыйФайл.ПолноеИмя, КаталогРепозитория, ""));
ИмяПроекта = МенеджерНастроек.ИмяПроектаДляФайла(ИмяФайла);
НастройкаОбработки = НаборНастроек[ИмяПроекта];
Если НЕ ЗначениеЗаполнено(НастройкаОбработки) Тогда
ВызватьИсключение СтрШаблон("Не удалось получить настройки для %1", ИмяФайла);
КонецЕсли;
ПараметрыОбработки.Настройки = НастройкаОбработки.НастройкиСценариев.Получить("НастройкиСценариев");
ПараметрыОбработки.КаталогРепозитория = КаталогРепозитория;
ПараметрыОбработки.ТекущийКаталогИсходныхФайлов = КаталогиИсходныхПоФайлам.Получить(АнализируемыйФайл.ПолноеИмя);
ПараметрыОбработки.ЗатребованныеСценарии = ЗатребованныеСценарии;
Ошибки = Новый Массив;
Для Каждого СценарийОбработки Из НастройкаОбработки.СценарииОбработки Цикл
Попытка
ФайлОбработан = СценарийОбработки.ОбработатьФайл(АнализируемыйФайл,
ПараметрыОбработки.ТекущийКаталогИсходныхФайлов,
ПараметрыОбработки);
Если НЕ ФайлОбработан Тогда
Продолжить;
КонецЕсли;
Для Каждого ФайлДляДопОбработки Из ПараметрыОбработки.ФайлыДляПостОбработки Цикл
НовыйОбрабатываемыйФайл = ФайловыеОперации.НовыйФайл(ФайлДляДопОбработки);
ОбрабатываемыеФайлы.Добавить(НовыйОбрабатываемыйФайл);
КаталогиИсходныхПоФайлам.Вставить(НовыйОбрабатываемыйФайл.ПолноеИмя, ПараметрыОбработки.ТекущийКаталогИсходныхФайлов);
КонецЦикла;
ПараметрыОбработки.ФайлыДляПостОбработки.Очистить();
Исключение
Ошибка = ОписаниеОшибки();
КритичныеОшибки.Добавить(Ошибка);
Лог.Информация("Критичная ошибка: %1", Ошибка);
КонецПопытки;
КонецЦикла;
Ит = Ит + 1;
КонецЦикла;
СценарииОбработки.ВыполнитьОбработкуФайлов(ОбрабатываемыеФайлы, НаборНастроек, ПараметрыОбработки, Ошибки);
// В отличие от прекоммита, здесь лучше вывести все криты в конце одним блоком еще раз.
Если КритичныеОшибки.Количество() Тогда
Если Ошибки.Количество() Тогда
Лог.Ошибка("В результате выполнения возникли исключения:");
Для Каждого ОписаниеОшибки Из КритичныеОшибки Цикл
Для Каждого ОписаниеОшибки Из Ошибки Цикл
Лог.Ошибка(ОписаниеОшибки);
КонецЦикла;
КонецЕсли;
@@ -169,9 +123,8 @@
ПараметрыВыполнения.Вставить("КаталогКонфигурационногоФайла", КаталогКонфигурационногоФайла);
ПараметрыВыполнения.Вставить("Сценарии", Сценарии);
ПараметрыВыполнения.Вставить("ИменаСценариев", ИменаСценариев);
ПараметрыВыполнения.Вставить("ОбрабатываемыеФайлы", ОбрабатываемыеОбъекты.Файлы);
ПараметрыВыполнения.Вставить("КаталогиФайлов", ОбрабатываемыеОбъекты.Каталоги);
ПараметрыВыполнения.Вставить("ОбрабатываемыеФайлы", ОбрабатываемыеОбъекты);
Возврат ПараметрыВыполнения;
КонецФункции
@@ -182,52 +135,58 @@
Функция ОбрабатываемыеОбъекты(ПараметрыКоманды, КаталогРепозитория)
ОбрабатыватьТолькоИндексированныеФайлы = ЗначениеПараметра(ПараметрыКоманды, "-staged-only", Ложь);
КаталогиИсходныхФайлов = КаталогиИсходныхФайлов(ПараметрыКоманды);
Коммиты = МассивКоммитов(ПараметрыКоманды, КаталогРепозитория);
ПараметрКаталогиИсходныхФайлов = ЗначениеПараметра(ПараметрыКоманды, "-source-dir", "src");
КаталогиИсходныхФайлов = СтрРазделить(ПараметрКаталогиИсходныхФайлов, ",", Ложь);
Результат = Новый Структура("Файлы, Каталоги", Новый Массив(), Новый Соответствие());
ТаблицаФайлов = СценарииОбработки.НоваяТаблицаОбрабатываемыхФайлов();
Если НЕ ОбрабатыватьТолькоИндексированныеФайлы И Коммиты.Количество() = 0 Тогда
// Обрабатываются все файлы в каталогах исходных файлов
Для Каждого КаталогИсходныхФайлов Из КаталогиИсходныхФайлов Цикл
ТекущийКаталогИсходныхФайлов = ОбъединитьПути(КаталогРепозитория, СокрЛП(КаталогИсходныхФайлов));
Если НЕ ЭтоСуществующийКаталог(ТекущийКаталогИсходныхФайлов) Тогда
Продолжить;
КонецЕсли;
ОбрабатываемыеФайлыКаталога = НайтиФайлы(ТекущийКаталогИсходныхФайлов, ПолучитьМаскуВсеФайлы(), Истина);
Для Каждого ОбрабатываемыйФайлКаталога Из ОбрабатываемыеФайлыКаталога Цикл
ДобавитьОбрабатываемыйОбъект(Результат, ОбрабатываемыйФайлКаталога, ТекущийКаталогИсходныхФайлов);
КонецЦикла;
КонецЦикла;
ДобавитьВсеИсходныеФайлы(ТаблицаФайлов, КаталогРепозитория, КаталогиИсходныхФайлов);
Иначе
Если ОбрабатыватьТолькоИндексированныеФайлы Тогда
// Обрабатываются только файлы, добавленные в индекс Git
Изменения = СписокИндексированныхФайлов(КаталогРепозитория);
Иначе
// Обрабатываются только файлы, измененные между двумя переданными коммитами или merge-request'ом
Изменения = СписокИзмененийМеждуКоммитами(Коммиты, КаталогРепозитория);
КонецЕсли;
// Обрабатываются файлы, добавленные в индекс git, либо измененные между двумя коммитами или merge-request'ом
Изменения = ?(ОбрабатыватьТолькоИндексированныеФайлы,
СписокИндексированныхФайлов(КаталогРепозитория),
СписокИзмененийМеждуКоммитами(Коммиты, КаталогРепозитория));
Для Каждого ИмяФайла Из Изменения Цикл
Для Каждого КаталогИсходныхФайлов Из КаталогиИсходныхФайлов Цикл
ТекущийКаталогИсходныхФайлов = ОбъединитьПути(КаталогРепозитория, СокрЛП(КаталогИсходныхФайлов));
Если ЭтоСуществующийКаталог(ТекущийКаталогИсходныхФайлов)
И ФайловыеОперации.ФайлНаходитсяВКаталоге(ИмяФайла, ТекущийКаталогИсходныхФайлов) Тогда
ДобавитьОбрабатываемыйОбъект(Результат, ИмяФайла, ТекущийКаталогИсходныхФайлов);
Прервать;
КонецЕсли;
ДобавитьОбрабатываемыйОбъект(ТаблицаФайлов, ИмяФайла, ТекущийКаталогИсходныхФайлов);
КонецЦикла;
КонецЦикла;
КонецЕсли;
Возврат ТаблицаФайлов;
КонецФункции
Функция КаталогиИсходныхФайлов(ПараметрыКоманды)
ПараметрКаталогиИсходныхФайлов = ЗначениеПараметра(ПараметрыКоманды, "-source-dir", "src");
КаталогиИсходныхФайлов = СтрРазделить(ПараметрКаталогиИсходныхФайлов, ",", Ложь);
Результат = Новый Массив;
Для Каждого Каталог Из КаталогиИсходныхФайлов Цикл
Если ЭтоСуществующийКаталог(Каталог) Тогда
Результат.Добавить(Каталог);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Процедура ДобавитьОбрабатываемыйОбъект(Коллекция, Знач Файл, Знач Каталог)
Процедура ДобавитьОбрабатываемыйОбъект(Коллекция, Знач Файл, Знач Каталог, ТипИзменения = Неопределено)
ОбрабатываемыйФайл = ФайловыеОперации.НовыйФайл(Файл);
Коллекция.Файлы.Добавить(ОбрабатываемыйФайл);
Коллекция.Каталоги.Вставить(ОбрабатываемыйФайл.ПолноеИмя, Каталог);
Если НЕ ФайловыеОперации.ФайлНаходитсяВКаталоге(Файл, Каталог) Тогда
Возврат;
КонецЕсли;
Если ТипИзменения = Неопределено Тогда
ТипИзменения = ВариантИзмененийФайловGit.Изменен;
КонецЕсли;
НоваяСтрока = Коллекция.Добавить();
НоваяСтрока.Файл = ОбрабатываемыйФайл;
НоваяСтрока.Каталог = Каталог;
НоваяСтрока.ТипИзменения = ТипИзменения;
КонецПроцедуры
Функция ЭтоСуществующийКаталог(Каталог)
@@ -303,21 +262,37 @@
Возврат Массив;
КонецФункции
Процедура ДобавитьВсеИсходныеФайлы(ТаблицаФайлов, КаталогРепозитория, Каталоги)
Для Каждого Каталог Из Каталоги Цикл
ТекущийКаталог = ОбъединитьПути(КаталогРепозитория, СокрЛП(Каталог));
Если НЕ ЭтоСуществующийКаталог(ТекущийКаталог) Тогда
Продолжить;
КонецЕсли;
НайденныеФайлы = НайтиФайлы(ТекущийКаталог, ПолучитьМаскуВсеФайлы(), Истина);
Для Каждого Файл Из НайденныеФайлы Цикл
ДобавитьОбрабатываемыйОбъект(ТаблицаФайлов, Файл, Каталог);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Функция СписокИзмененийМеждуКоммитами(Коммиты, КаталогРепозитория)
Если НЕ ДваЭлементаВКоллекции(Коммиты) Тогда
Возврат Новый Массив;
Возврат СценарииОбработки.НоваяТаблицаОбрабатываемыхФайлов();
КонецЕсли;
ПараметрыКоманды = МассивПараметров(СтрШаблон("diff --name-only %1 %2", Коммиты[0], Коммиты[1]));
ПараметрыКоманды = МассивПараметров(СтрШаблон("diff --name-status --no-renames %1 %2", Коммиты[0], Коммиты[1]));
Возврат ИзмененияРепозитория(КаталогРепозитория, ПараметрыКоманды);
КонецФункции
Функция СписокИндексированныхФайлов(КаталогРепозитория)
ПараметрыКоманды = МассивПараметров("diff --name-only --staged");
ПараметрыКоманды = МассивПараметров("diff --name-status --staged --no-renames");
Возврат ИзмененияРепозитория(КаталогРепозитория, ПараметрыКоманды);
КонецФункции
Функция ИзмененияРепозитория(КаталогРепозитория, ПараметрыКоманды)
ТаблицаФайлов = СценарииОбработки.НоваяТаблицаОбрабатываемыхФайлов();
Git = РепозиторийGit(КаталогРепозитория);
Git.ВыполнитьКоманду(ПараметрыКоманды);
Результат = Git.ПолучитьВыводКоманды();
@@ -327,11 +302,18 @@
КонецЕсли;
ИзмененныеФайлы = СтрРазделить(СокрЛП(Результат), Символы.ПС);
Для Индекс = 0 По ИзмененныеФайлы.ВГраница() Цикл
ИзмененныеФайлы[Индекс] = ОбъединитьПути(КаталогРепозитория, СокрЛП(ИзмененныеФайлы[Индекс]));
Для Каждого СтрокаФайла Из ИзмененныеФайлы Цикл
Если ПустаяСтрока(СтрокаФайла) Тогда
Продолжить;
КонецЕсли;
ДанныеФайла = ВариантИзмененийФайловGit.РазделитьИмяФайлаИВариантИзменения(СтрокаФайла);
ПутьКФайлу = ОбъединитьПути(КаталогРепозитория, СокрЛП(ДанныеФайла.ИмяФайла));
Файл = ФайловыеОперации.НовыйФайл(ПутьКФайлу);
ДобавитьОбрабатываемыйОбъект(ТаблицаФайлов, Файл, КаталогРепозитория, ДанныеФайла.ТипИзменения);
КонецЦикла;
Возврат ИзмененныеФайлы;
Возврат ТаблицаФайлов;
КонецФункции
Функция ДваЭлементаВКоллекции(Коллекция)
@@ -38,27 +38,19 @@
КаталогРепозитория = ПараметрыКоманды["КаталогРепозитория"];
КаталогИсходныхФайлов = ПараметрыКоманды["-source-dir"];
Если НЕ ПроверитьПараметрыКоманды(КаталогРепозитория, Лог) Тогда
Возврат Приложение.РезультатыКоманд().НеверныеПараметры;
КонецЕсли;
Если Не ЗначениеЗаполнено(КаталогИсходныхФайлов) Тогда
КаталогИсходныхФайлов = "src";
КонецЕсли;
ТекущийКаталогИсходныхФайлов = ОбъединитьПути(КаталогРепозитория, КаталогИсходныхФайлов);
ФайлТекущийКаталогИсходныхФайлов = Новый Файл(ТекущийКаталогИсходныхФайлов);
ТекущийКаталогИсходныхФайлов = ФайлТекущийКаталогИсходныхФайлов.ПолноеИмя;
Если НЕ ФайлТекущийКаталогИсходныхФайлов.Существует() Тогда
СоздатьКаталог(ТекущийКаталогИсходныхФайлов);
КонецЕсли;
УправлениеНастройками = МенеджерНастроек.НастройкиРепозитория(КаталогРепозитория);
@@ -70,27 +62,25 @@
ПараметрыОбработки.КаталогРепозитория = КаталогРепозитория;
ПараметрыОбработки.ТекущийКаталогИсходныхФайлов = ТекущийКаталогИсходныхФайлов;
ПараметрыОбработки.НастройкиИБ = НастройкиИБ;
ФайлыКОбработке = Новый ТаблицаЗначений();
ФайлыКОбработке.Колонки.Добавить("Файл");
ФайлыКОбработке.Колонки.Добавить("ТипИзменения");
Если НЕ СообщениеКоммитаСоответствуетМаске(НаборНастроек, ПараметрыОбработки) Тогда
Возврат Приложение.РезультатыКоманд().ОшибкаВремениВыполнения;
КонецЕсли;
ФайлыКОбработке = СценарииОбработки.НоваяТаблицаОбрабатываемыхФайлов();
Для каждого Изменение Из ЖурналИзменений Цикл
ДобавитьКОбработке(ФайлыКОбработке, Новый Файл(ОбъединитьПути(КаталогРепозитория, Изменение.ИмяФайла)), Изменение.ТипИзменения);
НоваяСтрока = ФайлыКОбработке.Добавить();
НоваяСтрока.Файл = ФайловыеОперации.НовыйФайл(ОбъединитьПути(КаталогРепозитория, Изменение.ИмяФайла));
НоваяСтрока.Каталог = ТекущийКаталогИсходныхФайлов;
НоваяСтрока.ТипИзменения = Изменение.ТипИзменения;
КонецЦикла;
ВыполнитьОбработкуФайлов(ФайлыКОбработке, НаборНастроек, ПараметрыОбработки);
СценарииОбработки.ВыполнитьОбработкуФайлов(ФайлыКОбработке, НаборНастроек, ПараметрыОбработки);
// измененные каталоги необходимо добавить в индекс
Лог.Отладка("Добавление измененных каталогов в индекс git");
Для Каждого Каталог Из ПараметрыОбработки.ИзмененныеКаталоги Цикл
РепозиторийGit.ДобавитьФайлВИндекс("""" + Каталог + """");
КонецЦикла;
// При успешном выполнении возвращает код успеха
@@ -98,69 +88,6 @@
КонецФункции // ВыполнитьКоманду
///////////////////////////////////////////////////////////////////////////////
Процедура ДобавитьКОбработке(СпиоскФ, ДобавляемыйФ, ТипИзменения)
Строка = СпиоскФ.Добавить();
Строка.Файл = ДобавляемыйФ;
Строка.ТипИзменения = ТипИзменения;
КонецПроцедуры
Процедура ВыполнитьОбработкуФайлов(Файлы, НаборНастроек, ПараметрыОбработки)
КаталогРепозитория = ПараметрыОбработки.КаталогРепозитория;
Ит = 0;
Пока Ит < Файлы.Количество() Цикл
АнализируемыйФайл = Файлы[Ит].Файл;
Лог.Отладка("Анализируется файл <%1>", АнализируемыйФайл.Имя);
ИмяФайла = ФайловыеОперации.ПолучитьНормализованныйОтносительныйПуть(КаталогРепозитория,
СтрЗаменить(АнализируемыйФайл.ПолноеИмя, КаталогРепозитория, ""));
ИмяПроекта = МенеджерНастроек.ИмяПроектаДляФайла(ИмяФайла);
НастройкаОбработки = НаборНастроек[ИмяПроекта];
Если НЕ ЗначениеЗаполнено(НастройкаОбработки) Тогда
ВызватьИсключение СтрШаблон("Не удалось получить настройки для %1", ИмяФайла);
КонецЕсли;
СценарииОбработкиФайлов = НастройкаОбработки.СценарииОбработки;
НастройкиСценариев = НастройкаОбработки.НастройкиСценариев;
ПараметрыОбработки.Настройки = НастройкиСценариев.Получить("НастройкиСценариев");
ПараметрыОбработки.ТипИзменения = Файлы[Ит].ТипИзменения;
Для Каждого СценарийОбработки Из СценарииОбработкиФайлов Цикл
ФайлОбработан = СценарийОбработки.ОбработатьФайл(АнализируемыйФайл,
ПараметрыОбработки.ТекущийКаталогИсходныхФайлов,
ПараметрыОбработки);
Если НЕ ФайлОбработан Тогда
Продолжить;
КонецЕсли;
Для Каждого ФайлДляДопОбработки Из ПараметрыОбработки.ФайлыДляПостОбработки Цикл
ДобавитьКОбработке(Файлы, ФайловыеОперации.НовыйФайл(ФайлДляДопОбработки), ВариантИзмененийФайловGit.Изменен);
КонецЦикла;
ПараметрыОбработки.ФайлыДляПостОбработки.Очистить();
КонецЦикла;
Ит = Ит + 1;
КонецЦикла;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////
Функция ПроверитьПараметрыКоманды(КаталогРепозитория, Лог)
ФайлКаталогРепозитория = Новый Файл(КаталогРепозитория);
@@ -198,19 +125,16 @@
ЖурналИзменений = Новый Массив;
Для Каждого СтрокаВывода Из СтрокиВывода Цикл
Если ПустаяСтрока(СтрокаВывода) Тогда
Продолжить;
КонецЕсли;
Лог.Отладка(" <%1>", СтрокаВывода);
СтрокаВывода = СокрЛП(СтрокаВывода);
ПозицияПробела = СтрНайти(СтрокаВывода, Символы.Таб);
СимволИзменения = Лев(СтрокаВывода, 1);
ТипИзменения = ВариантИзмененийФайловGit.ОпределитьВариантИзменения(СимволИзменения);
ИмяФайла = СокрЛП(СтрЗаменить(Сред(СтрокаВывода, ПозицияПробела + 1), """", ""));
ЖурналИзменений.Добавить(Новый Структура("ИмяФайла, ТипИзменения", ИмяФайла, ТипИзменения));
Лог.Отладка(" В журнале git %2 файл <%1>", ИмяФайла, ТипИзменения);
Данные = ВариантИзмененийФайловGit.РазделитьИмяФайлаИВариантИзменения(СтрокаВывода);
ЖурналИзменений.Добавить(Новый Структура("ИмяФайла, ТипИзменения", Данные.ИмяФайла, Данные.ТипИзменения));
Лог.Отладка(" В журнале git %2 файл <%1>", Данные.ИмяФайла, Данные.ТипИзменения);
КонецЦикла;
Возврат ЖурналИзменений;
@@ -51,6 +51,19 @@
КонецФункции
Функция РазделитьИмяФайлаИВариантИзменения(СтрокаИзменения) Экспорт
Подстроки = СтрРазделить(СтрокаИзменения, Символы.Таб, Ложь);
Если Подстроки.Количество() > 1 Тогда
ТипИзменения = ОпределитьВариантИзменения(Подстроки[0]);
ИмяФайла = Подстроки[1];
Возврат Новый Структура("ТипИзменения, ИмяФайла", ТипИзменения, СокрЛП(ИмяФайла));
Иначе
ТекстОшибки = СтрШаблон("Строка изменений Git `%1` должна содержать тип изменения и имя файла", СтрокаИзменения);
ВызватьИсключение ТекстОшибки;
КонецЕсли;
КонецФункции
///////////////////////////////////////////////////////////////////////////////
Добавлен = "Добавлен";
@@ -1,3 +1,6 @@
#Область ПрограммныйИнтерфейс
Функция Загрузить(КаталогРепозитория, Проект, Знач ПараметрИменаЗагружаемыхСценариев = Неопределено) Экспорт
ТекущийКаталогСценариев = МенеджерПриложения.КаталогСценариев();
@@ -6,50 +9,34 @@
ФайлыЛокальныхСценариев = Новый Массив;
Лог = МенеджерПриложения.ПолучитьЛог();
Если ПараметрИменаЗагружаемыхСценариев <> Неопределено Тогда
ИменаЗагружаемыхСценариев = ПараметрИменаЗагружаемыхСценариев;
Иначе
ИменаЗагружаемыхСценариев = МенеджерНастроек.ИменаЗагружаемыхСценариев(Проект);
КонецЕсли;
Если НЕ МенеджерНастроек.ЭтоНовый() Тогда
Лог.Информация("Читаем настройки " + Проект);
ИспользоватьСценарииРепозитория = МенеджерНастроек.ЗначениеНастройки("ИспользоватьСценарииРепозитория", Проект, Ложь);
Если ИспользоватьСценарииРепозитория Тогда
ЛокальныйКаталог = МенеджерНастроек.ЗначениеНастройки("КаталогЛокальныхСценариев", Проект);
ПутьКЛокальнымСценариям = ОбъединитьПути(КаталогРепозитория, ЛокальныйКаталог);
ФайлПутьКЛокальнымСценариям = Новый Файл(ПутьКЛокальнымСценариям);
Если Не ФайлПутьКЛокальнымСценариям.Существует() ИЛИ ФайлПутьКЛокальнымСценариям.ЭтоФайл() Тогда
Лог.Ошибка("Сценарии из репозитория не загружены т.к. отсутствует каталог %1", ЛокальныйКаталог);
Иначе
ФайлыЛокальныхСценариев = НайтиФайлы(ФайлПутьКЛокальнымСценариям.ПолноеИмя, "*.os");
КонецЕсли;
КонецЕсли;
КонецЕсли;
ЗагрузитьИзКаталога(ВсеЗагруженные, ФайлыГлобальныхСценариев, ИменаЗагружаемыхСценариев);
ЗагрузитьИзКаталога(ВсеЗагруженные, ФайлыЛокальныхСценариев, , Истина);
Если ВсеЗагруженные.Количество() = 0 Тогда
ВызватьИсключение "Нет доступных сценариев обработки файлов";
КонецЕсли;
Возврат ВсеЗагруженные;
@@ -59,42 +46,30 @@
Процедура ЗагрузитьИзКаталога(ВсеЗагруженные, ФайлыСценариев,
Знач ИменаЗагружаемыхСценариев = Неопределено,
ЗагрузитьВсе = Ложь) Экспорт
Лог = МенеджерПриложения.ПолучитьЛог();
Лог = МенеджерПриложения.ПолучитьЛог();
Если ИменаЗагружаемыхСценариев = Неопределено Тогда
ИменаЗагружаемыхСценариев = Новый Массив;
КонецЕсли;
Для Каждого ФайлСценария Из ФайлыСценариев Цикл
Если СтрСравнить(ФайлСценария.ИмяБезРасширения, "ШаблонСценария") = 0 Тогда
Продолжить;
КонецЕсли;
Если НЕ ЗагрузитьВсе
И ИменаЗагружаемыхСценариев.Найти(ФайлСценария.Имя) = Неопределено
И ИменаЗагружаемыхСценариев.Найти(ФайлСценария.ИмяБезРасширения) = Неопределено Тогда
И ИменаЗагружаемыхСценариев.Найти(ФайлСценария.Имя) = Неопределено
И ИменаЗагружаемыхСценариев.Найти(ФайлСценария.ИмяБезРасширения) = Неопределено Тогда
Продолжить;
КонецЕсли;
Попытка
СценарийОбработки = ЗагрузитьСценарий(ФайлСценария.ПолноеИмя);
ВсеЗагруженные.Добавить(СценарийОбработки);
Исключение
Лог.Ошибка("Ошибка загрузки сценария %1: %2", ФайлСценария.ПолноеИмя, ОписаниеОшибки());
Продолжить;
КонецПопытки;
КонецЦикла;
КонецПроцедуры
@@ -148,44 +123,19 @@
КонецФункции
Функция НастройкаОбработкиПроекта(ИмяПроекта, КаталогРепозитория, Знач ИменаЗагружаемыхСценариев = Неопределено)
Настройка = Новый Структура("СценарииОбработки, НастройкиСценариев");
Если ИменаЗагружаемыхСценариев = Неопределено Тогда
ИменаЗагружаемыхСценариев = МенеджерНастроек.ИменаЗагружаемыхСценариев(ИмяПроекта);
КонецЕсли;
Настройка.СценарииОбработки = СценарииОбработки.Загрузить(КаталогРепозитория,
ИмяПроекта,
ИменаЗагружаемыхСценариев);
Настройка.НастройкиСценариев = МенеджерНастроек.НастройкиПроекта(ИмяПроекта);
НормализоватьНастройкиСценариев(Настройка);
Возврат Настройка;
КонецФункции
Функция ПолучитьПараметрыОбработкиФайла(ИмяФайла, НастройкиПроектов) Экспорт
ИмяОбщейНастройки = МенеджерНастроек.КлючНастройкиPrecommit();
НайденнаяНастройка = НастройкиПроектов.Получить(ИмяОбщейНастройки);
Для Каждого ЭлементНастройки Из НастройкиПроектов Цикл
Если ЭлементНастройки.Ключ = ИмяОбщейНастройки Тогда
Продолжить;
ИначеЕсли СтрНачинаетсяС(ИмяФайла, ЭлементНастройки.Ключ) Тогда
НайденнаяНастройка = ЭлементНастройки.Значение;
Иначе
// ничего
КонецЕсли;
Если СтрНачинаетсяС(ИмяФайла, ЭлементНастройки.Ключ) Тогда
НайденнаяНастройка = ЭлементНастройки.Значение;
КонецЕсли;
КонецЦикла;
Возврат НайденнаяНастройка;
@@ -193,45 +143,106 @@
КонецФункции
Функция ГлобальныеСценарии() Экспорт
Возврат МенеджерНастроек.ПолучитьИменаСценариевКаталога(МенеджерПриложения.КаталогСценариев());
КонецФункции
Функция НастройкиГлобальныхСценариев() Экспорт
Возврат НастройкиСценариев(ГлобальныеСценарии(), МенеджерПриложения.КаталогСценариев());
КонецФункции
Функция НастройкиСценариев(ИменаСценариев, Знач КаталогСценариев = Неопределено) Экспорт
Если КаталогСценариев = Неопределено Тогда
КаталогСценариев = МенеджерПриложения.КаталогСценариев();
КонецЕсли;
НастройкиСценариев = Новый Соответствие;
Рефлектор = Новый Рефлектор;
Для Каждого ИмяСценария Из ИменаСценариев Цикл
ОбъектСценария = ЗагрузитьСценарий(ОбъединитьПути(КаталогСценариев, ИмяСценария));
Если Рефлектор.МетодСуществует(ОбъектСценария, "ПолучитьСтандартныеНастройкиСценария") Тогда
СтруктураНастроек = Рефлектор.ВызватьМетод(ОбъектСценария, "ПолучитьСтандартныеНастройкиСценария");
НастройкиСценариев.Вставить(СтруктураНастроек.ИмяСценария, СтруктураНастроек.Настройка);
КонецЕсли;
КонецЦикла;
Возврат НастройкиСценариев;
КонецФункции
// Вызывает обработчики сценариев для каждого файла из переданного списка.
//
// Параметры:
// Файлы - ТаблицаЗначений - см. НоваяТаблицаОбрабатываемыхФайлов
// НаборНастроек - см. ПолучитьСценарииСПараметрамиВыполнения
// ПараметрыОбработки - см. ПолучитьСтандартныеПараметрыОбработки
// Ошибки - Массив из Строка - массив возникших ошибок
//
Процедура ВыполнитьОбработкуФайлов(Файлы, НаборНастроек, ПараметрыОбработки, Ошибки = Неопределено) Экспорт
Лог = ПараметрыОбработки.Лог;
КаталогРепозитория = ПараметрыОбработки.КаталогРепозитория;
КаталогИсходныхФайлов = ПараметрыОбработки.ТекущийКаталогИсходныхФайлов;
Если Ошибки = Неопределено Тогда
Ошибки = Новый Массив;
КонецЕсли;
Индекс = 0;
Пока Индекс < Файлы.Количество() Цикл
ТекущаяСтрока = Файлы[Индекс];
АнализируемыйФайл = ТекущаяСтрока.Файл;
Лог.Отладка("Анализируется файл <%1>", АнализируемыйФайл.Имя);
Индекс = Индекс + 1;
НастройкаОбработки = НастройкаОбработки(АнализируемыйФайл, КаталогРепозитория, НаборНастроек);
ПараметрыОбработки.Настройки = НастройкаОбработки.НастройкиСценариев.Получить("НастройкиСценариев");
ПараметрыОбработки.ТипИзменения = ТекущаяСтрока.ТипИзменения;
ПараметрыОбработки.ТекущийКаталогИсходныхФайлов = ТекущаяСтрока.Каталог;
Для Каждого СценарийОбработки Из НастройкаОбработки.СценарииОбработки Цикл
Попытка
ФайлНеОбработан = ПропуститьФайл(АнализируемыйФайл, СценарийОбработки, ПараметрыОбработки)
ИЛИ НЕ СценарийОбработки.ОбработатьФайл(АнализируемыйФайл, КаталогИсходныхФайлов, ПараметрыОбработки);
Если ФайлНеОбработан Тогда
Продолжить;
КонецЕсли;
Для Каждого ФайлДляДопОбработки Из ПараметрыОбработки.ФайлыДляПостОбработки Цикл
ДобавитьКОбработке(Файлы, ФайлДляДопОбработки, ТекущаяСтрока.Каталог, ФайлДляДопОбработки);
КонецЦикла;
ПараметрыОбработки.ФайлыДляПостОбработки.Очистить();
Исключение
Ошибка = ОписаниеОшибки();
Ошибки.Добавить(Ошибка);
Лог.Информация("Ошибка обработки файла `%1`: %2", АнализируемыйФайл.Имя, Ошибка);
КонецПопытки;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
// Создает новую таблицу обрабатываемых файлов, передаваемую в метод ВыполнитьОбработкуФайлов.
//
// Возвращаемое значение:
// ТаблицаЗначений - таблица обрабатываемых файлов:
// * Файл - Файл - обрабатываемый файл
// * Каталог - Строка - каталог исходного файла
// * ТипИзменения - ВариантИзмененийФайловGit - тип изменения файла Git
//
Функция НоваяТаблицаОбрабатываемыхФайлов() Экспорт
ТаблицаФайлов = Новый ТаблицаЗначений();
ТаблицаФайлов.Колонки.Добавить("Файл");
ТаблицаФайлов.Колонки.Добавить("Каталог");
ТаблицаФайлов.Колонки.Добавить("ТипИзменения");
Возврат ТаблицаФайлов;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура НормализоватьНастройкиСценариев(Настройка)
УзелНастройкиСценариев = Настройка.НастройкиСценариев.Получить("НастройкиСценариев");
@@ -248,6 +259,7 @@
Если Рефлектор.МетодСуществует(СценарийОбработки, ИмяМетодаИмяСценария) Тогда
ИмяСценария = Рефлектор.ВызватьМетод(СценарийОбработки, ИмяМетодаИмяСценария);
КонецЕсли;
Если Не ЗначениеЗаполнено(ИмяСценария) Тогда
Продолжить;
КонецЕсли;
@@ -258,3 +270,96 @@
КонецЦикла;
КонецПроцедуры
Функция НастройкаОбработкиПроекта(ИмяПроекта, КаталогРепозитория, Знач ИменаЗагружаемыхСценариев = Неопределено)
Настройка = Новый Структура("СценарииОбработки, НастройкиСценариев");
Если ИменаЗагружаемыхСценариев = Неопределено Тогда
ИменаЗагружаемыхСценариев = МенеджерНастроек.ИменаЗагружаемыхСценариев(ИмяПроекта);
КонецЕсли;
Настройка.СценарииОбработки = СценарииОбработки.Загрузить(КаталогРепозитория, ИмяПроекта, ИменаЗагружаемыхСценариев);
Настройка.НастройкиСценариев = МенеджерНастроек.НастройкиПроекта(ИмяПроекта);
НормализоватьНастройкиСценариев(Настройка);
Возврат Настройка;
КонецФункции
Функция НастройкаОбработки(АнализируемыйФайл, КаталогРепозитория, НаборНастроек)
ИмяФайла = ФайловыеОперации.ПолучитьНормализованныйОтносительныйПуть(КаталогРепозитория,
СтрЗаменить(АнализируемыйФайл.ПолноеИмя, КаталогРепозитория, ""));
ИмяПроекта = МенеджерНастроек.ИмяПроектаДляФайла(ИмяФайла);
НастройкаОбработки = НаборНастроек[ИмяПроекта];
Если НЕ ЗначениеЗаполнено(НастройкаОбработки) Тогда
ВызватьИсключение СтрШаблон("Не удалось получить настройки для %1", ИмяФайла);
КонецЕсли;
Возврат НастройкаОбработки;
КонецФункции
Процедура ДобавитьКОбработке(Файлы, ДобавляемыйФайл, Каталог, ТипИзменения = Неопределено)
Если ТипИзменения = Неопределено Тогда
ТипИзменения = ВариантИзмененийФайловGit.Изменен;
КонецЕсли;
Строка = Файлы.Добавить();
Строка.Файл = ФайловыеОперации.НовыйФайл(ДобавляемыйФайл);
Строка.Каталог = Каталог;
Строка.ТипИзменения = ТипИзменения;
КонецПроцедуры
Функция ПропуститьФайл(Файл, Сценарий, ДополнительныеПараметры)
Лог = ДополнительныеПараметры.Лог;
Настройки = ДополнительныеПараметры.Настройки;
ИмяСценария = ИмяСценария(Сценарий);
МаскиОбрабатываемыхФайлов = МенеджерНастроек.ЗначениеПоКлючу(Настройки, СтрШаблон("%1.ВключатьФайлы", ИмяСценария));
МаскиИсключаемыхФайлов = МенеджерНастроек.ЗначениеПоКлючу(Настройки, СтрШаблон("%1.ИсключатьФайлы", ИмяСценария));
Если НЕ Файл.Существует() Тогда
Возврат Истина;
КонецЕсли;
ИмяФайла = ФайловыеОперации.НормализоватьРазделители(Файл.ПолноеИмя);
Если ЗначениеЗаполнено(МаскиИсключаемыхФайлов) Тогда
Для Каждого Шаблон Из МаскиИсключаемыхФайлов Цикл
Выражение = РегулярныеВыражения.Создать(Шаблон);
Если Выражение.Совпадает(ИмяФайла) Тогда
Лог.Отладка("Обрабатываемый файл `%1` соответствует маске файла, исключаемого из обработки: %2", Имяфайла, Шаблон);
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ЗначениеЗаполнено(МаскиОбрабатываемыхФайлов) Тогда
Для Каждого Шаблон Из МаскиОбрабатываемыхФайлов Цикл
Выражение = РегулярныеВыражения.Создать(Шаблон);
Если Выражение.Совпадает(ИмяФайла) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Лог.Отладка("Обрабатываемый файл `%1` не соответствует ни одной маске обрабатываемых файлов", Имяфайла);
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
Функция ИмяСценария(Сценарий, ЗначениеПоУмолчанию = Неопределено)
Рефлектор = Новый Рефлектор;
ИмяМетода = "ИмяСценария";
ИмяСценария = ЗначениеПоУмолчанию;
Если Рефлектор.МетодСуществует(Сценарий, ИмяМетода) Тогда
ИмяСценария = Рефлектор.ВызватьМетод(Сценарий, ИмяМетода);
КонецЕсли;
Возврат ИмяСценария;
КонецФункции
#КонецОбласти
@@ -280,3 +280,17 @@
Файл = НовыйФайл(Файл);
Возврат СтрНайти(Файл.ПолноеИмя, Каталог) > 0;
КонецФункции
Процедура СкопироватьКаталог(Источник, Приемник) Экспорт
Файлы = НайтиФайлы(Источник, "*");
Для Каждого Файл Из Файлы Цикл
НовыйОбъект = ОбъединитьПути(Приемник, Файл.Имя);
Если Файл.ЭтоКаталог() Тогда
СоздатьКаталог(НовыйОбъект);
СкопироватьКаталог(Файл.ПолноеИмя, НовыйОбъект);
Иначе
КопироватьФайл(Файл.ПолноеИмя, НовыйОбъект);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
@@ -0,0 +1,17 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2014-2025 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
@@ -0,0 +1,41 @@
{
"Precommt4onecСценарии": {
"ИспользоватьСценарииРепозитория": false,
"ПроверкаСообщенияКоммита": {
"Использовать": false,
"Выражение": "",
"СообщениеОбОшибке": ""
},
"КаталогЛокальныхСценариев": "",
"ГлобальныеСценарии": [
"ВставкаКопирайтов.os"
],
"ОтключенныеСценарии": [],
"ВключатьФайлы": [
".*[/\\\\].+\\.bsl"
],
"ИсключатьФайлы": [],
"НастройкиСценариев": {
"ВставкаКопирайтов": {
"ИгнорироватьМодулиОбъектовПоставки": true,
"ПутьКФайлуКопирайта": "COPYRIGHT",
"ИсключаемыеТэги": [
"// IMPORT"
],
"ВключатьФайлы": [
".*[/\\\\].+\\.bsl"
]
},
"ОтключениеПолнотекстовогоПоиска": {
"МетаданныеДляИсключения": {}
},
"ПроверкаНецензурныхСлов": {
"ФайлСНецензурнымиСловами": "НецензурныеСлова.txt"
},
"РазборОтчетовОбработокРасширений": {
"ИспользоватьНастройкиПоУмолчанию": true,
"ВерсияПлатформы": ""
}
}
}
}
@@ -0,0 +1,8 @@
Процедура ИмяПроцедуры()
Сообщить("Тестовая процедура");
КонецПроцедуры
Функция ИмяФункции()
Возврат "Тестовая функция";
КонецФункции
@@ -0,0 +1,16 @@
{
"Precommt4onecСценарии": {
"ИспользоватьСценарииРепозитория": false,
"ПроверкаСообщенияКоммита": {
"Использовать": false,
"Выражение": "",
"СообщениеОбОшибке": ""
},
"КаталогЛокальныхСценариев": "",
"ГлобальныеСценарии": [
"РазборОбычныхФормНаИсходники.os"
],
"ОтключенныеСценарии": [],
"НастройкиСценариев": {}
}
}
@@ -0,0 +1,16 @@
{
"Precommt4onecСценарии": {
"ИспользоватьСценарииРепозитория": false,
"ПроверкаСообщенияКоммита": {
"Использовать": false,
"Выражение": "",
"СообщениеОбОшибке": ""
},
"КаталогЛокальныхСценариев": "",
"ГлобальныеСценарии": [
"РазборОтчетовОбработокРасширений.os"
],
"ОтключенныеСценарии": [],
"НастройкиСценариев": {}
}
}
@@ -0,0 +1,260 @@
#Использовать asserts
#Использовать logos
#Использовать tempfiles
#Использовать gitrunner
#Использовать "../src"
#Область ОписаниеПеременных
Перем юТест;
Перем Лог;
Перем МенеджерВременныхФайлов;
Перем РепозиторийGit;
#КонецОбласти
#Область ПрограммныйИнтерфейс
// Возвращает список тестов сценария
//
// Параметры:
// ЮнитТестирование - Модуль - модуль юнит-тестов
//
// Возвращаемое значение:
// Массив из Строка - массив имен методов
Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
юТест = ЮнитТестирование;
ВсеТесты = Новый Массив;
ВсеТесты.Добавить("ТестДолжен_ПодготовитьДанныеИВыполнитьСценарийВставкиКопирайта");
ВсеТесты.Добавить("ТестДолжен_ПодготовитьДанныеИВыполнитьСценарийРазбораОбычныхФорм");
ВсеТесты.Добавить("ТестДолжен_ПодготовитьДанныеИВыполнитьСценарийРазбораОтчетовОбработокРасширений");
Возврат ВсеТесты;
КонецФункции
// Выполняет инициализацию переменных модуля перед запуском теста
Процедура ПередЗапускомТеста() Экспорт
ВремТестер = Новый Тестер;
Лог = Логирование.ПолучитьЛог(ВремТестер.ИмяЛога());
ВключитьПоказОтладки();
МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов;
КонецПроцедуры
// Выполняет очистку данных после запуска теста
Процедура ПослеЗапускаТеста() Экспорт
ВыключитьПоказОтладки();
МенеджерВременныхФайлов.Удалить();
МенеджерВременныхФайлов = Неопределено;
КонецПроцедуры
Процедура ТестДолжен_ПодготовитьДанныеИВыполнитьСценарийВставкиКопирайта() Экспорт
КаталогФикстур = КаталогТестовыхФикстур();
Фикстура = ОбъединитьПути(КаталогФикстур, "ВыполнениеСценариев", "ВставкаКопирайта");
ВременныйКаталог = ПодготовитьВременныйКаталог(Фикстура);
ТаблицаФайлов = ТаблицаИзмененныхФайлов(ВременныйКаталог);
НаборНастроек = НастройкиОбработки(ВременныйКаталог);
ПараметрыОбработки = ПараметрыОбработки(ВременныйКаталог);
Попытка
СценарииОбработки.ВыполнитьОбработкуФайлов(ТаблицаФайлов, НаборНастроек, ПараметрыОбработки);
Исключение
ВызватьИсключение "Ошибка обработки файлов";
КонецПопытки;
ОчиститьКаталог(ВременныйКаталог);
КонецПроцедуры
Процедура ТестДолжен_ПодготовитьДанныеИВыполнитьСценарийРазбораОбычныхФорм() Экспорт
КаталогФикстур = КаталогТестовыхФикстур();
Фикстура = ОбъединитьПути(КаталогФикстур, "ВыполнениеСценариев", "РазборОбычныхФормНаИсходники");
ВременныйКаталог = ПодготовитьВременныйКаталог(Фикстура);
ТаблицаФайлов = ТаблицаИзмененныхФайлов(ВременныйКаталог);
НаборНастроек = НастройкиОбработки(ВременныйКаталог);
ПараметрыОбработки = ПараметрыОбработки(ВременныйКаталог);
Попытка
СценарииОбработки.ВыполнитьОбработкуФайлов(ТаблицаФайлов, НаборНастроек, ПараметрыОбработки);
Исключение
ВызватьИсключение "Ошибка обработки файлов";
КонецПопытки;
ОчиститьКаталог(ВременныйКаталог);
КонецПроцедуры
Процедура ТестДолжен_ПодготовитьДанныеИВыполнитьСценарийРазбораОтчетовОбработокРасширений() Экспорт
КаталогФикстур = КаталогТестовыхФикстур();
Фикстура = ОбъединитьПути(КаталогФикстур, "ВыполнениеСценариев", "РазборОтчетовОбработокРасширений");
ВременныйКаталог = ПодготовитьВременныйКаталог(Фикстура);
ТаблицаФайлов = ТаблицаИзмененныхФайлов(ВременныйКаталог);
НаборНастроек = НастройкиОбработки(ВременныйКаталог);
ПараметрыОбработки = ПараметрыОбработки(ВременныйКаталог);
Попытка
СценарииОбработки.ВыполнитьОбработкуФайлов(ТаблицаФайлов, НаборНастроек, ПараметрыОбработки);
Исключение
ВызватьИсключение "Ошибка обработки файлов";
КонецПопытки;
ОчиститьКаталог(ВременныйКаталог);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ВключитьПоказОтладки()
Лог.УстановитьУровень(УровниЛога.Отладка);
КонецПроцедуры
Процедура ВыключитьПоказОтладки()
Лог.УстановитьУровень(УровниЛога.Информация);
КонецПроцедуры
Процедура ОчиститьКаталог(Каталог)
НайденныеФайлы = НайтиФайлы(Каталог, "*", Истина);
Каталоги = Новый Массив;
Файлы = Новый Массив;
Для Каждого Файл Из НайденныеФайлы Цикл
Если Файл.ЭтоКаталог() Тогда
Каталоги.Добавить(Файл.ПолноеИмя);
Иначе
Файлы.Добавить(Файл.ПолноеИмя);
КонецЕсли;
КонецЦикла;
Для Каждого Файл Из Файлы Цикл
УдалитьФайл(Файл, "Ошибка удаления файла");
КонецЦикла;
Для Каждого Файл Из Каталоги Цикл
УдалитьФайл(Файл, "Ошибка удаления каталога");
КонецЦикла;
УдалитьФайл(Каталог, "Ошибка удаления корневого каталога");
КонецПроцедуры
Процедура УдалитьФайл(Знач ИмяФайла, Знач СообщениеОбОшибке)
Файл = ФайловыеОперации.НовыйФайл(ИмяФайла);
Если НЕ Файл.Существует() Тогда
Возврат;
КонецЕсли;
Если НЕ МенеджерВременныхФайлов.БезопасноУдалитьФайл(Файл.ПолноеИмя) Тогда
ТекстОшибки = ОписаниеОшибки();
Лог.Отладка("%1 `%2`: %3", СообщениеОбОшибке, Файл.ПолноеИмя, ТекстОшибки);
КонецЕсли;
КонецПроцедуры
Функция КаталогТестовыхФикстур()
Возврат ОбъединитьПути(КаталогИсходников(), "tests", "fixtures");
КонецФункции
Функция КаталогИсходников()
Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "..");
КонецФункции
Функция ПолучитьДополнительныеНастройки(Знач КаталогРепозитория = Неопределено, Знач ТекущийКаталогИсходныхФайлов = Неопределено)
Если КаталогРепозитория = Неопределено Тогда
КаталогРепозитория = ТекущийКаталог();
КонецЕсли;
УправлениеНастройками = МенеджерНастроек.НастройкиРепозитория(КаталогРепозитория, Ложь);
Настройка = МенеджерНастроек.НастройкиПроекта().Получить("НастройкиСценариев");
ДополнительныеНастройки = СценарииОбработки.ПолучитьСтандартныеПараметрыОбработки();
ДополнительныеНастройки.Лог = Лог;
ДополнительныеНастройки.КаталогРепозитория = КаталогРепозитория;
ДополнительныеНастройки.ТекущийКаталогИсходныхФайлов = ТекущийКаталогИсходныхФайлов;
ДополнительныеНастройки.Настройки = Настройка;
Возврат ДополнительныеНастройки;
КонецФункции
Функция НастройкиОбработки(КаталогРепозитория)
УправлениеНастройками = МенеджерНастроек.НастройкиРепозитория(КаталогРепозитория);
Возврат СценарииОбработки.ПолучитьСценарииСПараметрамиВыполнения(КаталогРепозитория);
КонецФункции
Функция ПараметрыОбработки(КаталогРепозитория)
ПараметрыОбработки = СценарииОбработки.ПолучитьСтандартныеПараметрыОбработки();
ПараметрыОбработки.Лог = Лог;
ПараметрыОбработки.КаталогРепозитория = КаталогРепозитория;
ПараметрыОбработки.ТекущийКаталогИсходныхФайлов = КаталогРепозитория;
ПараметрыОбработки.НастройкиИБ = МенеджерПриложения.ПолучитьНастройкиИБ();
Возврат ПараметрыОбработки;
КонецФункции
Функция ПолучитьСценарий(ИмяСценария)
Сценарий = ОбъединитьПути(КаталогИсходников(), "src", "СценарииОбработки", ИмяСценария);
РасширениеФайла = ".os";
Если Не СтрЗаканчиваетсяНа(Сценарий, РасширениеФайла) Тогда
Сценарий = Сценарий + РасширениеФайла;
КонецЕсли;
ОбъектСценария = ЗагрузитьСценарий(Сценарий);
Возврат ОбъектСценария;
КонецФункции
Функция РепозиторийGit(КаталогРепозитория = "")
Если РепозиторийGit = Неопределено Тогда
РепозиторийGit = Новый ГитРепозиторий;
КонецЕсли;
Если НЕ ПустаяСтрока(КаталогРепозитория) И РепозиторийGit.ПолучитьРабочийКаталог() <> КаталогРепозитория Тогда
РепозиторийGit.УстановитьРабочийКаталог(КаталогРепозитория);
КонецЕсли;
Возврат РепозиторийGit;
КонецФункции
Функция ПодготовитьВременныйКаталог(Фикстура)
ВременныйКаталог = МенеджерВременныхФайлов.СоздатьКаталог("test");
СоздатьКаталог(ВременныйКаталог);
Репозиторий = РепозиторийGit(ВременныйКаталог);
Репозиторий.Инициализировать();
ФайловыеОперации.СкопироватьКаталог(Фикстура, ВременныйКаталог);
Репозиторий.ДобавитьФайлВИндекс(".");
Возврат ВременныйКаталог;
КонецФункции
Функция ТаблицаИзмененныхФайлов(КаталогРепозитория)
ПараметрыКоманды = Новый Массив;
ПараметрыКоманды.Добавить("diff --cached --name-status --no-renames");
РепозиторийGit = РепозиторийGit(КаталогРепозитория);
РепозиторийGit.ВыполнитьКоманду(ПараметрыКоманды);
РезультатВывода = РепозиторийGit.ПолучитьВыводКоманды();
СтрокиВывода = СтрРазделить(РезультатВывода, Символы.ПС);
ТаблицаФайлов = СценарииОбработки.НоваяТаблицаОбрабатываемыхФайлов();
Для Каждого СтрокаВывода Из СтрокиВывода Цикл
Если ПустаяСтрока(СтрокаВывода) Тогда
Продолжить;
КонецЕсли;
Данные = ВариантИзмененийФайловGit.РазделитьИмяФайлаИВариантИзменения(СтрокаВывода);
ИмяФайла = ОбъединитьПути(КаталогРепозитория, СокрЛП(Данные.ИмяФайла));
НоваяСтрока = ТаблицаФайлов.Добавить();
НоваяСтрока.Файл = ФайловыеОперации.НовыйФайл(ИмяФайла);
НоваяСтрока.Каталог = КаталогРепозитория;
НоваяСтрока.ТипИзменения = Данные.ТипИзменения;
КонецЦикла;
Возврат ТаблицаФайлов;
КонецФункции
#КонецОбласти
+2
View File
@@ -30,6 +30,8 @@
"УдалениеЛишнихПустыхСтрок.os"
],
"ОтключенныеСценарии": [],
"ВключатьФайлы": [],
"ИсключатьФайлы": [],
"НастройкиСценариев": {
"ВставкаКопирайтов": {
"ИгнорироватьМодулиОбъектовПоставки": true,