Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -113,15 +113,20 @@
&ВыполнениеКоманды
Процедура Запустить() Экспорт

ЛокаторФайловКонфигурации = Новый ЛокаторФайловКонфигурацииOneScript();
Перезапускатель = Новый ПерезапускательПриложенияOneScript();

ФайлыКонфигурацииOneScript = ЛокаторФайловКонфигурации.НайтиФайлыКонфигурации(_МассивФайлов, _Рекурсивно);
КодВозврата = Перезапускатель.ПерезапуститьСКонфигурацией(ФайлыКонфигурацииOneScript);

Если КодВозврата <> Неопределено Тогда
ЗавершитьРаботу(КодВозврата);
Возврат;
Если ПолучитьПеременнуюСреды("BENCHOS_OSCRIPT_CONFIG_APPLIED") <> "1" Тогда
Перезапускатель = Новый ПерезапускательПриложенияOneScript();
ПодготовительОкружения = Новый ПодготовительОкруженияЗапускаБенчмарков(_МассивФайлов, _Рекурсивно);
ОкружениеЗапуска = ПодготовительОкружения.Подготовить();

КодВозврата = Перезапускатель.ПерезапуститьСОкружениемOneScript(
ОкружениеЗапуска.ФайлыКонфигурацииOneScript,
ОкружениеЗапуска.ДирективыИспользованияБенчмарков
);

Если КодВозврата <> Неопределено Тогда
ЗавершитьРаботу(КодВозврата);
Возврат;
КонецЕсли;
КонецЕсли;

Настройки = ПрочитатьНастройки();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,18 @@

#Область ПрограммныйИнтерфейс

// Находит файлы конфигурации OneScript для переданных файлов и каталогов бенчмарков.
// Каждый файл возвращается один раз в порядке первого появления. Порядок определяется
// порядком элементов МассивФайлов и нормализованными полными путями файлов внутри каталога.
// Находит файлы конфигурации OneScript в разрешенных входах бенчмарков.
//
// Параметры:
// МассивФайлов - Массив из Строка - Пути к файлам и каталогам бенчмарков
// Рекурсивно - Булево - Искать файлы бенчмарков во вложенных каталогах
// РазрешенныеВходы - Массив из Структура - Результат разрешения входных файлов бенчмарков
//
// Возвращаемое значение:
// Массив из Строка - Уникальные нормализованные полные пути к файлам oscript.cfg
// в порядке первого появления
Функция НайтиФайлыКонфигурации(МассивФайлов, Рекурсивно = Ложь) Экспорт
Функция НайтиФайлыКонфигурации(РазрешенныеВходы) Экспорт

ФайлыКонфигурации = Новый Массив();
ДобавленныеФайлы = Новый Соответствие();
РазрешательВходныхФайлов = Новый РазрешательВходныхФайловБенчмарков();
РазрешенныеВходы = РазрешательВходныхФайлов.Разрешить(МассивФайлов, Рекурсивно);

Для Каждого РазрешенныйВход Из РазрешенныеВходы Цикл

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

#Область ОбработчикиСобытий

// Инициализирует перезапускатель приложения с конфигурациями OneScript.
// Инициализирует перезапускатель приложения с окружением OneScript.
// Точка входа определяется по расположению сценария класса при подготовке повторного запуска.
Процедура ПриСозданииОбъекта()

Expand All @@ -14,62 +14,157 @@

#Область ПрограммныйИнтерфейс

// Перезапускает приложение с указанными файлами конфигурации OneScript.
// Перезапускает приложение с указанными файлами конфигурации и директивами OneScript.
//
// Параметры:
// ФайлыКонфигурацииOneScript - Массив из Строка - Пути к файлам oscript.cfg
// в порядке убывания приоритета
// в порядке убывания приоритета
// ДирективыИспользованияБенчмарков - Массив из Массив из Строка, Неопределено - Директивы
// использования, сгруппированные по файлам бенчмарков
//
// Возвращаемое значение:
// Число, Неопределено - Код возврата дочернего процесса или Неопределено,
// если повторный запуск не требуется
Функция ПерезапуститьСКонфигурацией(ФайлыКонфигурацииOneScript) Экспорт
// если повторный запуск не требуется
Функция ПерезапуститьСОкружениемOneScript(
ФайлыКонфигурацииOneScript,
ДирективыИспользованияБенчмарков = Неопределено
) Экспорт

Если ПолучитьПеременнуюСреды("BENCHOS_OSCRIPT_CONFIG_APPLIED") = "1" Тогда
Возврат Неопределено;
КонецЕсли;

Если Не ТребуетсяПерезапуск(ФайлыКонфигурацииOneScript) Тогда
Если Не ТребуетсяПерезапуск(ФайлыКонфигурацииOneScript, ДирективыИспользованияБенчмарков) Тогда
Возврат Неопределено;
КонецЕсли;

Возврат ЗапуститьСКонфигурацией(ФайлыКонфигурацииOneScript);
Возврат ЗапуститьСОкружением(ФайлыКонфигурацииOneScript, ДирективыИспользованияБенчмарков);

КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция ТребуетсяПерезапуск(ФайлыКонфигурацииOneScript)
Функция ТребуетсяПерезапуск(ФайлыКонфигурацииOneScript, ДирективыИспользованияБенчмарков)

Если ФайлыКонфигурацииOneScript.Количество() > 0 Тогда
Возврат Истина;
КонецЕсли;

Если ДирективыИспользованияБенчмарков <> Неопределено
И ДирективыИспользованияБенчмарков.Количество() > 0 Тогда
Возврат Истина;
КонецЕсли;

ТекущаяКонфигурация = Новый Файл(ОбъединитьПути(ТекущийКаталог(), "oscript.cfg"));
Возврат ТекущаяКонфигурация.Существует() И ТекущаяКонфигурация.ЭтоФайл();

КонецФункции

Функция ЗапуститьСКонфигурацией(ФайлыКонфигурацииOneScript)
Функция ЗапуститьСОкружением(ФайлыКонфигурацииOneScript, ДирективыИспользованияБенчмарков)

ПутьКТочкеВхода = ПутьКТочкеВходаПриложения();
МенеджерПараметров = Новый МенеджерПараметровКонфигурацииOneScript(ФайлыКонфигурацииOneScript);
ПараметрыКонфигурацииOneScript = ПараметрыКонфигурацииДляПеременнойСреды(МенеджерПараметров.Прочитать());
ПутьКТочкеВхода = ПодготовитьТочкуВхода(ДирективыИспользованияБенчмарков);

Процесс = СоздатьИЗапуститьПроцесс(
ПутьКТочкеВхода,
ТекущийКаталог(),
ПараметрыКонфигурацииOneScript
);
Попытка
МенеджерПараметров = Новый МенеджерПараметровКонфигурацииOneScript(ФайлыКонфигурацииOneScript);
ПараметрыКонфигурацииOneScript = ПараметрыКонфигурацииДляПеременнойСреды(МенеджерПараметров.Прочитать());

Если ЭтоВременнаяТочкаВхода(ПутьКТочкеВхода) Тогда
МенеджерПараметров.ЗаписатьВКаталог(Новый Файл(ПутьКТочкеВхода).Путь);
КонецЕсли;

Процесс = СоздатьИЗапуститьПроцесс(
ПутьКТочкеВхода,
ТекущийКаталог(),
ПараметрыКонфигурацииOneScript
);

ОжидатьЗавершениеПроцесса(Процесс);
Исключение
УдалитьВременнуюТочкуВхода(ПутьКТочкеВхода);
ВызватьИсключение;
КонецПопытки;

ОжидатьЗавершениеПроцесса(Процесс);
УдалитьВременнуюТочкуВхода(ПутьКТочкеВхода);

Возврат Процесс.КодВозврата;

КонецФункции

Функция ПодготовитьТочкуВхода(ДирективыИспользованияБенчмарков)

ПутьКОсновнойТочкеВхода = ПутьКТочкеВходаПриложения();
Если ДирективыИспользованияБенчмарков = Неопределено
Или ДирективыИспользованияБенчмарков.Количество() = 0 Тогда
Возврат ПутьКОсновнойТочкеВхода;
КонецЕсли;

СтрокиСценария = Новый Массив();
КаталогВременнойТочкиВхода = ПолучитьИмяВременногоФайла("benchos-точка-входа");
СоздатьКаталог(КаталогВременнойТочкиВхода);
ПутьКВременнойТочкеВхода = ОбъединитьПути(КаталогВременнойТочкиВхода, "ТочкаВхода.os");

Попытка
НомерНабора = 0;
Для Каждого ДирективыФайла Из ДирективыИспользованияБенчмарков Цикл
НомерНабора = НомерНабора + 1;
ПутьКСценариюЗависимостей = ОбъединитьПути(
КаталогВременнойТочкиВхода,
"Зависимости" + Строка(НомерНабора) + ".os"
);
ЗаписатьСценарий(ПутьКСценариюЗависимостей, ДирективыФайла);

СтрокиСценария.Добавить(СтрШаблон(

Check notice on line 118 in src/BenchmarkOneScript/cmd/Классы/ПерезапускательПриложенияOneScript.os

View check run for this annotation

sonar.openbsl.ru qa-bot / SonarQube Code Analysis

src/BenchmarkOneScript/cmd/Классы/ПерезапускательПриложенияOneScript.os#L118

Уберите инициализацию параметров метода "Добавить" вложенными методами

Check notice on line 118 in src/BenchmarkOneScript/cmd/Классы/ПерезапускательПриложенияOneScript.os

View check run for this annotation

sonar.openbsl.ru qa-bot / SonarQube Code Analysis

src/BenchmarkOneScript/cmd/Классы/ПерезапускательПриложенияOneScript.os#L118

Уберите инициализацию параметров метода "СтрШаблон" вложенными методами
"Попытка
| ЗагрузитьСценарий(""%1"");
|Исключение
|КонецПопытки;",
ЭкранироватьКавычки(ПутьКСценариюЗависимостей)
));
КонецЦикла;

СтрокиСценария.Добавить(
"ЗагрузитьСценарий(""" + ЭкранироватьКавычки(ПутьКОсновнойТочкеВхода) + """);");
ЗаписатьСценарий(ПутьКВременнойТочкеВхода, СтрокиСценария);
Исключение
УдалитьФайлы(КаталогВременнойТочкиВхода);
ВызватьИсключение;
КонецПопытки;

Возврат ПутьКВременнойТочкеВхода;

КонецФункции

Процедура ЗаписатьСценарий(ПутьКФайлу, СтрокиСценария)

ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);
ЗаписьТекста.Записать(СтрСоединить(СтрокиСценария, Символы.ПС));
ЗаписьТекста.Закрыть();

КонецПроцедуры

Процедура УдалитьВременнуюТочкуВхода(ПутьКТочкеВхода)

Если ЭтоВременнаяТочкаВхода(ПутьКТочкеВхода) Тогда
УдалитьФайлы(Новый Файл(ПутьКТочкеВхода).Путь);
КонецЕсли;

КонецПроцедуры

Функция ЭтоВременнаяТочкаВхода(ПутьКТочкеВхода)

Возврат ПутьКТочкеВхода <> ПутьКТочкеВходаПриложения();

КонецФункции

Функция ЭкранироватьКавычки(Значение)

Кавычка = """";
Возврат СтрЗаменить(Значение, Кавычка, Кавычка + Кавычка);

КонецФункции

Функция ПутьКТочкеВходаПриложения()

Если _ПутьКТочкеВходаПриложения <> Неопределено Тогда
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
Перем _ВходныеПути; // Массив из Строка
Перем _Рекурсивно; // Булево

#Область ОбработчикиСобытий

// Инициализирует подготовитель окружения запуска бенчмарков.
//
// Параметры:
// ВходныеПути - Массив из Строка - Пути к бенчмаркам и каталогам бенчмарков
// Рекурсивно - Булево - Искать бенчмарки во вложенных каталогах
Процедура ПриСозданииОбъекта(ВходныеПути, Рекурсивно = Ложь)

_ВходныеПути = ВходныеПути;
_Рекурсивно = Рекурсивно;

КонецПроцедуры

#КонецОбласти

#Область ПрограммныйИнтерфейс

// Подготавливает настройки окружения OneScript для запуска бенчмарков.
//
// Возвращаемое значение:
// Структура - Свойства:
// * ФайлыКонфигурацииOneScript - Массив из Строка - Пути к файлам oscript.cfg
// * ДирективыИспользованияБенчмарков - Массив из Массив из Строка - Директивы по файлам бенчмарков
Функция Подготовить() Экспорт

РазрешенныеВходы = РазрешитьВходныеФайлыБенчмарков();
ЛокаторФайловКонфигурации = Новый ЛокаторФайловКонфигурацииOneScript();

Возврат Новый Структура(
"ФайлыКонфигурацииOneScript, ДирективыИспользованияБенчмарков",
ЛокаторФайловКонфигурации.НайтиФайлыКонфигурации(РазрешенныеВходы),
ДирективыИспользованияБенчмарков(РазрешенныеВходы)
);

КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция РазрешитьВходныеФайлыБенчмарков()

РазрешательВходныхФайлов = Новый РазрешательВходныхФайловБенчмарков();

Check notice on line 47 in src/BenchmarkOneScript/cmd/Классы/ПодготовительОкруженияЗапускаБенчмарков.os

View check run for this annotation

sonar.openbsl.ru qa-bot / SonarQube Code Analysis

src/BenchmarkOneScript/cmd/Классы/ПодготовительОкруженияЗапускаБенчмарков.os#L47

Возможная опечатка в "Разрешатель"
Возврат РазрешательВходныхФайлов.Разрешить(_ВходныеПути, _Рекурсивно);

КонецФункции

Функция ДирективыИспользованияБенчмарков(РазрешенныеВходы)

НаборыДиректив = Новый Массив();
Для Каждого РазрешенныйВход Из РазрешенныеВходы Цикл
Если Не РазрешенныйВход.Разрешен Тогда
Продолжить;
КонецЕсли;

Для Каждого ПутьКФайлу Из РазрешенныйВход.Файлы Цикл
АнализаторСценария = Новый АнализаторСценарияБенчмарка(ПутьКФайлу);
Если РазрешенныйВход.ВходнойКаталог <> Неопределено
И Не АнализаторСценария.СодержитБенчмарки() Тогда
Продолжить;
КонецЕсли;

ДирективыФайла = АнализаторСценария.ДирективыИспользования();
Если ДирективыФайла.Количество() > 0 Тогда
НаборыДиректив.Добавить(ДирективыФайла);
КонецЕсли;
КонецЦикла;
КонецЦикла;

Возврат НаборыДиректив;

КонецФункции

#КонецОбласти
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,26 @@
КонецЕсли;
КонецФункции

// Проверяет, что путь задан явно: является абсолютным, относительным
// или содержит разделитель каталогов.
//
// Параметры:
// Путь - Строка - Проверяемый путь
//
// Возвращаемое значение:
// Булево - Истина, если значение является явным путём
Функция ЭтоЯвныйПуть(Путь) Экспорт

Возврат ЭтоАбсолютныйПуть(Путь)
Или СтрНачинаетсяС(Путь, "./")
Или СтрНачинаетсяС(Путь, ".\")
Или СтрНачинаетсяС(Путь, "../")
Или СтрНачинаетсяС(Путь, "..\")
Или СтрНайти(Путь, "/") > 0
Или СтрНайти(Путь, "\") > 0;

КонецФункции

Функция ЭтоАбсолютныйПутьUnix(Знач Путь) Экспорт
Путь = СокрЛП(Путь);
Возврат Лев(Путь, 1) = "/";
Expand Down
Loading
Loading