1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2024-11-30 08:36:50 +02:00
yaxunit/tools/precommit/ВставкаКопирайтов.os
Maximov Valery a6e0e51ab1 1. Добавил сценарий прекоммита для копипрайта
2. исправил именование метода подключения сервисной компоненты

3. Добавил пару строк в руководство контрибьютера
2023-09-07 09:23:39 +03:00

174 lines
9.3 KiB
Plaintext

///////////////////////////////////////////////////////////////////////////////
//
// Служебный модуль с реализацией сценариев обработки файлов ВставкаКопирайтов
//
///////////////////////////////////////////////////////////////////////////////
Перем Лог;
// ИмяСценария
// Возвращает имя сценария обработки файлов
//
// Возвращаемое значение:
// Строка - Имя текущего сценария обработки файлов
//
Функция ИмяСценария() Экспорт
Возврат "ВставкаКопирайтов";
КонецФункции // ИмяСценария()
// ОбработатьФайл
// Выполняет обработку файла
//
// Параметры:
// АнализируемыйФайл - Файл - Файл из журнала git для анализа
// КаталогИсходныхФайлов - Строка - Каталог расположения исходных файлов относительно каталог репозитория
// ДополнительныеПараметры - Структура - Набор дополнительных параметров, которые можно использовать
// * Лог - Объект - Текущий лог
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
// * КаталогРепозитория - Строка - Адрес каталога репозитория
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образовавшиеся в результате работы сценария
// и которые необходимо дообработать
//
// Возвращаемое значение:
// Булево - Признак выполненной обработки файла
//
Функция ОбработатьФайл(АнализируемыйФайл, КаталогИсходныхФайлов, ДополнительныеПараметры) Экспорт
Лог = ДополнительныеПараметры.Лог;
Если АнализируемыйФайл.Существует() И ЭтоФайлИсходников(АнализируемыйФайл) Тогда
ПутьКФайлуКопирайта = ОбъединитьПути(ДополнительныеПараметры.КаталогРепозитория, "COPYRIGHT");
ФайлКопирайта = Новый Файл(ПутьКФайлуКопирайта);
Если НЕ ФайлКопирайта.Существует() Тогда
Возврат ЛОЖЬ;
КонецЕсли;
Если Не ДополнительныеПараметры.Свойство("АктуальныйКопирайт") Тогда
Текст = Новый ЧтениеТекста();
Текст.Открыть(ПутьКФайлуКопирайта, КодировкаТекста.UTF8NoBOM);
ТекстКопирайта = Текст.Прочитать();
ТекстКопирайта = СокрЛП(ТекстКопирайта);
Текст.Закрыть();
РегуляркаДатыКопирайта = Новый РегулярноеВыражение("\)\.\s\d{4}-(\d{4})\.");
РегуляркаДатыКопирайта.Многострочный = Истина;
РегуляркаДатыКопирайта.ИгнорироватьРегистр = Истина;
ТекстКопирайта = РегуляркаДатыКопирайта.Заменить(ТекстКопирайта, "). 2021-" + Год(ТекущаяУниверсальнаяДата()) + ".");
ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлуКопирайта, КодировкаТекста.UTF8NoBOM, , , Символы.ПС);
ЗаписьТекста.Записать(ТекстКопирайта);
ЗаписьТекста.Закрыть();
ДополнительныеПараметры.ИзмененныеКаталоги.Добавить(ПутьКФайлуКопирайта);
ДополнительныеПараметры.Вставить("АктуальныйКопирайт", Истина);
КонецЕсли;
Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария());
Если УстановитьКопирайтПриНеобходимости(АнализируемыйФайл.ПолноеИмя, ФайлКопирайта.ПолноеИмя) Тогда
ДополнительныеПараметры.ИзмененныеКаталоги.Добавить(АнализируемыйФайл.ПолноеИмя);
// для постобработки другим сценарием
ДополнительныеПараметры.ФайлыДляПостОбработки.Добавить(АнализируемыйФайл.ПолноеИмя);
Возврат ИСТИНА;
КонецЕсли;
КонецЕсли;
Возврат ЛОЖЬ;
КонецФункции // ОбработатьФайл()
Функция ЭтоФайлИсходников(Файл)
Если ПустаяСтрока(Файл.Расширение) Тогда
Возврат Ложь;
КонецЕсли;
Возврат СтрСравнить(Файл.Расширение, ".bsl") = 0;
КонецФункции
Функция УстановитьКопирайтПриНеобходимости(ПутьКФайлуМодуля, ПутьКФайлуКопирайта)
Текст = Новый ЧтениеТекста();
Текст.Открыть(ПутьКФайлуКопирайта, КодировкаТекста.UTF8NoBOM);
ТекстКопирайта = Текст.Прочитать();
ТекстКопирайта = СокрЛП(ТекстКопирайта);
Текст.Закрыть();
ТекстОшибки = "";
РегуляркаСтороннийКод = Новый РегулярноеВыражение("(// IMPORT\s)");
РегуляркаСтороннийКод.Многострочный = Истина;
РегуляркаСтороннийКод.ИгнорироватьРегистр = Истина;
РегуляркаКопирайта = Новый РегулярноеВыражение("([\/]{2}©[\/]{2,}©[\/]{2}\s?)");
РегуляркаКопирайта.Многострочный = Истина;
РегуляркаКопирайта.ИгнорироватьРегистр = Истина;
НовыйТекстМодуля = "";
Текст = Новый ЧтениеТекста();
Текст.Открыть(ПутьКФайлуМодуля, КодировкаТекста.UTF8NoBOM);
ТекстМодуля = Текст.Прочитать();
Текст.Закрыть();
Если НЕ ПустаяСтрока(ТекстМодуля) И Не РегуляркаСтороннийКод.Совпадает(ТекстМодуля) Тогда
КоллекцияСовпадений = РегуляркаКопирайта.НайтиСовпадения(ТекстМодуля);
Если КоллекцияСовпадений.Количество() = 0 Тогда
ТекстОшибки = "Нет копирайта в модуле";
НовыйТекстМодуля = ТекстКопирайта + Символы.ПС + Символы.ПС + СокрЛП(ТекстМодуля);
ИначеЕсли КоллекцияСовпадений.Количество() <> 2 Тогда
Лог.Ошибка("Модуль '%1'
|содержит несколько блоков, похожих на части копирайта.
|Удалите лишние (либо все) блоки относящиеся к копирайту.", ПутьКФайлуМодуля);
ВызватьИсключение "Копирайт не может быть проверен/скорректирован";
Иначе
КонецКопирайта = КоллекцияСовпадений[1].Индекс + КоллекцияСовпадений[1].Длина;
Если СтрСравнить(ТекстКопирайта, СокрЛП(СтрЗаменить(Лев(ТекстМодуля, КонецКопирайта), Символы.ВК, ""))) <> 0 Тогда
ТекстОшибки = "Неактульный копирайт";
НовыйТекстМодуля = ТекстКопирайта + Символы.ПС + Символы.ПС + СокрЛП(Прав(ТекстМодуля, СтрДлина(ТекстМодуля) - КонецКопирайта));
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(ТекстОшибки) Тогда
ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлуМодуля, КодировкаТекста.UTF8NoBOM, , , Символы.ПС);
ЗаписьТекста.Записать(НовыйТекстМодуля);
ЗаписьТекста.Закрыть();
Возврат ИСТИНА;
КонецЕсли;
Возврат ЛОЖЬ;
КонецФункции