/////////////////////////////////////////////////////////////////////////////// // // Служебный модуль с реализацией сценариев обработки файлов ВставкаКопирайтов // /////////////////////////////////////////////////////////////////////////////// Перем Лог; // ИмяСценария // Возвращает имя сценария обработки файлов // // Возвращаемое значение: // Строка - Имя текущего сценария обработки файлов // Функция ИмяСценария() Экспорт Возврат "ВставкаКопирайтов"; КонецФункции // ИмяСценария() // ОбработатьФайл // Выполняет обработку файла // // Параметры: // АнализируемыйФайл - Файл - Файл из журнала 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, , , Символы.ПС); ЗаписьТекста.Записать(НовыйТекстМодуля); ЗаписьТекста.Закрыть(); Возврат ИСТИНА; КонецЕсли; Возврат ЛОЖЬ; КонецФункции