1
0
mirror of https://github.com/bia-technologies/precommit4onec.git synced 2024-12-28 21:09:06 +02:00

Merge branch 'feature/ORAIS-1429' into 'develop'

ORAIS-1429: Запуск прекоммита для списка файлов.

Closes ORAIS-1429

See merge request orais/precommit1C-fork-bia!73
This commit is contained in:
Максимов Валерий Валерьевич (000044217) 2024-11-26 06:47:30 +03:00
commit 9ce9c387b3
32 changed files with 375 additions and 183 deletions

View File

@ -1,6 +1,6 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2014-2023 BIA-Technologies Limited Liability Company
// Copyright 2014-2024 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.

View File

@ -109,6 +109,10 @@ precommit4onec может читать настройки своей работ
}
```
## Принудительное выполнение для группы файлов
Команда `exec-rules` предназначена для запуска выбранных сценариев в указанном репозитории. [См. подробнее](/docs/КомандаВыполнитьСценарии.md)
## Расширение функциональности
Для создания нового сценария обработки файлов необходимо воспользоваться шаблоном, находящимся в каталоге `СценарииОбработки` скрипта.

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

View File

@ -0,0 +1,48 @@
# Команда `exec-rules`
Команда предназначена для принудительного выполнения указанных сценариев в выбранном репозитории.
### Параметры команды
```
exec-rules -source-dir <Каталоги исходных файлов> -rules <Применяемые сценарии> -cfg-file <Файл настроек> <КаталогРепозитория> <Коммит1> <Коммит2>
```
Описание параметров:
- КаталогРепозитория - обязательный параметр, должен содержать абсолютный или относительный путь к каталогу репозитория, для файлов которого будут выполняться сценарии прекоммита;
- Коммит1, Коммит2 - необязательные параметры, если указаны, сценарии будут выполнены не для всех исходных файлов, а только для тех, которые были изменены между двумя коммитами. В качестве значения следует передавать хэш коммита. Если указано два хэша, будут составлен список измененных файлов между ними, если один, то он должен иметь двух родителей (как в случае коммита при merge-реквесте), иначе будет вызвано исключение;
- Каталоги исходных файлов - необязательный параметр, поддерживает перечисление через запятую относительных путей к каталогам внутри каталога репозитория, в которых расположены исходные файлы, для которых будут выполнять сценарии прекоммита. Значение по-умолчанию - "src";
- Применяемые сценарии - необязательный параметр, содержащий список сценариев, перечисленных через запятую, выполняемый для обрабатываемых файлов. Если не указан, выполняются все сценарии прекоммита;
- Файл настроек - необязательный параметр, путь к файлу настроек прекоммита. Если не указан, используется файл `v8config.json` репозитория или глобальные настройки, если файл в репозитории отсутствует.
### Примеры
1. Команда:
```shell
precommit4onec exec-rules "C:\МойРепозиторий" -source-dir "ПапкаИсходныхФайловSrc" -rules "ВставкаКопирайтов,ПроверкаНецензурныхСлов"
```
Для всех файлов в каталоге `C:\МойРепозиторий\ПапкаИсходныхФайловSrc` будут выполнены сценарии: `ВставкаКопирайтов`, `ПроверкаНецензурныхСлов`.
2. Команда:
```shell
precommit4onec exec-rules "C:\МойРепозиторий" 454474a414494f4b77c484939173e1d44678c96a 937f5cf1ebdda2eaadb1aa169cf066583f2763db
```
Для файлов в каталоге `C:\МойРепозиторий\src`, измененных между указанными коммитами, будут выполнены все сценарии прекоммита. Если файлы находятся вне каталога `src`, они будут проигнорированы.
### Вызов команды в Git Extensions
Возможности [Git Extension](https://gitextensions.github.io/) позволяют подключать пользовательские скрипты для работы с данными. Например, следующая настройка в разделе `Git Extensions\Scripts`:
![Settings](img/GitExtensions_Settings.png)
позволяет добавить на командную панель кнопку запуска прекоммита для выбранных в дереве коммитов:
![Button](img/GitExtensions_Interface.png)
В настройках указывается:
- Command - путь к скрипту запуска прекоммита;
- Arguments - параметры запуска по шаблону, описанному выше. Вместо `{sHashes}` Git Extensions подставит разделенные пробелом хэши выделенных в дереве коммитов.

View File

@ -6,9 +6,9 @@ Cнимает флаг `РазрешеноИзменятьФорму` в опи
При выполнении команды `exec-rules` не выполняется по умолчанию. Для выполнения этого сценария необходимо явно указать его при запуске команды в параметре `rules`
```bash
precommit4onec exec-rules C:\МойЛучшийРепозиторий -source-dir МойЛучшийИсходныйКод\НоваяПапка4 -rules ОтключениеРазрешенияИзменятьФорму
precommit4onec exec-rules C:\МойЛучшийРепозиторий -source-dir МойЛучшийИсходныйКод\ПапкаИсходныхФайловSrc -rules ОтключениеРазрешенияИзменятьФорму
```
```bash
precommit4onec exec-rules C:\МойЛучшийРепозиторий -source-dir МойЛучшийИсходныйКод\НоваяПапка4 -rules "ОтключениеРазрешенияИзменятьФорму,ПроверкаНецензурныхСлов"
precommit4onec exec-rules C:\МойЛучшийРепозиторий -source-dir МойЛучшийИсходныйКод\ПапкаИсходныхФайловSrc -rules "ОтключениеРазрешенияИзменятьФорму,ПроверкаНецензурныхСлов"
```

View File

@ -18,6 +18,12 @@
// Добавление параметров команды
Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "КаталогРепозитория",
"Каталог анализируемого репозитория");
Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "Коммит1",
"Идентификатор коммита. Если указан, анализируются только файлы, измененные коммитом.
| Если это merge-request, то изменения между двумя родительскими коммитами.");
Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "Коммит2",
"Идентификатор коммита. Если указан, то анализируются только файлы, которые отличаются
| между двумя указанными коммитами.");
Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-source-dir",
"Каталог расположения исходных файлов относительно корня репозитория.
| Если сценариев несколько, указываются в кавычках через , . По умолчанию <src>");
@ -36,65 +42,19 @@
//
Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач Приложение) Экспорт
Лог = Приложение.ПолучитьЛог();
НастройкиИБ = Приложение.ПолучитьНастройкиИБ();
КаталогРепозитория = ПараметрыКоманды["КаталогРепозитория"];
ФайлКаталогРепозитория = Новый Файл(КаталогРепозитория);
КаталогРепозитория = ФайлКаталогРепозитория.ПолноеИмя;
Если НЕ ФайлКаталогРепозитория.Существует() ИЛИ ФайлКаталогРепозитория.ЭтоФайл() Тогда
Лог.Ошибка("Каталог репозитория '%1' не существует или это файл", КаталогРепозитория);
Параметры = ПараметрыВыполнения(ПараметрыКоманды, Приложение);
Если Параметры = Неопределено Тогда
Возврат Приложение.РезультатыКоманд().НеверныеПараметры;
КонецЕсли;
АдресПоискаКонфигурационногоФайла = ПараметрыКоманды["-cfg-file"];
Если Не ЗначениеЗаполнено(АдресПоискаКонфигурационногоФайла) Тогда
АдресПоискаКонфигурационногоФайла = КаталогРепозитория;
КонецЕсли;
ПараметрКаталогиИсходныхФайлов = ПараметрыКоманды["-source-dir"];
Если Не ЗначениеЗаполнено(ПараметрКаталогиИсходныхФайлов) Тогда
ПараметрКаталогиИсходныхФайлов = "src";
КонецЕсли;
КаталогиИсходныхФайлов = СтрРазделить(ПараметрКаталогиИсходныхФайлов, ",", Ложь);
ОбрабатываемыеФайлы = Новый Массив();
КаталогиИсходныхПоФайлам = Новый Соответствие();
Для Каждого КаталогИсходныхФайлов Из КаталогиИсходныхФайлов Цикл
ТекущийКаталогИсходныхФайлов = ОбъединитьПути(КаталогРепозитория, СокрЛП(КаталогИсходныхФайлов));
ФайлТекущийКаталогИсходныхФайлов = Новый Файл(ТекущийКаталогИсходныхФайлов);
ТекущийКаталогИсходныхФайлов = ФайлТекущийКаталогИсходныхФайлов.ПолноеИмя;
Если Не ФайлТекущийКаталогИсходныхФайлов.Существует() Тогда
Лог.Ошибка("Каталога <%1> не существует", ТекущийКаталогИсходныхФайлов);
КонецЕсли;
ОбрабатываемыеФайлыКаталога = НайтиФайлы(ТекущийКаталогИсходныхФайлов, ПолучитьМаскуВсеФайлы(), Истина);
Для Каждого ОбрабатываемыйФайлКаталога Из ОбрабатываемыеФайлыКаталога Цикл
ОбрабатываемыеФайлы.Добавить(ОбрабатываемыйФайлКаталога);
КаталогиИсходныхПоФайлам.Вставить(ОбрабатываемыйФайлКаталога.ПолноеИмя, ТекущийКаталогИсходныхФайлов);
КонецЦикла;
КонецЦикла;
ИменаЗагружаемыхСценариев = Неопределено;
ПараметрИменаЗагружаемыхСценариев = ПараметрыКоманды["-rules"];
ЗатребованныеСценарии = Новый Массив;
Если ЗначениеЗаполнено(ПараметрИменаЗагружаемыхСценариев) Тогда
ПараметрИменаЗагружаемыхСценариев = СтрЗаменить(ПараметрИменаЗагружаемыхСценариев, " ", "");
ИменаЗагружаемыхСценариев = СтрРазделить(ПараметрИменаЗагружаемыхСценариев, ",", Ложь);
// Остаются только имена, чтобы сравнивать в сценариях по имени
ЗатребованныеСценарии = СтрРазделить(СтрЗаменить(ПараметрИменаЗагружаемыхСценариев, ".os", ""), ",", Ложь);
КонецЕсли;
Лог = Параметры.Лог;
НастройкиИБ = Параметры.НастройкиИБ;
КаталогРепозитория = Параметры.КаталогРепозитория;
АдресПоискаКонфигурационногоФайла = Параметры.КаталогКонфигурационногоФайла;
ИменаЗагружаемыхСценариев = Параметры.Сценарии;
ЗатребованныеСценарии = Параметры.ИменаСценариев;
ОбрабатываемыеФайлы = Параметры.ОбрабатываемыеФайлы;
КаталогиИсходныхПоФайлам = Параметры.КаталогиФайлов;
УправлениеНастройками = МенеджерНастроек.НастройкиРепозитория(АдресПоискаКонфигурационногоФайла);
НаборНастроек = СценарииОбработки.ПолучитьСценарииСПараметрамиВыполнения(КаталогРепозитория, ИменаЗагружаемыхСценариев);
@ -106,9 +66,7 @@
Ит = 0;
Пока Ит < ОбрабатываемыеФайлы.Количество() Цикл
АнализируемыйФайл = ОбрабатываемыеФайлы[Ит];
Если АнализируемыйФайл.ЭтоКаталог() Тогда
Ит = Ит + 1;
Продолжить;
@ -118,15 +76,10 @@
ИмяФайла = ФайловыеОперации.ПолучитьНормализованныйОтносительныйПуть(КаталогРепозитория,
СтрЗаменить(АнализируемыйФайл.ПолноеИмя, КаталогРепозитория, ""));
ИмяПроекта = МенеджерНастроек.ИмяПроектаДляФайла(ИмяФайла);
НастройкаОбработки = НаборНастроек[ИмяПроекта];
Если НЕ ЗначениеЗаполнено(НастройкаОбработки) Тогда
ВызватьИсключение СтрШаблон("Не удалось получить настройки для %1", ИмяФайла);
КонецЕсли;
ПараметрыОбработки.Настройки = НастройкаОбработки.НастройкиСценариев.Получить("НастройкиСценариев");
@ -135,7 +88,6 @@
ПараметрыОбработки.ЗатребованныеСценарии = ЗатребованныеСценарии;
Для Каждого СценарийОбработки Из НастройкаОбработки.СценарииОбработки Цикл
Попытка
ФайлОбработан = СценарийОбработки.ОбработатьФайл(АнализируемыйФайл,
ПараметрыОбработки.ТекущийКаталогИсходныхФайлов,
@ -146,43 +98,225 @@
КонецЕсли;
Для Каждого ФайлДляДопОбработки Из ПараметрыОбработки.ФайлыДляПостОбработки Цикл
НовыйОбрабатываемыйФайл = ФайловыеОперации.НовыйФайл(ФайлДляДопОбработки);
ОбрабатываемыеФайлы.Добавить(НовыйОбрабатываемыйФайл);
КаталогиИсходныхПоФайлам.Вставить(НовыйОбрабатываемыйФайл.ПолноеИмя, ПараметрыОбработки.ТекущийКаталогИсходныхФайлов);
КонецЦикла;
ПараметрыОбработки.ФайлыДляПостОбработки.Очистить();
Исключение
Ошибка = ОписаниеОшибки();
КритичныеОшибки.Добавить(Ошибка);
Лог.Информация("Критичная ошибка: %1", Ошибка);
КонецПопытки;
КонецЦикла;
Ит = Ит + 1;
КонецЦикла;
// В отличие от прекоммита, здесь лучше вывести все криты в конце одним блоком еще раз.
Если КритичныеОшибки.Количество() Тогда
Лог.Ошибка("В результате выполнения возникли исключения:");
Для Каждого ОписаниеОшибки Из КритичныеОшибки Цикл
Лог.Ошибка(ОписаниеОшибки);
КонецЦикла;
КонецЕсли;
// При успешном выполнении возвращает код успеха
Возврат Приложение.РезультатыКоманд().Успех;
КонецФункции // ВыполнитьКоманду
Функция РепозиторийGit(КаталогРепозитория = "")
Если РепозиторийGit = Неопределено Тогда
РепозиторийGit = Новый ГитРепозиторий;
КонецЕсли;
Если НЕ ПустаяСтрока(КаталогРепозитория) И РепозиторийGit.ПолучитьРабочийКаталог() <> КаталогРепозитория Тогда
РепозиторийGit.УстановитьРабочийКаталог(КаталогРепозитория);
КонецЕсли;
Возврат РепозиторийGit;
КонецФункции
Функция ПараметрыВыполнения(ПараметрыКоманды, Приложение)
Лог = Приложение.ПолучитьЛог();
НастройкиИБ = Приложение.ПолучитьНастройкиИБ();
КаталогРепозитория = ЗначениеПараметра(ПараметрыКоманды, "КаталогРепозитория", "");
Если НЕ ЭтоСуществующийКаталог(КаталогРепозитория) Тогда
Возврат Неопределено;
КонецЕсли;
Коммиты = МассивКоммитов(ПараметрыКоманды, КаталогРепозитория);
КаталогКонфигурационногоФайла = ЗначениеПараметра(ПараметрыКоманды, "-cfg-file", КаталогРепозитория);
ПараметрКаталогиИсходныхФайлов = ЗначениеПараметра(ПараметрыКоманды, "-source-dir", "src");
КаталогиИсходныхФайлов = СтрРазделить(ПараметрКаталогиИсходныхФайлов, ",", Ложь);
ОбрабатываемыеОбъекты = ОбрабатываемыеОбъекты(КаталогРепозитория, КаталогиИсходныхФайлов, Коммиты);
Сценарии = Неопределено;
ИменаСценариев = Новый Массив;
ПараметрИменаЗагружаемыхСценариев = ЗначениеПараметра(ПараметрыКоманды, "-rules");
Если ЗначениеЗаполнено(ПараметрИменаЗагружаемыхСценариев) Тогда
ПараметрИменаЗагружаемыхСценариев = СтрЗаменить(ПараметрИменаЗагружаемыхСценариев, " ", "");
Сценарии = СтрРазделить(ПараметрИменаЗагружаемыхСценариев, ",", Ложь);
ИменаСценариев = СтрРазделить(СтрЗаменить(ПараметрИменаЗагружаемыхСценариев, ".os", ""), ",", Ложь);
КонецЕсли;
ПараметрыВыполнения = Новый Структура;
ПараметрыВыполнения.Вставить("Лог", Лог);
ПараметрыВыполнения.Вставить("НастройкиИБ", НастройкиИБ);
ПараметрыВыполнения.Вставить("КаталогРепозитория", КаталогРепозитория);
ПараметрыВыполнения.Вставить("КаталогКонфигурационногоФайла", КаталогКонфигурационногоФайла);
ПараметрыВыполнения.Вставить("Сценарии", Сценарии);
ПараметрыВыполнения.Вставить("ИменаСценариев", ИменаСценариев);
ПараметрыВыполнения.Вставить("ОбрабатываемыеФайлы", ОбрабатываемыеОбъекты.Файлы);
ПараметрыВыполнения.Вставить("КаталогиФайлов", ОбрабатываемыеОбъекты.Каталоги);
Возврат ПараметрыВыполнения;
КонецФункции
Функция ЗначениеПараметра(НаборПараметров, ИмяПараметра, ЗначениеПоУмолчанию = Неопределено)
Значение = НаборПараметров[ИмяПараметра];
Возврат ?(ЗначениеЗаполнено(Значение), Значение, ЗначениеПоУмолчанию);
КонецФункции
Функция ОбрабатываемыеОбъекты(КаталогРепозитория, КаталогиИсходныхФайлов, Коммиты)
ОбрабатываемыеФайлы = Новый Массив();
КаталогиФайлов = Новый Соответствие();
Если Коммиты.Количество() > 0 Тогда
Изменения = СписокИзмененийМеждуКоммитами(Коммиты, КаталогРепозитория);
Для Каждого ИмяФайла Из Изменения Цикл
Для Каждого КаталогИсходныхФайлов Из КаталогиИсходныхФайлов Цикл
ТекущийКаталогИсходныхФайлов = ОбъединитьПути(КаталогРепозитория, СокрЛП(КаталогИсходныхФайлов));
ФайлПодлежитОбработке = ЭтоСуществующийКаталог(ТекущийКаталогИсходныхФайлов)
И ФайловыеОперации.ФайлНаходитсяВКаталоге(ИмяФайла, ТекущийКаталогИсходныхФайлов);
Если ФайлПодлежитОбработке Тогда
ОбрабатываемыйФайл = ФайловыеОперации.НовыйФайл(ИмяФайла);
ОбрабатываемыеФайлы.Добавить(ОбрабатываемыйФайл);
КаталогиФайлов.Вставить(ОбрабатываемыйФайл.ПолноеИмя, ТекущийКаталогИсходныхФайлов);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Иначе
Для Каждого КаталогИсходныхФайлов Из КаталогиИсходныхФайлов Цикл
ТекущийКаталогИсходныхФайлов = ОбъединитьПути(КаталогРепозитория, СокрЛП(КаталогИсходныхФайлов));
Если НЕ ЭтоСуществующийКаталог(ТекущийКаталогИсходныхФайлов) Тогда
Продолжить;
КонецЕсли;
ОбрабатываемыеФайлыКаталога = НайтиФайлы(ТекущийКаталогИсходныхФайлов, ПолучитьМаскуВсеФайлы(), Истина);
Для Каждого ОбрабатываемыйФайлКаталога Из ОбрабатываемыеФайлыКаталога Цикл
ОбрабатываемыеФайлы.Добавить(ОбрабатываемыйФайлКаталога);
КаталогиФайлов.Вставить(ОбрабатываемыйФайлКаталога.ПолноеИмя, ТекущийКаталогИсходныхФайлов);
КонецЦикла;
КонецЦикла;
КонецЕсли;
Результат = Новый Структура("Файлы, Каталоги", ОбрабатываемыеФайлы, КаталогиФайлов);
Возврат Результат;
КонецФункции
Функция ЭтоСуществующийКаталог(Каталог)
КаталогОбъект = Новый Файл(Каталог);
Если НЕ КаталогОбъект.Существует() Тогда
Лог.Ошибка("Каталог <%1> не существует", Каталог);
Возврат Ложь;
ИначеЕсли НЕ КаталогОбъект.ЭтоКаталог() Тогда
Лог.Ошибка("Каталог <%1> является файлов", Каталог);
Возврат Ложь;
Иначе
Каталог = КаталогОбъект.ПолноеИмя;
Возврат Истина;
КонецЕсли;
КонецФункции
Функция МассивКоммитов(ПараметрыКоманды, КаталогРепозитория)
Коммиты = Новый Массив;
Репозиторий = РепозиторийGit(КаталогРепозитория);
Если НЕ Репозиторий.ЭтоРепозиторий() Тогда
Возврат Коммиты;
КонецЕсли;
Коммит1 = ЗначениеПараметра(ПараметрыКоманды, "Коммит1", "");
Если НЕ ПустаяСтрока(Коммит1) Тогда
Коммит2 = ЗначениеПараметра(ПараметрыКоманды, "Коммит2", "");
Если ПустаяСтрока(Коммит2) Тогда
Коммиты = РодительскиеКоммиты(Коммит1);
Иначе
Коммиты.Добавить(Коммит1);
Коммиты.Добавить(Коммит2);
КонецЕсли;
КонецЕсли;
Возврат Коммиты;
КонецФункции
Функция РодительскиеКоммиты(Коммит)
Коммиты = Новый Массив;
Git = РепозиторийGit();
Git.ВыполнитьКоманду(МассивПараметров("cat-file", "-p", Коммит));
Результат = Git.ПолучитьВыводКоманды();
РегулярноеВыражение = Новый РегулярноеВыражение("parent (\w+)");
Совпадения = РегулярноеВыражение.НайтиСовпадения(Результат);
Если НЕ ДваЭлементаВКоллекции(Совпадения) Тогда
Лог.Ошибка("В команду необходимо передать два коммита или коммит с двумя родителями (объединение веток).");
ВызватьИсключение "Не удалось составить список измененных файлов коммита";
КонецЕсли;
Для Каждого Совпадение Из Совпадения Цикл
Группа = Совпадение.Группы[1];
Коммиты.Добавить(Группа.Значение);
КонецЦикла;
Возврат Коммиты;
КонецФункции
Функция МассивПараметров(Параметр1, Параметр2 = Неопределено, Параметр3 = Неопределено, Параметр4 = Неопределено)
Массив = Новый Массив;
Массив.Добавить(Параметр1);
Если Параметр2 <> Неопределено Тогда
Массив.Добавить(Параметр2);
КонецЕсли;
Если Параметр3 <> Неопределено Тогда
Массив.Добавить(Параметр3);
КонецЕсли;
Если Параметр4 <> Неопределено Тогда
Массив.Добавить(Параметр4);
КонецЕсли;
Возврат Массив;
КонецФункции
Функция СписокИзмененийМеждуКоммитами(Коммиты, КаталогРепозитория)
Если НЕ ДваЭлементаВКоллекции(Коммиты) Тогда
Возврат Новый Массив;
КонецЕсли;
Git = РепозиторийGit(КаталогРепозитория);
ПараметрыКоманды = МассивПараметров(СтрШаблон("diff --name-only %1 %2", Коммиты[0], Коммиты[1]));
Git.ВыполнитьКоманду(ПараметрыКоманды);
Результат = Git.ПолучитьВыводКоманды();
Если ПустаяСтрока(Результат) Тогда
Возврат Новый Массив;
КонецЕсли;
ИзмененныеФайлы = СтрРазделить(СокрЛП(Результат), Символы.ПС);
Для Индекс = 0 По ИзмененныеФайлы.ВГраница() Цикл
ИзмененныеФайлы[Индекс] = ОбъединитьПути(КаталогРепозитория, СокрЛП(ИзмененныеФайлы[Индекс]));
КонецЦикла;
Возврат ИзмененныеФайлы;
КонецФункции
Функция ДваЭлементаВКоллекции(Коллекция)
ЗначениеСравнения = 2;
Возврат Коллекция.Количество() = ЗначениеСравнения;
КонецФункции

View File

@ -111,7 +111,7 @@
ПроектыКонфигурации = МенеджерНастроек.ПроектыКонфигурации();
Для Каждого ИмяПроекта из ПроектыКонфигурации Цикл
Для Каждого ИмяПроекта Из ПроектыКонфигурации Цикл
НапечататьНастройкиПроекта(ИмяПроекта, ИмяПроекта);
@ -138,13 +138,11 @@
Процедура ВывестиНастройкиРекурсивно(НастройкиПрекоммита, Уровень = 1)
ПробельныеСимволы = "";
Для Счетчик = 1 по Уровень Цикл
ПробельныеСимволы = ПробельныеСимволы + Символы.Таб;
МассивТабуляций = Новый Массив(Уровень);
Для Индекс = 0 По МассивТабуляций.ВГраница() Цикл
МассивТабуляций[Индекс] = Символы.Таб;
КонецЦикла;
ПробельныеСимволы = СтрСоединить(МассивТабуляций);
Для Каждого НастройкаПрекоммита Из НастройкиПрекоммита Цикл

View File

@ -268,7 +268,7 @@
КонецЕсли;
Результат = Новый Массив;
Для каждого Группа Из Совпадение.Группы Цикл
Для Каждого Группа Из Совпадение.Группы Цикл
Результат.Добавить(Группа.Значение);
КонецЦикла;

View File

@ -411,7 +411,7 @@
КонецЕсли;
Для каждого Ключ Из Ключи Цикл
Для Каждого Ключ Из Ключи Цикл
Значение = Значение.Получить(Ключ);

View File

@ -92,7 +92,7 @@
Буфер = ПрочитатьДвоичныеДанные(ПутьКФайлу, МаркерUTFBOM.Количество());
Сч = 0;
Для Каждого Байт ИЗ Буфер Цикл
Для Каждого Байт Из Буфер Цикл
Если МаркерUTFBOM[Сч] <> Строка(Байт) Тогда
Возврат Кодировка;
КонецЕсли;
@ -267,3 +267,16 @@
КонецЕсли;
КонецПроцедуры
// Проверяет, находится ли файл в указанном каталоге или вложенных каталогах.
//
// Параметры:
// Файл - Файл, Строка - проверяемый файл или путь к нему
// Каталог - Строка - каталог, в котором должен находиться файл
//
// Возвращаемое значение:
// Булево
Функция ФайлНаходитсяВКаталоге(Знач Файл, Знач Каталог) Экспорт
Файл = НовыйФайл(Файл);
Возврат СтрНайти(Файл.ПолноеИмя, Каталог) > 0;
КонецФункции

View File

@ -40,7 +40,6 @@
Возврат Ложь;
КонецЕсли;
ФайлДобавлен = ДополнительныеПараметры.Свойство("ТипИзменения") И
ДополнительныеПараметры.ТипИзменения = ВариантИзмененийФайловGit.Добавлен;
@ -80,7 +79,6 @@
КонецЕсли;
Если ЭтоЕДТ Тогда
Регексп = РегулярныеВыражения.Создать("(<allowFormCustomize>)(true)(<\/allowFormCustomize>)");

View File

@ -127,7 +127,7 @@
Прервать;
КонецЕсли;
Для каждого Часть Из ЧастиИнструкции Цикл
Для Каждого Часть Из ЧастиИнструкции Цикл
Токен = НРег(СокрЛП(Часть));
Если Не ПустаяСтрока(Токен) И ВсеТокены.Найти(Токен) = Неопределено Тогда
Ошибки.Добавить(СтрШаблон(
@ -201,19 +201,19 @@
Результат = Новый Массив();
Для каждого Токен Из ТокеныОбласть() Цикл
Для Каждого Токен Из ТокеныОбласть() Цикл
Результат.Добавить(Токен);
КонецЦикла;
Для каждого Токен Из ТокеныЕсли() Цикл
Для Каждого Токен Из ТокеныЕсли() Цикл
Результат.Добавить(Токен);
КонецЦикла;
Для каждого Токен Из ТокеныИначеЕсли() Цикл
Для Каждого Токен Из ТокеныИначеЕсли() Цикл
Результат.Добавить(Токен);
КонецЦикла;
Для каждого Токен Из ТокеныИначе() Цикл
Для Каждого Токен Из ТокеныИначе() Цикл
Результат.Добавить(Токен);
КонецЦикла;
Для каждого Токен Из ТокеныКонецЕсли() Цикл
Для Каждого Токен Из ТокеныКонецЕсли() Цикл
Результат.Добавить(Токен);
КонецЦикла;

View File

@ -98,7 +98,6 @@
КонецЕсли;
КонецПроцедуры
Процедура ПроверкаНаНецензурныеСлова(СодержимоеФайла, ФайлСНецензурнымиСловами)

View File

@ -98,7 +98,7 @@
Иначе
ФайлыВКаталогеТВФ = НайтиФайлы(ИмяКаталогаВыгрузки, "*", ИСТИНА);
Для каждого ФайлВКателогеТВФ Из ФайлыВКаталогеТВФ Цикл
Для Каждого ФайлВКателогеТВФ Из ФайлыВКаталогеТВФ Цикл
Если НЕ ФайлВКателогеТВФ.Существует() Тогда

View File

@ -249,7 +249,7 @@
СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(ПолноеИмяФайла);
Замены = Новый Массив;
Для каждого Сценарий Из ПараметрыСортировки.Сценарии() Цикл
Для Каждого Сценарий Из ПараметрыСортировки.Сценарии() Цикл
ПоискСостава = Сценарий.ШаблонПоискаСостава();
СовпаденияСостава = ПоискСостава.НайтиСовпадения(СодержимоеФайла);
Если СовпаденияСостава.Количество() = 0 Тогда
@ -284,7 +284,7 @@
Если ПараметрыСортировки.Тип = ТипыОбъектовДляСортировки.Конфигурация Тогда
СортированныеОбъекты = Новый Массив;
Для каждого ТипМетаданных Из ИменаВсехЭлементовПоПорядку(СоставОбъектов) Цикл
Для Каждого ТипМетаданных Из ИменаВсехЭлементовПоПорядку(СоставОбъектов) Цикл
СоставТипа = ВырезатьЭлемент(СоставОбъектов, ТипМетаданных, Сценарий.РазделительЭлементов());
Если НесортируемыеТипыМетаданных.Найти(НРег(ТипМетаданных)) = Неопределено Тогда
@ -332,7 +332,7 @@
Элементы = Новый ТаблицаЗначений;
Элементы.Колонки.Добавить("ИмяЭлемента");
Для каждого СовпадениеЭлемента Из ПоискЭлементов.НайтиСовпадения(ТекстХМЛ) Цикл
Для Каждого СовпадениеЭлемента Из ПоискЭлементов.НайтиСовпадения(ТекстХМЛ) Цикл
Элементы.Добавить().ИмяЭлемента = СовпадениеЭлемента.Группы.ПоИмени("name").Значение;
КонецЦикла;
Элементы.Свернуть("ИмяЭлемента");
@ -348,7 +348,7 @@
Если СовпаденияЭлемента.Количество() > 0 Тогда
СтрокиЭлемента = Новый Массив;
Для каждого СовпадениеЭлемента Из СовпаденияЭлемента Цикл
Для Каждого СовпадениеЭлемента Из СовпаденияЭлемента Цикл
СтрокиЭлемента.Добавить(СовпадениеЭлемента.Группы[1].Значение);
КонецЦикла;
@ -379,7 +379,7 @@
КонецЦикла;
СортированныеЭлементыПоПрефиксами = Новый Массив();
Для каждого ТаблицаПрефикса Из ТаблицыПоПрефиксам Цикл
Для Каждого ТаблицаПрефикса Из ТаблицыПоПрефиксам Цикл
Если ТаблицаПрефикса.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
@ -414,18 +414,16 @@
Функция ТаблицыПоПрефиксам()
ТаблицыПоПрефиксам = Новый Массив();
КоличествоЭлементов = ?(ЗначениеЗаполнено(ПрефиксыСортировки), ПрефиксыСортировки.Количество() + 1, 1);
ТаблицыПоПрефиксам = Новый Массив(КоличествоЭлементов);
ТаблицаСортировки = Новый ТаблицаЗначений;
ТаблицаСортировки.Колонки.Добавить("СтрокаЭлемента");
ТаблицаСортировки.Колонки.Добавить("СтрокаСортировки");
ТаблицыПоПрефиксам.Добавить(ТаблицаСортировки);
Если ЗначениеЗаполнено(ПрефиксыСортировки) Тогда
Для каждого Префикс Из ПрефиксыСортировки Цикл // BSLLS:UseLessForEach-off служебный итератор
ТаблицыПоПрефиксам.Добавить(ТаблицаСортировки.СкопироватьКолонки());
Для Индекс = 0 По ТаблицыПоПрефиксам.ВГраница() Цикл
ТаблицыПоПрефиксам[Индекс] = ТаблицаСортировки.СкопироватьКолонки();
КонецЦикла;
КонецЕсли;
Возврат ТаблицыПоПрефиксам;