├── .vscode
├── settings.json
└── tasks.json
├── lib.config
├── .gitignore
├── features
├── step_definitions
│ ├── fixtures
│ │ ├── ДолгоеВыполнение.os
│ │ └── ОбработчикОжиданияПроцесса.os
│ ├── wait-handler.os
│ ├── КомандныеФайлы.os
│ └── ВыполнениеКоманды.os
├── opm-build.feature
├── КомандныеФайлы.feature
├── wait-handler.feature
└── ВыполнениеКоманды.feature
├── packagedef
├── tasks
├── test-feature.os
├── coverage.os
└── test.os
├── NOTICE
├── .github
└── workflows
│ ├── testing.yml
│ ├── release.yml
│ └── qa.yml
├── sonar-project.properties
├── Jenkinsfile
├── readme.md
├── src
├── КомандныйФайл.os
└── Команда.os
└── LICENSE.md
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | // Place your settings in this file to overwrite default and user settings.
2 | {
3 | "editor.rulers": [120]
4 | }
--------------------------------------------------------------------------------
/lib.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Файлы
2 | exec.log
3 | bdd-log.xml
4 | *.ospx
5 | bdd-exec.xml
6 |
7 | # Каталоги
8 | coverage/
9 | oscript_modules/
10 | .scannerwork/
11 |
--------------------------------------------------------------------------------
/features/step_definitions/fixtures/ДолгоеВыполнение.os:
--------------------------------------------------------------------------------
1 |
2 | Процедура Запустить(ВремяВыполнения)
3 | ОднаСекунда = 1000;
4 |
5 | Ожидание = ТекущаяУниверсальнаяДатаВМиллисекундах() + ВремяВыполнения * ОднаСекунда;
6 |
7 | Пока Ожидание > ТекущаяУниверсальнаяДатаВМиллисекундах() Цикл
8 | Сообщить("Полезная работа");
9 | Приостановить(ОднаСекунда);
10 | КонецЦикла;
11 |
12 | КонецПроцедуры
13 |
14 | Если АргументыКоманднойСтроки.Количество() Тогда
15 |
16 | ВремяВыполнения = АргументыКоманднойСтроки[0];
17 | Запустить(ВремяВыполнения);
18 |
19 | КонецЕсли;
20 |
--------------------------------------------------------------------------------
/packagedef:
--------------------------------------------------------------------------------
1 |
2 | Описание.Имя("1commands")
3 | .Версия("1.5.0")
4 | .ВерсияСреды("1.0.17")
5 | .ЗависитОт("logos")
6 | .ЗависитОт("asserts")
7 | .ЗависитОт("semver")
8 | .ЗависитОт("tempfiles")
9 | .РазработкаЗависитОт("1bdd")
10 | .РазработкаЗависитОт("1testrunner")
11 | .РазработкаЗависитОт("asserts")
12 | .РазработкаЗависитОт("coverage")
13 | .ВключитьФайл("src")
14 | .ВключитьФайл("features")
15 | .ВключитьФайл("readme.md")
16 | .ВключитьФайл("LICENSE.md")
17 | .ВключитьФайл("NOTICE")
18 | .ВключитьФайл("packagedef")
19 | .ВключитьФайл("lib.config");
20 |
--------------------------------------------------------------------------------
/features/step_definitions/fixtures/ОбработчикОжиданияПроцесса.os:
--------------------------------------------------------------------------------
1 |
2 | Перем Счетчик;
3 | Перем ТребуетсяОтказ;
4 |
5 | Функция ПолучитьСчетчик() Экспорт
6 | Возврат Счетчик;
7 | КонецФункции
8 |
9 | Процедура УстановитьОтказ() Экспорт
10 | ТребуетсяОтказ = Истина;
11 | КонецПроцедуры
12 |
13 | Процедура ОбработкаОжиданияПроцесса(Процесс, Отказ, ПериодОпроса, ДополнительныеПараметрыОбработчика, СтандартнаяОбработка) Экспорт
14 |
15 | Счетчик = Счетчик + 1;
16 |
17 | Если ТребуетсяОтказ Тогда
18 | Отказ = Истина;
19 | КонецЕсли;
20 |
21 | КонецПроцедуры
22 |
23 | Счетчик = 0;
24 | ТребуетсяОтказ = Ложь;
--------------------------------------------------------------------------------
/tasks/test-feature.os:
--------------------------------------------------------------------------------
1 | #Использовать ".."
2 | #Использовать 1bdd
3 |
4 | КаталогФич = ОбъединитьПути(".", "features");
5 | ПутьФичи = ОбъединитьПути(".", "features", АргументыКоманднойСтроки[0]);
6 | Файл_КаталогФич = Новый Файл(КаталогФич);
7 | ФайлФичи = Новый Файл(ПутьФичи);
8 |
9 | ИсполнительБДД = Новый ИсполнительБДД;
10 | РезультатВыполнения = ИсполнительБДД.ВыполнитьФичу(ФайлФичи, Файл_КаталогФич);
11 | ИтоговыйРезультатВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатВыполнения);
12 |
13 | Сообщить(ИтоговыйРезультатВыполнения);
14 | Если ИтоговыйРезультатВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения().Сломался Тогда
15 | ВызватьИсключение 1;
16 | КонецЕсли;
17 |
--------------------------------------------------------------------------------
/features/opm-build.feature:
--------------------------------------------------------------------------------
1 | # language: ru
2 |
3 | Функционал: Проверка сборки продукта
4 | Как Пользователь
5 | Я хочу автоматически проверять сборку моего продукта
6 | Чтобы гарантировать возможность установку моего продукта у пользователей
7 |
8 | Контекст: Отключение отладки в логах
9 | Допустим Я выключаю отладку лога с именем "oscript.lib.commands"
10 | И Я очищаю параметры команды "opm" в контексте
11 |
12 | Сценарий: Выполнение команды без параметров
13 | Когда Я добавляю параметр "build ." для команды "opm"
14 | И Я выполняю команду "opm"
15 | Тогда Вывод команды "opm" содержит "Сборка пакета завершена"
16 | И Вывод команды "opm" не содержит "Внешнее исключение"
17 | И Код возврата команды "opm" равен 0
18 |
--------------------------------------------------------------------------------
/NOTICE:
--------------------------------------------------------------------------------
1 | This product contains parts of V8Runner, which is licensed under the Apache License,
2 | Version 2.0.
3 | The license can be downloaded from
4 | http://www.apache.org/licenses/LICENSE-2.0.html.
5 | The source code for this software is available from
6 | https://github.com/oscript-library/v8runner
7 |
8 | This product contains parts of Gitsync, which is licensed under the Apache License,
9 | Version 2.0.
10 | The license can be downloaded from
11 | http://www.apache.org/licenses/LICENSE-2.0.html.
12 | The source code for this software is available from
13 | https://github.com/oscript-library/Gitsync
14 |
15 | This product contains parts of oscript-actions-template, which is licensed under the MIT License.
16 | The source code for this software is available from
17 | https://github.com/silverbulleters/oscript-actions-template.git
18 |
--------------------------------------------------------------------------------
/.github/workflows/testing.yml:
--------------------------------------------------------------------------------
1 | # MIT License
2 | # Copyright (C) 2020 Tymko Oleg and contributors
3 | # All rights reserved.
4 |
5 | name: Тестирование
6 | # Любой пуш и pr в проекте
7 | on: [push, pull_request]
8 |
9 | jobs:
10 | build:
11 | runs-on: ${{ matrix.os }}
12 | strategy:
13 | fail-fast: false
14 | matrix:
15 | os: [ubuntu-latest, windows-latest]
16 | oscript_version: ['1.4.0']
17 |
18 | steps:
19 | # Загрузка проекта
20 | - name: Актуализация
21 | uses: actions/checkout@v2
22 |
23 | # Установка OneScript конкретной версии
24 | - name: Установка OneScript
25 | uses: otymko/setup-onescript@v1.1
26 | with:
27 | version: ${{ matrix.oscript_version }}
28 |
29 | # Установка зависимостей пакета
30 | - name: Установка зависимостей
31 | run: |
32 | opm install opm
33 | opm install --dev
34 |
35 | # Задача тестирования, в результате ожидается успешное выполнение
36 | - name: Тестирование
37 | run: oscript ./tasks/test.os
--------------------------------------------------------------------------------
/features/КомандныеФайлы.feature:
--------------------------------------------------------------------------------
1 | # language: ru
2 |
3 | Функциональность: Выполнение командных файлов
4 |
5 | Как разработчик
6 | Я хочу иметь возможность создавать и выполнять командные файлы
7 | Чтобы я мог проще автоматизировать больше действий на OneScript
8 |
9 | Контекст: Отключение отладки в логах
10 | Допустим Я выключаю отладку лога с именем "oscript.lib.commands"
11 |
12 | Сценарий: Выполнение командного файла PowerShell
13 | Когда Я пропускаю этот сценарий в Linux
14 | И Я устанавливаю приложение запуска "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
15 | И Я создаю командный файл PowerShell "" ".ps1"
16 | И Я добавляю строку "Write-Host PowerShell" в командный файл
17 | И Я сообщаю содержимое командного файла
18 | И Я выполняю командный файл
19 | Тогда Вывод командного файла содержит "PowerShell"
20 | И Код возврата командного файла равен 0
21 |
22 | Сценарий: Выполнение командного файла
23 | Когда Я создаю командный файл
24 | И Я добавляю строку "echo command file" в командный файл
25 | И Я сообщаю содержимое командного файла
26 | И Я выполняю командный файл
27 | Тогда Вывод командного файла содержит "command file"
28 | И Код возврата командного файла равен 0
29 |
--------------------------------------------------------------------------------
/tasks/coverage.os:
--------------------------------------------------------------------------------
1 | #Использовать 1commands
2 | #Использовать fs
3 | #Использовать coverage
4 |
5 | ИмяПакета = "1commands";
6 |
7 | ИмяКаталогаФайловПокрытия = "coverage";
8 | ИмяОбщегоФайлаПокрытия = "stat.json";
9 | ШаблонИменФайловПокрытия = "*.json";
10 |
11 | ФС.ОбеспечитьПустойКаталог(ИмяКаталогаФайловПокрытия);
12 | ПутьКСтат = ОбъединитьПути(ИмяКаталогаФайловПокрытия, ИмяОбщегоФайлаПокрытия);
13 |
14 | СистемнаяИнформация = Новый СистемнаяИнформация;
15 | ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0;
16 |
17 | Команда = Новый Команда;
18 | Команда.УстановитьКоманду("oscript");
19 | Если НЕ ЭтоWindows Тогда
20 | Команда.ДобавитьПараметр("-encoding=utf-8");
21 | КонецЕсли;
22 | Команда.ДобавитьПараметр(СтрШаблон("-codestat=%1", ПутьКСтат));
23 | Команда.ДобавитьПараметр("tasks/test.os coverage");
24 | Команда.ПоказыватьВыводНемедленно(Истина);
25 |
26 | КодВозврата = Команда.Исполнить();
27 |
28 | Файл_Стат = Новый Файл(ПутьКСтат);
29 |
30 | ПроцессорГенерации = Новый ГенераторОтчетаПокрытия();
31 |
32 | ПроцессорГенерации.ОтносительныеПути()
33 | .РабочийКаталог(ИмяКаталогаФайловПокрытия)
34 | .ИмяФайлаСтатистики(ШаблонИменФайловПокрытия)
35 | .ФайлСтатистики(Файл_Стат.ПолноеИмя)
36 | .GenericCoverage()
37 | .Cobertura()
38 | .Clover(ИмяПакета)
39 | .Сформировать();
40 |
41 | ЗавершитьРаботу(0); // TODO КодВозврата
42 |
--------------------------------------------------------------------------------
/sonar-project.properties:
--------------------------------------------------------------------------------
1 | # must be unique in a given SonarQube instance
2 | sonar.projectKey=1commands
3 | # this is the name displayed in the SonarQube UI
4 | sonar.projectName=1commands
5 |
6 | # # версия проекта
7 | # sonar.projectVersion=1.10.0
8 |
9 | sonar.links.homepage=https://github.com/artbear/1commands
10 | sonar.links.scm=https://github.com/artbear/1commands
11 | sonar.links.issue=https://github.com/artbear/1commands/issues
12 | # sonar.links.ci=
13 |
14 | # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
15 | # Since SonarQube 4.2, this property is optional if sonar.modules is set.
16 | # If not set, SonarQube starts looking for source code from the directory containing
17 | # the sonar-project.properties file.
18 | sonar.sources=./src,./tasks
19 | sonar.tests=./features
20 |
21 | # маска поиска файлов на проверку
22 | sonar.inclusions=**/*.os
23 |
24 | # маска поиска исключений файлов на проверку
25 | # sonar.exclusions=
26 |
27 | # игнорирование gitignore
28 | sonar.scm.exclusions.disabled=true
29 |
30 | # путь к внешним отчетам
31 | # sonar.externalIssuesReportPaths=./tools/acc-export/acc-generic-issue.json
32 |
33 | # Encoding of the source code. Default is default system encoding
34 | sonar.sourceEncoding=UTF-8
35 |
36 | sonar.coverageReportPaths=./coverage/genericCoverage.xml
37 | # sonar.testExecutionReportPaths=./bdd-exec.xml
38 |
39 | # адрес сервера SonarQube, по умолчанию текущий компьютер
40 | sonar.host.url=https://sonar.openbsl.ru
41 |
--------------------------------------------------------------------------------
/.github/workflows/release.yml:
--------------------------------------------------------------------------------
1 | # MIT License
2 | # Copyright (C) 2020 Tymko Oleg and contributors
3 | # All rights reserved.
4 |
5 | name: Подготовка релиза и публикация в хабе
6 | # Только события создания и изменения релиза
7 | on:
8 | release:
9 | types: [published, edited]
10 |
11 | env:
12 | PACKAGE_MASK: 1commands-*.ospx
13 |
14 | jobs:
15 | build:
16 | runs-on: ${{ matrix.os }}
17 | strategy:
18 | fail-fast: false
19 | matrix:
20 | os: [ubuntu-latest]
21 | oscript_version: ['1.4.0']
22 |
23 | steps:
24 | # Загрузка проекта
25 | - name: Актуализация
26 | uses: actions/checkout@v2
27 |
28 | # Установка OneScript конкретной версии
29 | - name: Установка OneScript
30 | uses: otymko/setup-onescript@v1.1
31 | with:
32 | version: ${{ matrix.oscript_version }}
33 |
34 | # Установка зависимостей пакета
35 | - name: Установка зависимостей
36 | run: |
37 | opm install opm
38 | opm install
39 |
40 | - name: Сборка пакета
41 | run: opm build
42 |
43 | - name: Заливка артефактов
44 | uses: actions/upload-artifact@v2
45 | with:
46 | name: package.zip
47 | path: ./${{ env.PACKAGE_MASK }}
48 |
49 | - name: Заливка в релиз
50 | uses: AButler/upload-release-assets@v1.0
51 | with:
52 | files: ./${{ env.PACKAGE_MASK }}
53 | repo-token: ${{ secrets.GITHUB_TOKEN }}
54 |
55 | - name: Публикация в hub.oscript.io
56 | shell: bash
57 | run: opm push -f ./${{ env.PACKAGE_MASK }} --token ${{ env.TOKEN }} -c stable
58 | env:
59 | TOKEN: ${{ secrets.OSHUB_TOKEN }}
60 |
--------------------------------------------------------------------------------
/features/wait-handler.feature:
--------------------------------------------------------------------------------
1 | # language: ru
2 |
3 | Функциональность: Выполнение команды
4 |
5 | Как разработчик
6 | Я хочу иметь возможность выполнять команды
7 | Чтобы я мог проще автоматизировать больше действий на OneScript
8 |
9 | Контекст: Отключение отладки в логах
10 | Допустим Я выключаю отладку лога с именем "oscript.lib.commands"
11 | И Я очищаю параметры команды "oscript" в контексте
12 |
13 | Сценарий: Выполнение долгой команды
14 | Когда Я добавляю параметры для команды "oscript"
15 | # | -encoding=utf-8 |
16 | | features/step_definitions/fixtures/ДолгоеВыполнение.os |
17 | | 1 |
18 | # И Я добавляю параметр "features/step_definitions/fixtures/ДолгоеВыполнение.os" для команды "oscript"
19 | # И Я добавляю параметр "5" для команды "oscript"
20 | И Я устанавливаю период опроса завершения команды "oscript" в 1 миллисекунду
21 | И Я выполняю команду "oscript"
22 | Тогда Вывод команды "oscript" содержит "Полезная работа"
23 | И Код возврата команды "oscript" равен 0
24 |
25 | Сценарий: Выполнение долгой команды
26 | Когда Я добавляю параметры для команды "oscript"
27 | # | -encoding=utf-8 |
28 | | features/step_definitions/fixtures/ДолгоеВыполнение.os |
29 | | 1 |
30 | # И Я добавляю параметр "features/step_definitions/fixtures/ДолгоеВыполнение.os" для команды "oscript"
31 | # И Я добавляю параметр "5" для команды "oscript"
32 | И Я создаю обработчик ожидания процесса
33 | И Я устанавливаю отказ в обработчик ожидания процесса
34 | И Я устанавливаю обработчик ожидания процесса команды "oscript" с интервалом "1000"
35 | И Я устанавливаю ожидаемый код возврата -1 для команды "oscript"
36 | И Я выполняю команду "oscript"
37 | Тогда Вывод команды "oscript" содержит "Полезная работа"
38 | # И Код возврата команды "oscript" равен 1
39 | И Счетчик обработчика равен "1"
40 |
--------------------------------------------------------------------------------
/tasks/test.os:
--------------------------------------------------------------------------------
1 | // Прогон фич
2 | // При передаче параметра coverage будет включен подсчет покрытия кода,
3 | // в т.ч. для кода скриптов, запускаемых из фич
4 |
5 | #Использовать ".."
6 | #Использовать 1bdd
7 | #Использовать fs
8 |
9 | Перем СохраненныйТекущийКаталог;
10 |
11 | Процедура СохранитьТекущийКаталог()
12 | СохраненныйТекущийКаталог = ТекущийКаталог();
13 | КонецПроцедуры
14 |
15 | Процедура ВосстановитьТекущийКаталог()
16 | УстановитьТекущийКаталог(СохраненныйТекущийКаталог);
17 | КонецПроцедуры
18 |
19 | КаталогФич = ОбъединитьПути(".", "features");
20 | ПутьОтчетаJUnit = ОбъединитьПути(".", "bdd-exec.xml");
21 |
22 | ИмяКаталогаФайловПокрытия = "coverage";
23 |
24 | Файл_КаталогФич = Новый Файл(КаталогФич);
25 | КаталогБиблиотечныхФич = Файл_КаталогФич;
26 |
27 | // Только для отладки Файл_КаталогФич = Новый Файл(ОбъединитьПути(КаталогФич, "ПростыеКоманды.feature"));
28 |
29 | КаталогФайловПокрытия = ОбъединитьПути(ТекущийКаталог(), ".", ИмяКаталогаФайловПокрытия);
30 | ФС.ОбеспечитьПустойКаталог(КаталогФайловПокрытия);
31 |
32 | ИспользуетсяПокрытиеКода = Ложь;
33 | Для каждого Элемент Из АргументыКоманднойСтроки Цикл
34 | Если Элемент = "coverage" Тогда
35 | ИспользуетсяПокрытиеКода = Истина;
36 | Прервать;
37 | КонецЕсли;
38 | КонецЦикла;
39 |
40 | ИсполнительБДД = Новый ИсполнительБДД;
41 | Если ИспользуетсяПокрытиеКода Тогда
42 | ИсполнительБДД.СохранитьВКонтекст("ПризнакСтатистикиСкриптовOnescript", Новый Файл(КаталогФайловПокрытия));
43 | КонецЕсли;
44 |
45 | СохранитьТекущийКаталог();
46 |
47 | РезультатВыполнения = ИсполнительБДД.ВыполнитьФичу(Файл_КаталогФич, КаталогБиблиотечныхФич);
48 | ИтоговыйСтатусВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатВыполнения);
49 |
50 | Сообщить(ИтоговыйСтатусВыполнения);
51 |
52 | ВосстановитьТекущийКаталог();
53 |
54 | Если Не ПустаяСтрока(ПутьОтчетаJUnit) Тогда
55 | ГенераторОтчетаJUnit = Новый ГенераторОтчетаJUnit;
56 | ГенераторОтчетаJUnit.Сформировать(РезультатВыполнения, ИтоговыйСтатусВыполнения, ПутьОтчетаJUnit);
57 | КонецЕсли;
58 |
59 | Если ИтоговыйСтатусВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения().Сломался Тогда
60 | ВызватьИсключение "Есть упавшие сценарии!";
61 | КонецЕсли;
62 |
--------------------------------------------------------------------------------
/Jenkinsfile:
--------------------------------------------------------------------------------
1 |
2 | pipeline {
3 | agent none
4 | options {
5 | buildDiscarder(logRotator(numToKeepStr: '7'))
6 | skipDefaultCheckout()
7 | }
8 |
9 | stages {
10 | stage('Тестирование кода пакета WIN') {
11 |
12 | agent { label 'windows' }
13 |
14 | steps {
15 | checkout scm
16 |
17 | script {
18 | if( fileExists ('tasks/test.os') ){
19 | bat 'chcp 65001 > nul && oscript tasks/test.os'
20 |
21 | junit allowEmptyResults: true, testResults: 'tests.xml'
22 | junit allowEmptyResults: true, testResults: 'bdd-log.xml'
23 | }
24 | else
25 | echo 'no testing task'
26 | }
27 |
28 | }
29 |
30 | }
31 |
32 | stage('Тестирование кода пакета LINUX') {
33 |
34 | agent { label 'master' }
35 |
36 | steps {
37 | echo 'under development'
38 | }
39 |
40 | }
41 |
42 | stage('Сборка пакета') {
43 |
44 | agent { label 'windows' }
45 |
46 | steps {
47 | checkout scm
48 |
49 | bat 'erase /Q *.ospx'
50 | bat 'chcp 65001 > nul && call opm build .'
51 |
52 | stash includes: '*.ospx', name: 'package'
53 | archiveArtifacts '*.ospx'
54 | }
55 |
56 | }
57 |
58 | stage('Публикация в хабе') {
59 | when {
60 | branch 'master'
61 | }
62 | agent { label 'master' }
63 | steps {
64 | sh 'rm -f *.ospx'
65 | unstash 'package'
66 |
67 | sh '''
68 | artifact=`ls -1 *.ospx`
69 | basename=`echo $artifact | sed -r 's/(.+)-.*(.ospx)/\\1/'`
70 | cp $artifact $basename.ospx
71 | sudo rsync -rv *.ospx /var/www/hub.oscript.io/download/$basename/
72 | '''.stripIndent()
73 | }
74 | }
75 |
76 | stage('Публикация в нестабильном хабе') {
77 | when {
78 | branch 'develop'
79 | }
80 | agent { label 'master' }
81 | steps {
82 | sh 'rm -f *.ospx'
83 | unstash 'package'
84 |
85 | sh '''
86 | artifact=`ls -1 *.ospx`
87 | basename=`echo $artifact | sed -r 's/(.+)-.*(.ospx)/\\1/'`
88 | cp $artifact $basename.ospx
89 | sudo rsync -rv *.ospx /var/www/hub.oscript.io/dev-channel/$basename/
90 | '''.stripIndent()
91 | }
92 | }
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/features/step_definitions/wait-handler.os:
--------------------------------------------------------------------------------
1 | // Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd
2 | #Использовать "../.."
3 |
4 | Перем БДД; //контекст фреймворка 1bdd
5 |
6 | // Метод выдает список шагов, реализованных в данном файле-шагов
7 | Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт
8 | БДД = КонтекстФреймворкаBDD;
9 |
10 | ВсеШаги = Новый Массив;
11 |
12 | ВсеШаги.Добавить("ЯСоздаюОбработчикОжиданияПроцесса");
13 | ВсеШаги.Добавить("ЯУстанавливаюОтказВОбработчикОжиданияПроцесса");
14 | ВсеШаги.Добавить("ЯУстанавливаюОбработчикОжиданияПроцессаКомандыСИнтервалом");
15 | ВсеШаги.Добавить("СчетчикОбработчикаРавен");
16 |
17 | Возврат ВсеШаги;
18 | КонецФункции
19 |
20 | // Реализация шагов
21 |
22 | // Процедура выполняется перед запуском каждого сценария
23 | Процедура ПередЗапускомСценария(Знач Узел) Экспорт
24 |
25 | КонецПроцедуры
26 |
27 | // Процедура выполняется после завершения каждого сценария
28 | Процедура ПослеЗапускаСценария(Знач Узел) Экспорт
29 |
30 | КонецПроцедуры
31 |
32 | //Я создаю обработчик ожидания процесса
33 | Процедура ЯСоздаюОбработчикОжиданияПроцесса() Экспорт
34 |
35 | Обработчик = ЗагрузитьСценарий("./features/step_definitions/fixtures/ОбработчикОжиданияПроцесса.os");
36 |
37 | БДД.СохранитьВКонтекст("Обработчик", Обработчик);
38 |
39 | КонецПроцедуры
40 |
41 | //Я устанавливаю отказ в обработчик ожидая процесса
42 | Процедура ЯУстанавливаюОтказВОбработчикОжиданияПроцесса() Экспорт
43 |
44 | Обработчик = БДД.ПолучитьИзКонтекста("Обработчик");
45 | Обработчик.УстановитьОтказ();
46 |
47 | КонецПроцедуры
48 |
49 | //Счетчик обработчика равен "0"
50 | Процедура СчетчикОбработчикаРавен(Знач ЧислоСчетчика) Экспорт
51 |
52 | Обработчик = БДД.ПолучитьИзКонтекста("Обработчик");
53 |
54 | Ожидаем.Что(Обработчик.ПолучитьСчетчик(), "Счетчик должен быть равен").Равно(Число(ЧислоСчетчика));
55 |
56 | КонецПроцедуры
57 |
58 | //Я устанавливаю обработчик ожидания процесса команды "oscript" с интервалом "1000"
59 | Процедура ЯУстанавливаюОбработчикОжиданияПроцессаКомандыСИнтервалом(Знач ИмяКоманды, Знач Интервал) Экспорт
60 |
61 | Обработчик = БДД.ПолучитьИзКонтекста("Обработчик");
62 | Команда = ПолучитьКомандуИзКонтекста(ИмяКоманды);
63 | Команда.УстановитьОбработчикОжидания(Обработчик, Число(Интервал));
64 |
65 | КонецПроцедуры
66 |
67 | //TODO дубль кода с 1bdd::ВыполнениеКоманд.os
68 | Функция ПолучитьКомандуИзКонтекста(Знач ИмяКоманды)
69 |
70 | КлючКонтекста = КлючКоманды(ИмяКоманды);
71 | Команда = БДД.ПолучитьИзКонтекста(КлючКонтекста);
72 |
73 | Если Не ЗначениеЗаполнено(Команда) Тогда
74 | Команда = Новый Команда;
75 | Команда.УстановитьСтрокуЗапуска(ИмяКоманды);
76 | БДД.СохранитьВКонтекст(КлючКонтекста, Команда);
77 | КонецЕсли;
78 |
79 | Возврат Команда;
80 | КонецФункции
81 |
82 | //TODO дубль кода с 1bdd::ВыполнениеКоманд.os
83 | Функция КлючКоманды(Знач ИмяКоманды)
84 | Возврат "Команда-" + ИмяКоманды;
85 | КонецФункции
86 |
--------------------------------------------------------------------------------
/.github/workflows/qa.yml:
--------------------------------------------------------------------------------
1 | # MIT License
2 | # Copyright (C) 2020 Tymko Oleg and contributors
3 | # All rights reserved.
4 |
5 | name: Контроль качества
6 | # Любой пуш и pr в проекте но с фильтром по основному проекту
7 | on: [push, pull_request]
8 |
9 | env:
10 | # отключение безопасности установки
11 | ACTIONS_ALLOW_UNSECURE_COMMANDS: true
12 |
13 | jobs:
14 | build:
15 | if: github.repository == 'artbear/1commands'
16 | runs-on: ${{ matrix.os }}
17 | strategy:
18 | fail-fast: false
19 | matrix:
20 | os: [ubuntu-latest]
21 | oscript_version: ['1.4.0']
22 |
23 | steps:
24 | # Загрузка проекта
25 | - name: Актуализация
26 | uses: actions/checkout@v2
27 | with:
28 | fetch-depth: 0
29 |
30 | # https://stackoverflow.com/questions/58033366/how-to-get-current-branch-within-github-actions
31 | - name: Извлечение имени текущей ветки
32 | shell: bash
33 | run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
34 | id: extract_branch
35 |
36 | # Установка OneScript конкретной версии
37 | - name: Установка OneScript
38 | uses: otymko/setup-onescript@v1.1
39 | with:
40 | version: ${{ matrix.oscript_version }}
41 |
42 | # Установка зависимостей пакета
43 | - name: Установка зависимостей
44 | run: |
45 | opm install opm
46 | opm install --dev
47 |
48 | # Запуск тестов и сбор покрытия кода
49 | - name: Покрытие кода
50 | run: oscript ./tasks/coverage.os
51 |
52 | - name: Извлечение версии пакета
53 | shell: bash
54 | run: echo "##[set-output name=version;]`cat packagedef | grep ".Версия(" | sed 's|[^"]*"||' | sed -r 's/".+//'`"
55 | id: extract_version
56 |
57 | - name: Установка Sonar-scanner
58 | uses: warchant/setup-sonar-scanner@v1
59 |
60 | # Анализ проекта в SonarQube (ветка)
61 | - name: Анализ в SonarQube (branch)
62 | if: github.event_name == 'push'
63 | run: sonar-scanner
64 | -Dsonar.login=${{ secrets.SONARQUBE_TOKEN }}
65 | -Dsonar.host.url=${{ secrets.SONARQUBE_HOST }}
66 | -Dsonar.branch.name=${{ steps.extract_branch.outputs.branch }}
67 | -Dsonar.projectVersion=${{ steps.extract_version.outputs.version }}
68 |
69 | # Анализ проекта в SonarQube (PR)
70 | # https://docs.sonarqube.org/latest/analysis/pull-request/
71 | - name: Анализ в SonarQube (pull-request)
72 | if: github.event_name == 'pull_request'
73 | run: sonar-scanner
74 | -Dsonar.login=${{ secrets.SONARQUBE_TOKEN }}
75 | -Dsonar.host.url=${{ secrets.SONARQUBE_HOST }}
76 | -Dsonar.branch.name=${{ steps.extract_branch.outputs.branch }}
77 | -Dsonar.pullrequest.key=${{ github.event.pull_request.number }}
78 | -Dsonar.pullrequest.branch=${{ github.event.pull_request.head.ref }}
79 | -Dsonar.pullrequest.base=${{ github.event.pull_request.base.ref }}
80 | -Dsonar.scm.revision=${{ github.event.pull_request.head.sha }}
81 |
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | # 1commands
2 |
3 | [](https://github.com/artbear/1commands/releases)
4 | [](https://github.com/artbear/1commands/actions)
5 | [](https://sonar.openbsl.ru/dashboard?id=1commands)
6 | [](https://sonar.openbsl.ru/dashboard?id=1commands)
7 | [](https://sonar.openbsl.ru/dashboard?id=1commands)
8 | [](https://sonar.openbsl.ru/dashboard?id=1commands)
9 |
10 |
12 | [Vanessa open-source](https://t.me/vanessa_opensource_chat) или [oscript_library ](https://t.me/oscript_library) - в этих чатах вы можете задавать любые вопросы разработчикам и активным участникам.
13 |
14 | ## Библиотека для упрощения работы c запуском различных приложений и командных файлов (cmd, bat, bash, PowerShell, 1С через vanessa-runner и др.) из oscript.
15 |
16 | Позволяет выполнять рутинные операции по запуску приложений и командных файлов системы.
17 |
18 | Пример работы:
19 | ```bsl
20 | Команда = Новый Команда;
21 |
22 | Команда.УстановитьКоманду("oscript");
23 | Команда.ДобавитьПараметр("-version");
24 |
25 | // или сразу Команда.УстановитьСтрокуЗапуска("oscript -version");
26 |
27 | КодВозврата = Команда.Исполнить();
28 | Сообщить(КодВозврата);
29 |
30 | Сообщить(Команда.ПолучитьВывод());
31 | ```
32 |
33 | или запуск командного файла
34 | ```bsl
35 | КомандныйФайл = Новый КомандныйФайл;
36 | КомандныйФайл.Создать();
37 |
38 | КомандныйФайл.ДобавитьКоманду("@echo off");
39 | КомандныйФайл.ДобавитьКоманду("oscript -version");
40 |
41 | Сообщить(КомандныйФайл.ПолучитьТекстФайла());
42 |
43 | КодВозврата = КомандныйФайл.Исполнить();
44 | Сообщить(КодВозврата);
45 |
46 | Сообщить(КомандныйФайл.ПолучитьВывод());
47 | ```
48 | или запуск командного файла PowerShell
49 | ```bsl
50 | КомандныйФайл = Новый КомандныйФайл;
51 | КомандныйФайл.УстановитьПриложение("C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe");
52 | КомандныйФайл.Создать("",".ps1");
53 |
54 | КомандныйФайл.ДобавитьКоманду("Get-Help");
55 |
56 | Сообщить(КомандныйФайл.ПолучитьТекстФайла());
57 |
58 | КодВозврата = КомандныйФайл.Исполнить();
59 | Сообщить(КодВозврата);
60 |
61 | Сообщить(КомандныйФайл.ПолучитьВывод());
62 | ```
63 |
64 | Так же описание функциональности содержится в папке `features`. В прилагающихся `step_definitions` можно подсмотреть больше примеров.
65 |
66 | ## FAQ
67 |
68 | Вопрос:
69 | >при использовании классов Команда/Командный файл происходит зависание выполнения команды.
70 | В консоли та же команда выполняется без зависания.
71 |
72 | >Например, при использовании `gitsync`. [Описание ошибки и расследование](https://github.com/artbear/1commands/issues/14)
73 |
74 | >Что делать?
75 |
76 | Ответ:
77 | > Отключить режим использования немедленного вывода лога команды, использовав метод `ПоказыватьВыводНемедленно(Ложь);`
78 | В этом случае вывод команды будет получен после завершения работы команды, а не во время ее выполнения.
79 |
--------------------------------------------------------------------------------
/features/step_definitions/КомандныеФайлы.os:
--------------------------------------------------------------------------------
1 | // Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd
2 | #Использовать "../.."
3 |
4 | Перем БДД; //контекст фреймворка 1bdd
5 |
6 | // Метод выдает список шагов, реализованных в данном файле-шагов
7 | Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт
8 | БДД = КонтекстФреймворкаBDD;
9 |
10 | ВсеШаги = Новый Массив;
11 |
12 | ВсеШаги.Добавить("ЯСоздаюКомандныйФайл");
13 | ВсеШаги.Добавить("ЯСоздаюКомандныйФайлPowerShell");
14 | ВсеШаги.Добавить("ЯДобавляюСтрокуВКомандныйФайл");
15 | ВсеШаги.Добавить("ЯСообщаюСодержимоеКомандногоФайла");
16 | ВсеШаги.Добавить("ЯВыполняюКомандныйФайл");
17 | ВсеШаги.Добавить("ВыводКомандногоФайлаСодержит");
18 | ВсеШаги.Добавить("КодВозвратаКомандногоФайлаРавен");
19 | ВсеШаги.Добавить("ЯУстанавливаюПриложениеЗапуска");
20 |
21 | Возврат ВсеШаги;
22 | КонецФункции
23 |
24 | // Реализация шагов
25 |
26 | // Процедура выполняется перед запуском каждого сценария
27 | Процедура ПередЗапускомСценария(Знач Узел) Экспорт
28 | КонецПроцедуры
29 |
30 | // Процедура выполняется после завершения каждого сценария
31 | Процедура ПослеЗапускаСценария(Знач Узел) Экспорт
32 |
33 | КонецПроцедуры
34 |
35 | //Я создаю командный файл
36 | Процедура ЯСоздаюКомандныйФайл() Экспорт
37 | СоздатьФайл();
38 | КонецПроцедуры
39 |
40 | //Я создаю командный файл PowerShell "" ".ps1"
41 | Процедура ЯСоздаюКомандныйФайлPowerShell(Знач Путь="", Знач Расширение="") Экспорт
42 | СоздатьФайл(Путь,Расширение);
43 | КонецПроцедуры
44 |
45 | //я добавляю строку "echo командный файл" в командный файл
46 | Процедура ЯДобавляюСтрокуВКомандныйФайл(Знач СтрокаКоманды) Экспорт
47 | КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");
48 |
49 | КомандныйФайл.ДобавитьКоманду(СтрокаКоманды);
50 | КонецПроцедуры
51 |
52 | //Я выполняю командный файл
53 | Процедура ЯВыполняюКомандныйФайл() Экспорт
54 | КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");
55 |
56 | КомандныйФайл.Исполнить();
57 | КонецПроцедуры
58 |
59 | //Я сообщаю содержимое файла "ИмяФайла"
60 | Процедура ЯСообщаюСодержимоеФайла(Знач ИмяФайла) Экспорт
61 | ВывестиТекстФайла(ИмяФайла);
62 | КонецПроцедуры
63 |
64 | //Я сообщаю содержимое командного файла
65 | Процедура ЯСообщаюСодержимоеКомандногоФайла() Экспорт
66 | КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");
67 |
68 | ТекстФайла = КомандныйФайл.ПолучитьТекстФайла();
69 | Сообщить(ТекстФайла);
70 | КонецПроцедуры
71 |
72 | //Вывод командного файла содержит "командный файл"
73 | Процедура ВыводКомандногоФайлаСодержит(Знач ОжидаемыйВыводКоманды) Экспорт
74 | КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");
75 |
76 | ВыводКоманды = КомандныйФайл.ПолучитьВывод();
77 | Ожидаем.Что(ВыводКоманды).Содержит(ОжидаемыйВыводКоманды);
78 | КонецПроцедуры
79 |
80 | //Код возврата командного файла равен 0
81 | Процедура КодВозвратаКомандногоФайлаРавен(Знач ОжидаемыйКодВозврата) Экспорт
82 | КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");
83 |
84 | Ожидаем.Что(КомандныйФайл.ПолучитьКодВозврата(), "Код возврата").Равно(ОжидаемыйКодВозврата);
85 | КонецПроцедуры
86 |
87 | //Я устанавливаю приложение запуска "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
88 | Процедура ЯУстанавливаюПриложениеЗапуска(Знач ПутьПриложения="") Экспорт
89 | КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");
90 | Если КомандныйФайл=Неопределено Тогда
91 | КомандныйФайл = Новый КомандныйФайл;
92 | КонецЕсли;
93 | КомандныйФайл.УстановитьПриложение(ПутьПриложения);
94 | БДД.СохранитьВКонтекст("КомандныйФайл", КомандныйФайл);
95 | КонецПроцедуры
96 |
97 | Процедура ВывестиТекстФайла(Знач ИмяФайла, Знач Кодировка = Неопределено)
98 |
99 | Файл = Новый Файл(ИмяФайла);
100 | Если НЕ Файл.Существует() Тогда
101 | Возврат;
102 | КонецЕсли;
103 |
104 | Если Кодировка = Неопределено Тогда
105 | Кодировка = "utf-8";
106 | КонецЕсли;
107 |
108 | ЧТ = Новый ЧтениеТекста(ИмяФайла, Кодировка);
109 | СтрокаФайла = ЧТ.Прочитать();
110 | ЧТ.Закрыть();
111 |
112 | Сообщить(СтрокаФайла);
113 |
114 | КонецПроцедуры
115 |
116 | Процедура СоздатьФайл(Знач Путь="", Знач Расширение="")
117 | КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");
118 | Если КомандныйФайл=Неопределено Тогда
119 | КомандныйФайл = Новый КомандныйФайл;
120 | КонецЕсли;
121 |
122 | КомандныйФайл.Создать(Путь,Расширение);
123 | БДД.СохранитьВКонтекст("КомандныйФайл", КомандныйФайл);
124 | КонецПроцедуры
125 |
126 |
--------------------------------------------------------------------------------
/features/ВыполнениеКоманды.feature:
--------------------------------------------------------------------------------
1 | # language: ru
2 |
3 | Функциональность: Выполнение команды
4 |
5 | Как разработчик
6 | Я хочу иметь возможность выполнять команды
7 | Чтобы я мог проще автоматизировать больше действий на OneScript
8 |
9 | Контекст: Отключение отладки в логах
10 | Допустим Я выключаю отладку лога с именем "oscript.lib.commands"
11 | И Я очищаю параметры команды "git" в контексте
12 | И Я очищаю параметры команды "oscript" в контексте
13 |
14 | Сценарий: Выполнение команды без параметров
15 | Когда Я выполняю команду "git"
16 | Тогда Вывод команды "git" содержит "[--version]"
17 | И Код возврата команды "git" равен 1
18 |
19 | Сценарий: Выполнение команды с параметрами
20 | Когда Я добавляю параметр "--version" для команды "git"
21 | И Я выполняю команду "git"
22 | Тогда Я сообщаю вывод команды "git"
23 | И Вывод команды "git" содержит "version"
24 | И Код возврата команды "git" равен 0
25 |
26 | Сценарий: Выполнение команды с массивом параметров
27 | Когда Я добавляю параметры для команды "oscript"
28 | | -version |
29 | | -encoding=utf-8 |
30 | И Я выполняю команду "oscript"
31 | Тогда я вижу в консоли строку подобно "(\d+\.){3}\d+"
32 |
33 | Сценарий: Выполнение команды через командный процессор системы
34 | Когда Я выполняю команду "oscript" через командный процессор системы
35 | Тогда Вывод команды "oscript" содержит "1Script Execution Engine"
36 | И Код возврата команды "oscript" равен 0
37 |
38 | Сценарий: Выполнение команды без командного процессора системы
39 | Когда Я выполняю команду "oscript" без командного процессора системы
40 | Тогда Вывод команды "oscript" содержит "1Script Execution Engine"
41 | И Код возврата команды "oscript" равен 0
42 |
43 | Сценарий: Проверка правильного кода возврата команды
44 | Когда Я устанавливаю ожидаемый код возврата 0 для команды "oscript"
45 | Когда Я выполняю команду "oscript"
46 | Тогда Код возврата команды "oscript" равен 0
47 |
48 | Сценарий: Проверка неправильного кода возврата команды
49 | Когда Я устанавливаю ожидаемый код возврата 123 для команды "oscript"
50 | Тогда Я получаю исключение при выполнении команды "oscript"
51 | И Код возврата команды "oscript" равен 0
52 |
53 | Сценарий: Проверка правильного диапазона кодов возврата команды
54 | Когда Я устанавливаю ожидаемый диапазон кодов возврата от 0 до 10 для команды "oscript"
55 | Когда Я выполняю команду "oscript"
56 | Тогда Код возврата команды "oscript" равен 0
57 |
58 | Сценарий: Выполнение команды c установленным периодом опроса завершения команды
59 | Когда Я устанавливаю период опроса завершения команды "oscript" в 1 миллисекунду
60 | И Я выполняю команду "oscript"
61 | Тогда Вывод команды "oscript" содержит "1Script Execution Engine"
62 | И Код возврата команды "oscript" равен 0
63 |
64 | Сценарий: Выполнение команды c запретом немедленного вывода команды команды
65 | Когда Я снимаю флаг показа немедленного вывода команды "oscript"
66 | И Я выполняю команду "oscript"
67 | Тогда Вывод команды "oscript" содержит "1Script Execution Engine"
68 | И Код возврата команды "oscript" равен 0
69 |
70 | Сценарий: Проверка неправильного диапазона кодов возврата команды
71 | Когда Я устанавливаю ожидаемый диапазон кодов возврата от 1 до 10 для команды "oscript"
72 | Тогда Я получаю исключение при выполнении команды "oscript"
73 | И Код возврата команды "oscript" равен 0
74 |
75 | Сценарий: Выполнение команды с выводом в отдельный лог
76 | Допустим Я создаю временный каталог и сохраняю его в контекст
77 | И Я устанавливаю временный каталог как рабочий каталог
78 | И Я установил рабочий каталог как текущий каталог
79 |
80 | Допустим Я подключаю вывод команды "oscript" в лог "ТестовыйЛог"
81 | И Я подключаю вывод в файл "лог1.Log" для лога "ТестовыйЛог"
82 | И Я добавляю параметр "-version" для команды "oscript"
83 |
84 | Когда Я выполняю команду "oscript"
85 | Тогда я не вижу в консоли строку подобно "(\d+\.){3}\d+"
86 | Тогда я не вижу в консоли вывод "ФИЧА ВыполнениеКоманды"
87 | И Код возврата команды "oscript" равен 0
88 | И Я закрываю лог "ТестовыйЛог"
89 | И Файл "лог1.Log" содержит "ФИЧА ВыполнениеКоманды"
90 |
91 | Сценарий: Выполнение команды с выводом в отдельные логи
92 | Допустим Я создаю временный каталог и сохраняю его в контекст
93 | И Я устанавливаю временный каталог как рабочий каталог
94 | И Я установил рабочий каталог как текущий каталог
95 |
96 | Допустим Я подключаю вывод команды "oscript" в лог "ТестовыйЛог"
97 | И Я подключаю вывод в файл "лог1.Log" для лога "ТестовыйЛог"
98 | И Я подключаю вывод в файл "лог2.txt" для лога "ТестовыйЛог2"
99 | Допустим Я подключаю вывод команды "oscript" в лог "ТестовыйЛог2"
100 | И Я добавляю параметр "-version" для команды "oscript"
101 |
102 | Когда Я выполняю команду "oscript"
103 | Тогда я не вижу в консоли строку подобно "(\d+\.){3}\d+"
104 | Тогда я не вижу в консоли вывод "ФИЧА ВыполнениеКоманды"
105 | И Код возврата команды "oscript" равен 0
106 | И Я закрываю лог "ТестовыйЛог"
107 | И Я закрываю лог "ТестовыйЛог2"
108 | И Файл "лог1.Log" содержит "ФИЧА ВыполнениеКоманды"
109 | И Файл "лог2.txt" содержит "ФИЧА ВыполнениеКоманды"
110 |
111 | Сценарий: Выполнение команды с выводом в отдельный лог при включенном немедленном выводом команды
112 | Допустим Я создаю временный каталог и сохраняю его в контекст
113 | И Я устанавливаю временный каталог как рабочий каталог
114 | И Я установил рабочий каталог как текущий каталог
115 |
116 | Допустим Я устанавливаю флаг показа немедленного вывода команды "oscript"
117 | Допустим Я подключаю вывод команды "oscript" в лог "ТестовыйЛог"
118 | И Я подключаю вывод в файл "лог1.Log" для лога "ТестовыйЛог"
119 | И Я добавляю параметр "-version" для команды "oscript"
120 |
121 | Когда Я выполняю команду "oscript"
122 | Тогда я не вижу в консоли строку подобно "(\d+\.){3}\d+"
123 | Тогда я не вижу в консоли вывод "ФИЧА ВыполнениеКоманды"
124 | И Код возврата команды "oscript" равен 0
125 | И Я закрываю лог "ТестовыйЛог"
126 |
127 | И Файл "лог1.Log" содержит "ФИЧА ВыполнениеКоманды"
128 |
129 | Сценарий: Выполнение команды с пробелами
130 |
131 | Дано я пропускаю этот сценарий в Linux
132 |
133 | Допустим Я создаю временный каталог и сохраняю его в контекст
134 | И Я устанавливаю временный каталог как рабочий каталог
135 | И Я установил рабочий каталог как текущий каталог
136 |
137 | Когда Я выполняю команду 'echo echo 456 > "Мой командный файл.cmd"' через командный процессор системы
138 | Когда Я выполняю команду '"Мой командный файл.cmd" "78 9"' через командный процессор системы
139 | И Вывод команды '"Мой командный файл.cmd" "78 9"' содержит "456"
140 |
--------------------------------------------------------------------------------
/features/step_definitions/ВыполнениеКоманды.os:
--------------------------------------------------------------------------------
1 | // Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd
2 | #Использовать "../.."
3 |
4 | Перем БДД; //контекст фреймворка 1bdd
5 |
6 | // Метод выдает список шагов, реализованных в данном файле-шагов
7 | Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт
8 | БДД = КонтекстФреймворкаBDD;
9 |
10 | ВсеШаги = Новый Массив;
11 |
12 | ВсеШаги.Добавить("ЯДобавляюПараметрыДляКоманды");
13 | ВсеШаги.Добавить("ЯВыполняюКомандуЧерезКомандныйПроцессорСистемы");
14 | ВсеШаги.Добавить("ЯВыполняюКомандуБезКомандногоПроцессораСистемы");
15 | ВсеШаги.Добавить("ЯУстанавливаюОжидаемыйКодВозвратаДляКоманды");
16 | ВсеШаги.Добавить("ЯПолучаюИсключениеПриВыполненииКоманды");
17 | ВсеШаги.Добавить("ЯУстанавливаюОжидаемыйДиапазонКодовВозвратаОтДоДляКоманды");
18 | ВсеШаги.Добавить("ЯУстанавливаюПериодОпросаЗавершенияКомандыВМиллисекунду");
19 | ВсеШаги.Добавить("ЯСнимаюФлагПоказаНемедленногоВыводаКоманды");
20 | ВсеШаги.Добавить("ЯПодключаюВыводКомандыВЛог");
21 | ВсеШаги.Добавить("ЯПодключаюВыводВФайлДляЛога");
22 | ВсеШаги.Добавить("ЯЗакрываюЛог");
23 | ВсеШаги.Добавить("ЯУстанавливаюФлагПоказаНемедленногоВыводаКоманды");
24 |
25 | Возврат ВсеШаги;
26 | КонецФункции
27 |
28 | // Реализация шагов
29 |
30 | // Процедура выполняется перед запуском каждого сценария
31 | Процедура ПередЗапускомСценария(Знач Узел) Экспорт
32 |
33 | КонецПроцедуры
34 |
35 | // Процедура выполняется после завершения каждого сценария
36 | Процедура ПослеЗапускаСценария(Знач Узел) Экспорт
37 |
38 | КонецПроцедуры
39 |
40 | // TODO перенести методы (2 шт) в 1bdd для исключения дублирования
41 |
42 | //Я выполняю команду "oscript" через командный процессор системы
43 | Процедура ЯВыполняюКомандуЧерезКомандныйПроцессорСистемы(Знач ИмяИлиТекстКоманды) Экспорт
44 | ВыполнитьКоманду(ИмяИлиТекстКоманды, Истина);
45 | КонецПроцедуры
46 |
47 | //Я выполняю команду "oscript" без командного процессора системы
48 | Процедура ЯВыполняюКомандуБезКомандногоПроцессораСистемы(Знач ИмяИлиТекстКоманды) Экспорт
49 | ВыполнитьКоманду(ИмяИлиТекстКоманды, Ложь);
50 | КонецПроцедуры
51 |
52 | //Я устанавливаю ожидаемый код возврата 0 для команды "oscript"
53 | Процедура ЯУстанавливаюОжидаемыйКодВозвратаДляКоманды(Знач ОжидаемыйКодВозврата, Знач ИмяИлиТекстКоманды) Экспорт
54 | Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды);
55 |
56 | Команда.УстановитьПравильныйКодВозврата(Число(ОжидаемыйКодВозврата));
57 | КонецПроцедуры
58 |
59 | //Я устанавливаю ожидаемый диапазон кодов возврата от 0 до 10 для команды "oscript"
60 | Процедура ЯУстанавливаюОжидаемыйДиапазонКодовВозвратаОтДоДляКоманды(Знач МинимальныйОжидаемыйКодВозврата,
61 | Знач МаксимальныйОжидаемыйКодВозврата, Знач ИмяИлиТекстКоманды) Экспорт
62 |
63 | Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды);
64 |
65 | Команда.УстановитьДиапазонПравильныхКодовВозврата(
66 | МинимальныйОжидаемыйКодВозврата,
67 | МаксимальныйОжидаемыйКодВозврата);
68 | КонецПроцедуры
69 |
70 | //Я получаю исключение при выполнении команды "oscript"
71 | Процедура ЯПолучаюИсключениеПриВыполненииКоманды(Знач ИмяИлиТекстКоманды) Экспорт
72 | Попытка
73 | ВыполнитьКоманду(ИмяИлиТекстКоманды, Истина);
74 | Исключение
75 | Возврат;
76 | КонецПопытки;
77 |
78 | ВызватьИсключение СтрШаблон("Не получили исключение при выполнении команды", ИмяИлиТекстКоманды);
79 | КонецПроцедуры
80 |
81 | //Я устанавливаю период опроса завершения команды "oscript" в 1 миллисекунду
82 | Процедура ЯУстанавливаюПериодОпросаЗавершенияКомандыВМиллисекунду(Знач ИмяИлиТекстКоманды, Знач ТаймаутВМиллисекундах) Экспорт
83 |
84 | Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды);
85 |
86 | Команда.УстановитьПериодОпросаЗавершения(ТаймаутВМиллисекундах);
87 | КонецПроцедуры
88 |
89 | //Я снимаю флаг показа немедленного вывода команды "oscript"
90 | Процедура ЯСнимаюФлагПоказаНемедленногоВыводаКоманды(Знач ИмяИлиТекстКоманды) Экспорт
91 | Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды);
92 |
93 | Команда.ПоказыватьВыводНемедленно(Ложь);
94 | КонецПроцедуры
95 |
96 | //Я устанавливаю флаг показа немедленного вывода команды "oscript"
97 | Процедура ЯУстанавливаюФлагПоказаНемедленногоВыводаКоманды(Знач ИмяИлиТекстКоманды) Экспорт
98 | Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды);
99 |
100 | Команда.ПоказыватьВыводНемедленно(Истина);
101 | КонецПроцедуры
102 |
103 | //Я добавляю параметры для команды "oscript"
104 | //| -version |
105 | //| -encoding=utf-8 |
106 | Процедура ЯДобавляюПараметрыДляКоманды(Знач ИмяИлиТекстКоманды, Знач ТаблицаПараметров) Экспорт
107 | //TODO перенести шаг в библиотеку 1bdd
108 | Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды);
109 |
110 | МассивПараметров = ТаблицаПараметров.ВыгрузитьКолонку(0);
111 | Команда.ДобавитьПараметры(МассивПараметров);
112 | КонецПроцедуры
113 |
114 | //Я подключаю вывод команды "oscript" в лог "ТестовыйЛог"
115 | Процедура ЯПодключаюВыводКомандыВЛог(Знач ИмяИлиТекстКоманды, Знач ИмяЛога) Экспорт
116 | Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды);
117 | Команда.ДобавитьЛогВыводаКоманды(ИмяЛога);
118 |
119 | НовыйЛог = Логирование.ПолучитьЛог(ИмяЛога);
120 | НовыйЛог.УстановитьРаскладку(ЭтотОбъект);
121 | КонецПроцедуры
122 |
123 | //Я подключаю вывод в файл "лог1.Log" для лога "ТестовыйЛог"
124 | Процедура ЯПодключаюВыводВФайлДляЛога(Знач ПутьФайла, Знач ИмяЛога) Экспорт
125 | НовыйЛог = Логирование.ПолучитьЛог(ИмяЛога);
126 |
127 | ФайлЖурнала = Новый ВыводЛогаВФайл;
128 | ФайлЖурнала.ОткрытьФайл(ПутьФайла);
129 |
130 | НовыйЛог.ДобавитьСпособВывода(ФайлЖурнала);
131 |
132 | КонецПроцедуры
133 |
134 | //Я закрываю лог "ТестовыйЛог"
135 | Процедура ЯЗакрываюЛог(Знач ИмяЛога) Экспорт
136 | НовыйЛог = Логирование.ПолучитьЛог(ИмяЛога);
137 | НовыйЛог.Закрыть();
138 | КонецПроцедуры
139 |
140 | // { Служебные функции
141 |
142 | Функция Форматировать(Знач Уровень, Знач Сообщение) Экспорт
143 |
144 | Возврат СтрШаблон("ФИЧА ВыполнениеКоманды: %1 - %2", УровниЛога.НаименованиеУровня(Уровень), Сообщение);
145 |
146 | КонецФункции
147 |
148 | Процедура ВыполнитьКоманду(Знач ИмяИлиТекстКоманды, Знач ИспользуемКомандныйПроцессор = Истина)
149 | Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды);
150 | Команда.УстановитьИсполнениеЧерезКомандыСистемы(ИспользуемКомандныйПроцессор);
151 |
152 | Команда.Исполнить();
153 | КонецПроцедуры
154 |
155 | //TODO дубль кода с 1bdd::ВыполнениеКоманд.os
156 | Функция ПолучитьКомандуИзКонтекста(Знач ИмяКоманды)
157 |
158 | КлючКонтекста = КлючКоманды(ИмяКоманды);
159 | Команда = БДД.ПолучитьИзКонтекста(КлючКонтекста);
160 |
161 | Если Не ЗначениеЗаполнено(Команда) Тогда
162 | Команда = Новый Команда;
163 | Команда.УстановитьСтрокуЗапуска(ИмяКоманды);
164 | БДД.СохранитьВКонтекст(КлючКонтекста, Команда);
165 | КонецЕсли;
166 |
167 | Возврат Команда;
168 | КонецФункции
169 |
170 | //TODO дубль кода с 1bdd::ВыполнениеКоманд.os
171 | Функция КлючКоманды(Знач ИмяКоманды)
172 | Возврат "Команда-" + ИмяКоманды;
173 | КонецФункции
174 |
175 | //}
176 |
--------------------------------------------------------------------------------
/src/КомандныйФайл.os:
--------------------------------------------------------------------------------
1 | //////////////////////////////////////////////////////////////////////////
2 | // Работа с командными файлами
3 |
4 | #Использовать tempfiles
5 |
6 | Перем ЗаписьТекста;
7 | Перем ПутьКоманды;
8 | Перем Команда;
9 | Перем ТекстФайла;
10 | Перем Приложение;
11 |
12 | Перем ЭтоWindows;
13 | Перем Лог;
14 | Перем НемедленныйВывод;
15 | Перем КодировкаВывода;
16 |
17 | // Получить имя лога продукта
18 | //
19 | // Возвращаемое значение:
20 | // Строка - имя лога продукта
21 | //
22 | Функция ИмяЛога() Экспорт
23 | Возврат "oscript.lib.commands";
24 | КонецФункции
25 |
26 | // Установить путь к приложению.
27 | //
28 | // Параметры:
29 | // ПутьПриложения - Путь приложения (Строка)
30 | // Например для запуска скриптов PowerShell
31 | // Для 64bit PowerShell если стоит 64 битная система или 32bit PowerShell, если стоит 32 битная система
32 | // "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
33 | // Для 32bit PowerShell на 64 битных системах находится в папке:
34 | // "C:\Windows\syswow64\Windowspowershell\v1.0\powershell.exe"
35 | //
36 | Процедура УстановитьПриложение(Знач ПутьПриложения) Экспорт
37 | Приложение = ПутьПриложения;
38 | КонецПроцедуры // УстановитьПриложение()
39 |
40 | // Получить путь командного файла
41 | //
42 | // Возвращаемое значение:
43 | // Строка - путь командного файла
44 | //
45 | Функция ПолучитьПуть() Экспорт
46 | Возврат ПутьКоманды;
47 | КонецФункции
48 |
49 | // Получить вывод выполненной команды.
50 | //
51 | // Возвращаемое значение:
52 | // Строка - Вывод команды
53 | //
54 | Функция ПолучитьВывод() Экспорт
55 | ПроверитьЧтоКомандаВыполнена();
56 | Возврат Команда.ПолучитьВывод();
57 | КонецФункции
58 |
59 | // Установить кодировку вывода для выполнения команды.
60 | //
61 | // Параметры:
62 | // Строка, Неопределено - кодировка вывода
63 | // Если Неопределено, кодировка сбрасывается и используется значение по умолчанию от операционной системы
64 | //
65 | Процедура УстановитьКодировкуВывода(Знач НоваяКодировкаВывода) Экспорт
66 | КодировкаВывода = НоваяКодировкаВывода;
67 | КонецПроцедуры
68 |
69 | // Получить кодировка вывода выполняемой команды.
70 | //
71 | // Возвращаемое значение:
72 | // Строка - кодировка вывода команды
73 | //
74 | Функция ПолучитьКодировкуВывода() Экспорт
75 | Возврат КодировкаВывода;
76 | КонецФункции
77 |
78 | // Получить код возврата выполненной команды.
79 | //
80 | // Возвращаемое значение:
81 | // Число - код возврата команды
82 | //
83 | Функция ПолучитьКодВозврата() Экспорт
84 | ПроверитьЧтоКомандаВыполнена();
85 | Возврат Команда.ПолучитьКодВозврата();
86 | КонецФункции
87 |
88 | // Создать новый командный файл по переданному пути или создать новый временный файл
89 | //
90 | // Параметры:
91 | // Путь - Строка - путь создаваемого файла. Необязательное значение.
92 | // Если не задан, создается временный файл в каталоге временных файлов
93 | // Расширение - Строка - расширение исполняемого командного файла.
94 | // Если не задано, подставляется ".bat" для Windows или ".sh" для Linux.
95 | //
96 | // Возвращаемое значение:
97 | // Строка - Путь созданного файла
98 | //
99 | Функция Создать(Знач Путь = "", Знач Расширение="") Экспорт
100 |
101 | Если ПустаяСтрока(Расширение) Тогда
102 | Расширение = ?(ЭтоWindows, ".bat", ".sh");
103 | КонецЕсли;
104 | Если ПустаяСтрока(Путь) Тогда
105 | ПутьКоманды = ВременныеФайлы.НовоеИмяФайла(Расширение);
106 | Лог.Отладка("КомандныйФайл: задаю временный путь командного файла <%1>.", ПутьКоманды);
107 | Иначе
108 | ПутьКоманды = Путь;
109 | Лог.Отладка("КомандныйФайл: использую путь командного файла <%1>.", ПутьКоманды);
110 | КонецЕсли;
111 | Кодировка = ?(ЭтоWindows, "cp866", КодировкаТекста.UTF8NoBOM);
112 | Если ЭтоWindows Тогда
113 | ЗаписьТекста = Новый ЗаписьТекста(ПутьКоманды, Кодировка);
114 | Иначе
115 | ЗаписьТекста = Новый ЗаписьТекста(ПутьКоманды, Кодировка, , , Символы.ПС);
116 | КонецЕсли;
117 |
118 | ТекстФайла = "";
119 |
120 | Возврат ПутьКоманды;
121 |
122 | КонецФункции
123 |
124 | // Добавить очередную команду в командный файл
125 | //
126 | // Параметры:
127 | // Команда - Строка - очередная команда
128 | //
129 | Процедура ДобавитьКоманду(Знач Команда) Экспорт
130 | ПроверитьЧтоФайлОткрыт();
131 | ЗаписьТекста.ЗаписатьСтроку(Команда);
132 | ТекстФайла = ТекстФайла + Команда + Символы.ПС;
133 | КонецПроцедуры
134 |
135 | // Выполнить командный файл и вернуть код возврата
136 | //
137 | // Возвращаемое значение:
138 | // Число - код возврата
139 | //
140 | Функция Исполнить() Экспорт
141 |
142 | Закрыть();
143 |
144 | Команда = Новый Команда;
145 | Команда.УстановитьКодировкуВывода(КодировкаВывода);
146 | Команда.ПоказыватьВыводНемедленно(НемедленныйВывод);
147 |
148 | Если ЗначениеЗаполнено(Приложение) Тогда
149 | СтрокаЗапуска = """%1""";
150 | ИначеЕсли ЭтоWindows Тогда
151 | Приложение = "cmd.exe";
152 | СтрокаЗапуска = "/C ""%1""";
153 | Иначе
154 | Приложение = "sh";
155 | СтрокаЗапуска = "'%1'";
156 | КонецЕсли;
157 | Команда.УстановитьКоманду(Приложение);
158 | Команда.ДобавитьПараметр(СтрШаблон(СтрокаЗапуска, ПутьКоманды));
159 |
160 | КодВозврата = Команда.Исполнить();
161 |
162 | Возврат КодВозврата;
163 |
164 | КонецФункции
165 |
166 | // Завершает запись командного файла
167 | //
168 | // Возвращаемое значение:
169 | // Строка - путь командного файла
170 | //
171 | Функция Закрыть() Экспорт
172 |
173 | Если ЗаписьТекста <> Неопределено Тогда
174 | ЗаписьТекста.Закрыть();
175 | ЗаписьТекста = Неопределено;
176 | КонецЕсли;
177 |
178 | Возврат ПутьКоманды;
179 |
180 | КонецФункции
181 |
182 | // Получить текст командного файла
183 | //
184 | // Возвращаемое значение:
185 | // Строка - текст командного файла
186 | //
187 | Функция ПолучитьТекстФайла() Экспорт
188 | Возврат ТекстФайла;
189 | КонецФункции
190 |
191 | // Управляет мгновенным выводом лога команды
192 | //
193 | // Параметры:
194 | // НемедленныйПоказ - Булево
195 | // Ложь: показывает вывод только после завершения выполнения команды
196 | // Истина: показ вывода выполняется почти сразу, после появления очередной порции сообщений от команды
197 | //
198 | Процедура ПоказыватьВыводНемедленно(Знач НемедленныйПоказ) Экспорт
199 | НемедленныйВывод = НемедленныйПоказ;
200 | КонецПроцедуры
201 |
202 | // Получить строку перенаправления ввода-вывода "> файл"
203 | //
204 | // Параметры:
205 | // ИмяФайлаПриемника - Строка - имя файла для перенаправления вывода
206 | // УчитыватьStdErr - Булево - Если Истина, писать ошибки в этот же файл
207 | // ПерезаписыватьФайл - Булево - Если Истина, файл предварительно очищается
208 | //
209 | // Возвращаемое значение:
210 | // Строка - строка перенаправления ввода-вывода "> файл"
211 | //
212 | Функция СуффиксПеренаправленияВывода(Знач ИмяФайлаПриемника, Знач УчитыватьStdErr = Истина,
213 | Знач ПерезаписыватьФайл = Истина) Экспорт
214 |
215 | Рез = "> """ + ИмяФайлаПриемника + """" + ?(УчитыватьStdErr, " 2>&1", "");
216 | Если Не ПерезаписыватьФайл Тогда
217 | Рез = ">" + Рез;
218 | КонецЕсли;
219 | Возврат Рез;
220 | КонецФункции
221 |
222 | //////////////////////////////////////////////////////////////////////////
223 | // Служебные процедуры и функции
224 |
225 | Процедура ПроверитьЧтоФайлОткрыт()
226 | Если ЗаписьТекста = Неопределено Тогда
227 | Создать();
228 | КонецЕсли;
229 | КонецПроцедуры
230 |
231 | Процедура ПроверитьЧтоКомандаВыполнена()
232 | Если Не ЗначениеЗаполнено(Команда) Тогда
233 | ВызватьИсключение СтрШаблон("Команда еще не выполнялась. <%1>", ПутьКоманды);
234 | КонецЕсли;
235 | КонецПроцедуры
236 |
237 | // Инициализация работы библиотеки.
238 | // Задает минимальные настройки.
239 | //
240 | Процедура Инициализация()
241 |
242 | Лог = Логирование.ПолучитьЛог(ИмяЛога());
243 |
244 | СистемнаяИнформация = Новый СистемнаяИнформация;
245 | ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0;
246 |
247 | ТекстФайла = "";
248 | НемедленныйВывод = Ложь;
249 | КодировкаВывода = КодировкаТекста.OEM;
250 |
251 | Создать();
252 | КонецПроцедуры
253 |
254 | Инициализация();
255 |
--------------------------------------------------------------------------------
/.vscode/tasks.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "2.0.0",
3 | "_runner": "terminal",
4 | "windows": {
5 | "command": "cmd",
6 | "args": ["/c", "chcp", "65001", "&&"]
7 | // "args": ["/c", "chcp 65001 ;"]
8 | },
9 | "linux": {
10 | "command": "sh",
11 | "args": ["-c"]
12 | },
13 | // "isShellCommand": true,
14 | // "showOutput": "silent",
15 | "tasks": [
16 | {
17 | "taskName": "Testing project",
18 | "args": [
19 | "1testrunner",
20 | "-runall",
21 | "${workspaceRoot}/tests"
22 | ],
23 | "echoCommand": true,
24 | "showOutput": "always",
25 | // "suppressTaskName": true,
26 | // "isBuildCommand": false,
27 | "isTestCommand": false,
28 | "problemMatcher": {
29 | "fileLocation": "absolute",
30 | "pattern": {
31 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)",
32 | "file": 1,
33 | "location": 2,
34 | "message": 3
35 | }
36 | }
37 | },
38 | {
39 | "taskName": "Testing current test-file",
40 | "args": [
41 | "1testrunner",
42 | "-run",
43 | "${file}"
44 | ],
45 | "echoCommand": true,
46 | "showOutput": "always",
47 | "suppressTaskName": true,
48 | "isBuildCommand": false,
49 | "isTestCommand": true,
50 | "problemMatcher": {
51 | "fileLocation": "absolute",
52 | "pattern": {
53 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)",
54 | "file": 1,
55 | "location": 2,
56 | "message": 3
57 | }
58 | }
59 | },
60 | {
61 | "taskName": "Opm: package build",
62 | "args": [
63 | "opm",
64 | "build",
65 | "${workspaceRoot}"
66 | ],
67 | "echoCommand": true,
68 | "showOutput": "always",
69 | "suppressTaskName": true,
70 | "isBuildCommand": false
71 | },
72 | {
73 | "taskName": "Exec all features",
74 | "args": [
75 | "1bdd",
76 | "${workspaceRoot}/features",
77 | "-out",
78 | "${workspaceRoot}/exec.log"
79 | ],
80 | "echoCommand": true,
81 | "showOutput": "always",
82 | "suppressTaskName": true,
83 | "isBuildCommand": true,
84 | "isTestCommand": false,
85 | "problemMatcher": {
86 | "fileLocation": "absolute",
87 | "pattern": {
88 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)",
89 | "file": 1,
90 | "location": 2,
91 | "message": 3
92 | }
93 | }
94 | },
95 | {
96 | "taskName": "Exec feature",
97 | "args": [
98 | "1bdd",
99 | "${file}",
100 | "-fail-fast",
101 | "-out",
102 | "${workspaceRoot}/exec.log"
103 | ],
104 | "echoCommand": true,
105 | "showOutput": "always",
106 | "suppressTaskName": true,
107 | "isBuildCommand": false,
108 | "isTestCommand": true,
109 | "problemMatcher": {
110 | "fileLocation": "absolute",
111 | "pattern": [
112 | {
113 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)",
114 | "file": 1,
115 | "location": 2,
116 | "message": 3
117 | }
118 | ]
119 | }
120 | },
121 | {
122 | "taskName": "Exec feature for current step def",
123 | "args": [
124 | "1bdd",
125 | "${fileDirname}/../${fileBasenameNoExtension}.feature",
126 | "-fail-fast",
127 | "-out",
128 | "${workspaceRoot}/exec.log"
129 | ],
130 | "echoCommand": true,
131 | "showOutput": "always",
132 | "suppressTaskName": true,
133 | "isBuildCommand": false,
134 | "isTestCommand": true,
135 | "problemMatcher": {
136 | "fileLocation": "absolute",
137 | "pattern": [
138 | {
139 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)",
140 | "file": 1,
141 | "location": 2,
142 | "message": 3
143 | }
144 | ]
145 | }
146 | },
147 | {
148 | "taskName": "Exec feature + debug",
149 | "args": [
150 | "1bdd",
151 | "${file}",
152 | "-fail-fast",
153 | "-verbose",
154 | "on",
155 | "-out",
156 | "${workspaceRoot}/exec.log"
157 | ],
158 | "echoCommand": true,
159 | "showOutput": "always",
160 | "suppressTaskName": true,
161 | // "isBuildCommand": false,
162 | "isTestCommand": false,
163 | "problemMatcher": {
164 | "fileLocation": "absolute",
165 | "pattern": {
166 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)",
167 | "file": 1,
168 | "location": 2,
169 | "message": 3
170 | }
171 | }
172 | },
173 | {
174 | "taskName": "Generate feature steps",
175 | "args": [
176 | "1bdd",
177 | "gen",
178 | "${file}",
179 | "-out",
180 | "${workspaceRoot}/exec.log"
181 | ],
182 | "echoCommand": true,
183 | "showOutput": "always",
184 | "suppressTaskName": true,
185 | "isBuildCommand": false,
186 | "isTestCommand": false,
187 | "problemMatcher": {
188 | "fileLocation": "absolute",
189 | "pattern": {
190 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)",
191 | "file": 1,
192 | "location": 2,
193 | "message": 3
194 | }
195 | }
196 | },
197 | {
198 | "taskName": "OneScript: compile",
199 | "args": [
200 | "oscript",
201 | "-encoding=utf-8",
202 | "-compile",
203 | "${file}"
204 | ],
205 | "echoCommand": true,
206 | "showOutput": "always",
207 | "suppressTaskName": true,
208 | "isBuildCommand": false
209 | },
210 | {
211 | "taskName": "OneScript: check",
212 | "args": [
213 | "oscript",
214 | "-encoding=utf-8",
215 | "-check",
216 | "${file}"
217 | ],
218 | "echoCommand": true,
219 | "showOutput": "always",
220 | "suppressTaskName": true,
221 | "isBuildCommand": false
222 | },
223 | {
224 | "taskName": "OneScript: make",
225 | "args": [
226 | "oscript",
227 | "-encoding=utf-8",
228 | "-make",
229 | "${file}",
230 | "${fileBasename}.exe"
231 | ],
232 | "echoCommand": true,
233 | "showOutput": "always",
234 | "suppressTaskName": true,
235 | "isBuildCommand": false
236 | },
237 | {
238 | "taskName": "OneScript: run",
239 | "args": [
240 | "oscript",
241 | "-encoding=utf-8",
242 | "${file}"
243 | ],
244 | "echoCommand": true,
245 | "showOutput": "always",
246 | "suppressTaskName": true,
247 | "isBuildCommand": true,
248 | "problemMatcher": {
249 | "fileLocation": "absolute",
250 | "pattern": {
251 | "regexp": "^{Модуль\\s+(.*)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+(.*)}$",
252 | "file": 1,
253 | "location": 2,
254 | "message": 3
255 | }
256 | }
257 | }
258 | ]
259 | }
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | Apache License
2 | ==============
3 |
4 | _Version 2.0, January 2004_
5 | _<>_
6 |
7 | ### Terms and Conditions for use, reproduction, and distribution
8 |
9 | #### 1. Definitions
10 |
11 | “License” shall mean the terms and conditions for use, reproduction, and
12 | distribution as defined by Sections 1 through 9 of this document.
13 |
14 | “Licensor” shall mean the copyright owner or entity authorized by the copyright
15 | owner that is granting the License.
16 |
17 | “Legal Entity” shall mean the union of the acting entity and all other entities
18 | that control, are controlled by, or are under common control with that entity.
19 | For the purposes of this definition, “control” means **(i)** the power, direct or
20 | indirect, to cause the direction or management of such entity, whether by
21 | contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the
22 | outstanding shares, or **(iii)** beneficial ownership of such entity.
23 |
24 | “You” (or “Your”) shall mean an individual or Legal Entity exercising
25 | permissions granted by this License.
26 |
27 | “Source” form shall mean the preferred form for making modifications, including
28 | but not limited to software source code, documentation source, and configuration
29 | files.
30 |
31 | “Object” form shall mean any form resulting from mechanical transformation or
32 | translation of a Source form, including but not limited to compiled object code,
33 | generated documentation, and conversions to other media types.
34 |
35 | “Work” shall mean the work of authorship, whether in Source or Object form, made
36 | available under the License, as indicated by a copyright notice that is included
37 | in or attached to the work (an example is provided in the Appendix below).
38 |
39 | “Derivative Works” shall mean any work, whether in Source or Object form, that
40 | is based on (or derived from) the Work and for which the editorial revisions,
41 | annotations, elaborations, or other modifications represent, as a whole, an
42 | original work of authorship. For the purposes of this License, Derivative Works
43 | shall not include works that remain separable from, or merely link (or bind by
44 | name) to the interfaces of, the Work and Derivative Works thereof.
45 |
46 | “Contribution” shall mean any work of authorship, including the original version
47 | of the Work and any modifications or additions to that Work or Derivative Works
48 | thereof, that is intentionally submitted to Licensor for inclusion in the Work
49 | by the copyright owner or by an individual or Legal Entity authorized to submit
50 | on behalf of the copyright owner. For the purposes of this definition,
51 | “submitted” means any form of electronic, verbal, or written communication sent
52 | to the Licensor or its representatives, including but not limited to
53 | communication on electronic mailing lists, source code control systems, and
54 | issue tracking systems that are managed by, or on behalf of, the Licensor for
55 | the purpose of discussing and improving the Work, but excluding communication
56 | that is conspicuously marked or otherwise designated in writing by the copyright
57 | owner as “Not a Contribution.”
58 |
59 | “Contributor” shall mean Licensor and any individual or Legal Entity on behalf
60 | of whom a Contribution has been received by Licensor and subsequently
61 | incorporated within the Work.
62 |
63 | #### 2. Grant of Copyright License
64 |
65 | Subject to the terms and conditions of this License, each Contributor hereby
66 | grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
67 | irrevocable copyright license to reproduce, prepare Derivative Works of,
68 | publicly display, publicly perform, sublicense, and distribute the Work and such
69 | Derivative Works in Source or Object form.
70 |
71 | #### 3. Grant of Patent License
72 |
73 | Subject to the terms and conditions of this License, each Contributor hereby
74 | grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
75 | irrevocable (except as stated in this section) patent license to make, have
76 | made, use, offer to sell, sell, import, and otherwise transfer the Work, where
77 | such license applies only to those patent claims licensable by such Contributor
78 | that are necessarily infringed by their Contribution(s) alone or by combination
79 | of their Contribution(s) with the Work to which such Contribution(s) was
80 | submitted. If You institute patent litigation against any entity (including a
81 | cross-claim or counterclaim in a lawsuit) alleging that the Work or a
82 | Contribution incorporated within the Work constitutes direct or contributory
83 | patent infringement, then any patent licenses granted to You under this License
84 | for that Work shall terminate as of the date such litigation is filed.
85 |
86 | #### 4. Redistribution
87 |
88 | You may reproduce and distribute copies of the Work or Derivative Works thereof
89 | in any medium, with or without modifications, and in Source or Object form,
90 | provided that You meet the following conditions:
91 |
92 | * **(a)** You must give any other recipients of the Work or Derivative Works a copy of
93 | this License; and
94 | * **(b)** You must cause any modified files to carry prominent notices stating that You
95 | changed the files; and
96 | * **(c)** You must retain, in the Source form of any Derivative Works that You distribute,
97 | all copyright, patent, trademark, and attribution notices from the Source form
98 | of the Work, excluding those notices that do not pertain to any part of the
99 | Derivative Works; and
100 | * **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any
101 | Derivative Works that You distribute must include a readable copy of the
102 | attribution notices contained within such NOTICE file, excluding those notices
103 | that do not pertain to any part of the Derivative Works, in at least one of the
104 | following places: within a NOTICE text file distributed as part of the
105 | Derivative Works; within the Source form or documentation, if provided along
106 | with the Derivative Works; or, within a display generated by the Derivative
107 | Works, if and wherever such third-party notices normally appear. The contents of
108 | the NOTICE file are for informational purposes only and do not modify the
109 | License. You may add Your own attribution notices within Derivative Works that
110 | You distribute, alongside or as an addendum to the NOTICE text from the Work,
111 | provided that such additional attribution notices cannot be construed as
112 | modifying the License.
113 |
114 | You may add Your own copyright statement to Your modifications and may provide
115 | additional or different license terms and conditions for use, reproduction, or
116 | distribution of Your modifications, or for any such Derivative Works as a whole,
117 | provided Your use, reproduction, and distribution of the Work otherwise complies
118 | with the conditions stated in this License.
119 |
120 | #### 5. Submission of Contributions
121 |
122 | Unless You explicitly state otherwise, any Contribution intentionally submitted
123 | for inclusion in the Work by You to the Licensor shall be under the terms and
124 | conditions of this License, without any additional terms or conditions.
125 | Notwithstanding the above, nothing herein shall supersede or modify the terms of
126 | any separate license agreement you may have executed with Licensor regarding
127 | such Contributions.
128 |
129 | #### 6. Trademarks
130 |
131 | This License does not grant permission to use the trade names, trademarks,
132 | service marks, or product names of the Licensor, except as required for
133 | reasonable and customary use in describing the origin of the Work and
134 | reproducing the content of the NOTICE file.
135 |
136 | #### 7. Disclaimer of Warranty
137 |
138 | Unless required by applicable law or agreed to in writing, Licensor provides the
139 | Work (and each Contributor provides its Contributions) on an “AS IS” BASIS,
140 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
141 | including, without limitation, any warranties or conditions of TITLE,
142 | NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
143 | solely responsible for determining the appropriateness of using or
144 | redistributing the Work and assume any risks associated with Your exercise of
145 | permissions under this License.
146 |
147 | #### 8. Limitation of Liability
148 |
149 | In no event and under no legal theory, whether in tort (including negligence),
150 | contract, or otherwise, unless required by applicable law (such as deliberate
151 | and grossly negligent acts) or agreed to in writing, shall any Contributor be
152 | liable to You for damages, including any direct, indirect, special, incidental,
153 | or consequential damages of any character arising as a result of this License or
154 | out of the use or inability to use the Work (including but not limited to
155 | damages for loss of goodwill, work stoppage, computer failure or malfunction, or
156 | any and all other commercial damages or losses), even if such Contributor has
157 | been advised of the possibility of such damages.
158 |
159 | #### 9. Accepting Warranty or Additional Liability
160 |
161 | While redistributing the Work or Derivative Works thereof, You may choose to
162 | offer, and charge a fee for, acceptance of support, warranty, indemnity, or
163 | other liability obligations and/or rights consistent with this License. However,
164 | in accepting such obligations, You may act only on Your own behalf and on Your
165 | sole responsibility, not on behalf of any other Contributor, and only if You
166 | agree to indemnify, defend, and hold each Contributor harmless for any liability
167 | incurred by, or claims asserted against, such Contributor by reason of your
168 | accepting any such warranty or additional liability.
169 |
170 | _END OF TERMS AND CONDITIONS_
171 |
172 | ### APPENDIX: How to apply the Apache License to your work
173 |
174 | To apply the Apache License to your work, attach the following boilerplate
175 | notice, with the fields enclosed by brackets `[]` replaced with your own
176 | identifying information. (Don't include the brackets!) The text should be
177 | enclosed in the appropriate comment syntax for the file format. We also
178 | recommend that a file or class name and description of purpose be included on
179 | the same “printed page” as the copyright notice for easier identification within
180 | third-party archives.
181 |
182 | Copyright [yyyy] [name of copyright owner]
183 |
184 | Licensed under the Apache License, Version 2.0 (the "License");
185 | you may not use this file except in compliance with the License.
186 | You may obtain a copy of the License at
187 |
188 | http://www.apache.org/licenses/LICENSE-2.0
189 |
190 | Unless required by applicable law or agreed to in writing, software
191 | distributed under the License is distributed on an "AS IS" BASIS,
192 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
193 | See the License for the specific language governing permissions and
194 | limitations under the License.
195 |
--------------------------------------------------------------------------------
/src/Команда.os:
--------------------------------------------------------------------------------
1 | //////////////////////////////////////////////////////////////////////////
2 | // Работа с командными файлами
3 |
4 | #Использовать logos
5 | #Использовать asserts
6 |
7 |
8 | Перем Приложение;
9 | Перем ИспользуетсяЕдинаяСтрокаЗапуска;
10 | Перем Параметры;
11 | Перем РабочийКаталог;
12 | Перем ВыводКоманды;
13 | Перем КодировкаВывода;
14 | Перем КодВозврата;
15 | Перем ИспользуемКомандныйПроцессор;
16 | Перем ПроверяемКодВозврата;
17 | Перем МинимальныйОжидаемыйКодВозврата;
18 | Перем МаксимальныйОжидаемыйКодВозврата;
19 | Перем ПериодОпросаВМиллисекундах;
20 | Перем НемедленныйВывод;
21 | Перем ПодключенныеЛоги;
22 | Перем ОбработчикОжиданияПроцесса;
23 | Перем ДополнительныеПараметрыОбработчика;
24 | Перем ПерехватыватьПотоки;
25 |
26 | Перем ВерсияБольшеИлиРавна21;
27 | Перем ЭтоWindows;
28 | Перем Лог;
29 |
30 | Перем ПеременныеСредыПроцесса;
31 |
32 | // Выполнение произвольной команды
33 | //
34 | // Возвращаемое значение:
35 | // Число - код возврата команды
36 | //
37 | Функция Исполнить() Экспорт
38 |
39 | ПроверитьВозможностьВыполненияКоманды();
40 |
41 | КодВозврата = ЗапуститьИПодождать();
42 |
43 | Лог.Отладка("Код возврата равен %1", КодВозврата);
44 | Возврат КодВозврата;
45 |
46 | КонецФункции
47 |
48 | // Запуск на выполнение процесса
49 | //
50 | // Возвращаемое значение:
51 | // Процесс - объект класса Процесс
52 | //
53 | Функция ЗапуститьПроцесс() Экспорт
54 |
55 | ПроверитьВозможностьВыполненияКоманды();
56 |
57 | Процесс = ЗапуститьПроцессКоманды();
58 |
59 | Лог.Отладка("Запущен процесс с идентификатором <%1>", Процесс.Идентификатор);
60 |
61 | Возврат Процесс;
62 |
63 | КонецФункции
64 |
65 | // Получить имя лога продукта
66 | //
67 | // Возвращаемое значение:
68 | // Строка - имя лога продукта
69 | //
70 | Функция ИмяЛога() Экспорт
71 | Возврат "oscript.lib.commands";
72 | КонецФункции
73 |
74 | // Установить путь команды.
75 | // Если в пути команды есть пробелы, они обрамляются кавычками
76 | // ВАЖНО: метод принимает именно путь к приложению,
77 | // параметры приложения здесь передавать не следует!!
78 | // Для передачи параметров нужно использовать метод "УстановитьСтрокуЗапуска"
79 | //
80 | //
81 | // Параметры:
82 | // ПутьКоманды - Путь команды (Строка)
83 | //
84 | Процедура УстановитьКоманду(Знач ПутьКоманды) Экспорт
85 | Приложение = ПутьКоманды;
86 | ИспользуетсяЕдинаяСтрокаЗапуска = Ложь;
87 | КонецПроцедуры
88 |
89 | // Установить строку запуска команды.
90 | // В этом случае обрамления кавычками не выполняется.
91 | //
92 | // Параметры:
93 | // СтрокаЗапуска - строка запуска команды (Строка)
94 | //
95 | Процедура УстановитьСтрокуЗапуска(Знач СтрокаЗапуска) Экспорт
96 | Приложение = СтрокаЗапуска;
97 | ИспользуетсяЕдинаяСтрокаЗапуска = Истина;
98 | КонецПроцедуры
99 |
100 | // Получить путь команды.
101 | //
102 | // Возвращаемое значение:
103 | // Строка - Путь команды
104 | //
105 | Функция ПолучитьКоманду() Экспорт
106 | Возврат Приложение;
107 | КонецФункции
108 |
109 | // Устанавливает переменные среды для процесса
110 | //
111 | // Параметры:
112 | // ППеременныеСредыПроцесса - Соответствие - где ключ имя переменной, а значение - значение переменной
113 | //
114 | Процедура УстановитьПеременныеСреды(ППеременныеСредыПроцесса) Экспорт
115 | ПеременныеСредыПроцесса = ППеременныеСредыПроцесса;
116 | КонецПроцедуры
117 |
118 | // Устанавливает признак необходимости перехватывать потоки
119 | // по умолчанию потоки всегда перехватываются
120 | //
121 | // Параметры:
122 | // ППерехватыватьПотоки - Булево - признак необходимости перехвата потоков процесса
123 | //
124 | Процедура ПерехватыватьПотоки(ППерехватыватьПотоки) Экспорт
125 | ПерехватыватьПотоки = ППерехватыватьПотоки;
126 | КонецПроцедуры
127 |
128 | // Добавить параметр команды.
129 | //
130 | // Параметры:
131 | // Строка - новый единичный параметр или все параметры в одной строке
132 | //
133 | Процедура ДобавитьПараметр(Знач Параметр) Экспорт
134 | Параметры.Добавить(Параметр);
135 | КонецПроцедуры
136 |
137 | // Добавить параметры команды.
138 | //
139 | // Параметры:
140 | // Массив - массив параметров
141 | //
142 | Процедура ДобавитьПараметры(Знач МассивПараметров) Экспорт
143 | Для каждого Параметр Из МассивПараметров Цикл
144 | Параметры.Добавить(Параметр);
145 | КонецЦикла;
146 | КонецПроцедуры
147 |
148 | // Установить новые параметры команды.
149 | // Может использовать для очистки параметров. Для этого нужно передать пустую строку
150 | //
151 | // Параметры:
152 | // Строка - параметры в одной строке
153 | //
154 | Процедура УстановитьПараметры(Знач СтрокаПараметров) Экспорт
155 | Параметры = Новый Массив;
156 | Параметры.Добавить(СтрокаПараметров);
157 | КонецПроцедуры
158 |
159 | // Получить параметры команды.
160 | //
161 | // Возвращаемое значение:
162 | // Массив - Параметры команды
163 | //
164 | Функция ПолучитьПараметры() Экспорт
165 | Возврат Параметры;
166 | КонецФункции
167 |
168 | // Получить вывод выполненной команды.
169 | //
170 | // Возвращаемое значение:
171 | // Строка - Вывод команды
172 | //
173 | Функция ПолучитьВывод() Экспорт
174 | Возврат ВыводКоманды;
175 | КонецФункции
176 |
177 | // Получить код возврата выполненной команды.
178 | //
179 | // Возвращаемое значение:
180 | // Число - код возврата команды
181 | //
182 | Функция ПолучитьКодВозврата() Экспорт
183 | Возврат КодВозврата;
184 | КонецФункции
185 |
186 | // Управляет мгновенным выводом лога команды
187 | //
188 | // Параметры:
189 | // НемедленныйПоказ - Булево
190 | // Ложь: показывает вывод только после завершения выполнения команды
191 | // Истина: показ вывода выполняется почти сразу, после появления очередной порции сообщений от команды
192 | //
193 | Процедура ПоказыватьВыводНемедленно(Знач НемедленныйПоказ) Экспорт
194 | НемедленныйВывод = НемедленныйПоказ;
195 | КонецПроцедуры
196 |
197 | // Устанавливает передачу вывода команды в дополнительный лог
198 | //
199 | // Параметры:
200 | // ИмяЛогаИлиЛог - <Строка, Лог> - имя лога или объект лога
201 | //
202 | Процедура ДобавитьЛогВыводаКоманды(Знач ИмяЛогаИлиЛог) Экспорт
203 |
204 | НовыйЛог = ИмяЛогаИлиЛог;
205 | Если ТипЗнч(ИмяЛогаИлиЛог) = Тип("Строка") Тогда
206 | НовыйЛог = Логирование.ПолучитьЛог(ИмяЛогаИлиЛог);
207 | КонецЕсли;
208 |
209 | ПодключенныеЛоги.Добавить(НовыйЛог);
210 |
211 | КонецПроцедуры
212 |
213 | // Устанавливает обработчик ожидания для процесса
214 | //
215 | // Параметры:
216 | // Обработчик - Произвольный - класс реализующих метод <ОбработкаОжиданияПроцесса>
217 | // ППериодОпросаВМиллисекундах - Число - период вызова обработчика ожидания, мс (по умолчанию 5000)
218 | // ДополнительныеПараметры - Структура - дополнительные параметры передаваемые в обработчик ожидания
219 | //
220 | Процедура УстановитьОбработчикОжидания(Обработчик, Знач ППериодОпросаВМиллисекундах = 5000,
221 | ДополнительныеПараметры = Неопределено) Экспорт
222 |
223 | ОбработчикОжиданияПроцесса = Обработчик;
224 | ПериодОпросаВМиллисекундах = ППериодОпросаВМиллисекундах;
225 | ДополнительныеПараметрыОбработчика = ДополнительныеПараметры;
226 | КонецПроцедуры
227 |
228 | // Установить ожидаемый код возврата
229 | // После исполнения команды будет выброшено исключение, если полученный код возврата не совпадает с ожидаемым
230 | //
231 | // Параметры:
232 | // ОжидаемыйКодВозврата - Число
233 | //
234 | Процедура УстановитьПравильныйКодВозврата(Знач ПарамОжидаемыйКодВозврата) Экспорт
235 | УстановитьДиапазонПравильныхКодовВозврата(ПарамОжидаемыйКодВозврата, ПарамОжидаемыйКодВозврата);
236 | КонецПроцедуры
237 |
238 | // Установить диапазон ожидаемых кодов возврата
239 | // После исполнения команды будет выброшено исключение, если полученный код возврата не попадает в указанный диапазон
240 | //
241 | // Параметры:
242 | // МинимальныйОжидаемыйКодВозврата - Число
243 | // МаксимальныйОжидаемыйКодВозврата - Число
244 | //
245 | Процедура УстановитьДиапазонПравильныхКодовВозврата( Знач ПарамМинимальныйОжидаемыйКодВозврата,
246 | Знач ПарамМаксимальныйОжидаемыйКодВозврата) Экспорт
247 |
248 | ПроверяемКодВозврата = Истина;
249 | МинимальныйОжидаемыйКодВозврата = ПарамМинимальныйОжидаемыйКодВозврата;
250 | МаксимальныйОжидаемыйКодВозврата = ПарамМаксимальныйОжидаемыйКодВозврата;
251 |
252 | КонецПроцедуры
253 |
254 | // Установить кодировку вывода для выполнения команды.
255 | //
256 | // Параметры:
257 | // Строка, Неопределено - кодировка вывода
258 | // Если Неопределено, кодировка сбрасывается и используется значение по умолчанию от операционной системы
259 | //
260 | Процедура УстановитьКодировкуВывода(Знач НоваяКодировкаВывода) Экспорт
261 | КодировкаВывода = НоваяКодировкаВывода;
262 | КонецПроцедуры
263 |
264 | // Получить кодировка вывода выполняемой команды.
265 | //
266 | // Возвращаемое значение:
267 | // Строка - кодировка вывода команды
268 | //
269 | Функция ПолучитьКодировкуВывода() Экспорт
270 | Возврат КодировкаВывода;
271 | КонецФункции
272 |
273 | // Установить период опроса завершения.
274 | //
275 | // Параметры:
276 | // ПериодОпросаВМиллисекундах - период опроса, в миллисекундах
277 | //
278 | Процедура УстановитьПериодОпросаЗавершения(Знач ПарамПериодОпросаВМиллисекундах) Экспорт
279 | ПериодОпросаВМиллисекундах = ПарамПериодОпросаВМиллисекундах;
280 | КонецПроцедуры
281 |
282 | // Установить новый рабочий каталог.
283 | //
284 | // Параметры:
285 | // Строка - Путь к новому рабочему каталогу
286 | //
287 | Процедура УстановитьРабочийКаталог(Знач НовыйРабочийКаталог) Экспорт
288 | РабочийКаталог = НовыйРабочийКаталог;
289 | КонецПроцедуры
290 |
291 | // Получить текущий рабочий каталог.
292 | //
293 | // Возвращаемое значение:
294 | // Строка - Путь к рабочему каталогу
295 | //
296 | Функция ПолучитьРабочийКаталог() Экспорт
297 | Возврат РабочийКаталог;
298 | КонецФункции
299 |
300 | // Установить признак исполнения через командный процессор системы.
301 | // По умолчанию он включен.
302 | //
303 | // Параметры:
304 | // ИспользуемКомандныйПроцессор - Булево - Включить/Выключить использование командного процессора системы.
305 | //
306 | Процедура УстановитьИсполнениеЧерезКомандыСистемы(Знач ПарамИспользуемКомандныйПроцессор) Экспорт
307 | ИспользуемКомандныйПроцессор = ПарамИспользуемКомандныйПроцессор;
308 | КонецПроцедуры
309 |
310 | // Оборачивает переданную строку в кавычки, если она еще не обернута.
311 | //
312 | // Параметры:
313 | // Строка - Строка - Входящая строка
314 | //
315 | // Возвращаемое значение:
316 | // Строка - Строка, обернутая в кавычки
317 | //
318 | Функция ОбернутьВКавычки(Знач Строка) Экспорт
319 |
320 | Если Лев(Строка, 1) = """" и Прав(Строка, 1) = """" Тогда
321 | Возврат Строка;
322 | Иначе
323 | Возврат """" + Строка + """";
324 | КонецЕсли;
325 |
326 | КонецФункции
327 |
328 | //////////////////////////////////////////////////////////////////////////
329 | // Служебные процедуры и функции
330 |
331 | // Установить вывод последней выполненной команды.
332 | //
333 | // Параметры:
334 | // Сообщение - Строка - Вывод команды
335 | //
336 | Процедура УстановитьВывод(Знач Сообщение)
337 | ВыводКоманды = Сообщение;
338 | КонецПроцедуры
339 |
340 | // Проверяет возможность выполнить команду.
341 | //
342 | Процедура ПроверитьВозможностьВыполненияКоманды()
343 |
344 | Ожидаем.Что(ПолучитьРабочийКаталог(), "Рабочий каталог не установлен.").Заполнено();
345 |
346 | Лог.Отладка("РабочийКаталог: " + ПолучитьРабочийКаталог());
347 |
348 | КонецПроцедуры
349 |
350 | // Запустить команду в операционной системе с ожиданием ее выполнения
351 | //
352 | // Параметры:
353 | // Параметры - Массив - Массив строковых аргументов, передаваемых в командную
354 | // строку. Добавляются после исполняемого файла.
355 | //
356 | // Возвращаемое значение:
357 | // Число - Код возврата приложения
358 | //
359 | Функция ЗапуститьИПодождать()
360 |
361 | СтрокаЗапуска = СформироватьСтрокуЗапускаПроцесса();
362 |
363 | ПерехватыватьПотоки = Истина;
364 |
365 | Процесс = ЗапуститьПроцессКоманды(ПерехватыватьПотоки);
366 |
367 | ПолучитьВыводПокаПроцессИсполняется(Процесс);
368 |
369 | КодВозврата = Процесс.КодВозврата;
370 | ПроверитьКодВозврата(КодВозврата);
371 |
372 | Возврат КодВозврата;
373 |
374 | КонецФункции
375 |
376 |
377 | // Запустить команду в операционной системе с ожиданием ее выполнения
378 | //
379 | // Параметры:
380 | // Параметры - Массив - Массив строковых аргументов, передаваемых в командную
381 | // строку. Добавляются после исполняемого файла.
382 | //
383 | // Возвращаемое значение:
384 | // Процесс - запущенный процесс
385 | //
386 | Функция ЗапуститьПроцессКоманды(ПерехватыватьПотоки = Ложь)
387 |
388 | СтрокаЗапуска = СформироватьСтрокуЗапускаПроцесса();
389 |
390 | Попытка
391 |
392 | Если КодировкаВывода = Неопределено Тогда
393 | Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог, ПерехватыватьПотоки, ПерехватыватьПотоки, ,
394 | ПеременныеСредыПроцесса);
395 | Иначе
396 | Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог, ПерехватыватьПотоки, ПерехватыватьПотоки,
397 | КодировкаВывода, ПеременныеСредыПроцесса);
398 | КонецЕсли;
399 |
400 | Исключение
401 |
402 | Инфо = ИнформацияОбОшибке();
403 |
404 | // TODO код проверки на регулярку (ниже) убрать после исправления в движке OneScript
405 | РегуляркаОшибкиПеременныхСреды = Новый РегулярноеВыражение(
406 | "\(System\.ArgumentException\):[^:]+:.*HOME[^:]+:.*home");
407 | Если РегуляркаОшибкиПеременныхСреды.Совпадает(Инфо.Описание) Тогда
408 | Лог.Предупреждение("Возникла ошибка, связанная с переменными среды при старте нового процесса
409 | |%1
410 | |
411 | |Выполняю старт процесса без указания переменных среды.", Инфо.Описание);
412 |
413 | Лог.Отладка("Полное описание ошибки:
414 | |%1", Инфо.ПодробноеОписаниеОшибки());
415 |
416 | Если КодировкаВывода = Неопределено Тогда
417 | Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог, ПерехватыватьПотоки, ПерехватыватьПотоки);
418 | Иначе
419 | Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог, ПерехватыватьПотоки, ПерехватыватьПотоки,
420 | КодировкаВывода);
421 | КонецЕсли;
422 | Иначе
423 | ВызватьИсключение Инфо.ПодробноеОписаниеОшибки();
424 | КонецЕсли;
425 |
426 | КонецПопытки;
427 |
428 | Процесс.Запустить();
429 |
430 | Возврат Процесс;
431 |
432 | КонецФункции
433 |
434 | Функция СформироватьСтрокуЗапускаПроцесса()
435 | Перем ПутьПриложения;
436 |
437 | ПутьПриложения = Приложение;
438 |
439 | СтрокаЗапуска = "";
440 | СтрокаДляЛога = "";
441 | Для Каждого Параметр Из Параметры Цикл
442 |
443 | СтрокаЗапуска = СтрокаЗапуска + " " + Параметр;
444 |
445 | Если Лев(Параметр, 2) <> "/P" и Лев(Параметр, 25) <> "/ConfigurationRepositoryP" Тогда
446 | СтрокаДляЛога = СтрокаДляЛога + " " + Параметр;
447 | КонецЕсли;
448 |
449 | КонецЦикла;
450 |
451 | Если НЕ ИспользуетсяЕдинаяСтрокаЗапуска И Найти(ПутьПриложения, " ") > 0 Тогда
452 | ПутьПриложения = ОбернутьВКавычки(ПутьПриложения);
453 | КонецЕсли;
454 | Лог.Отладка("Строка запуска <%1>", ПутьПриложения + СтрокаДляЛога);
455 |
456 | СтрокаЗапуска = ПутьПриложения + СтрокаЗапуска;
457 |
458 | Если ИспользуемКомандныйПроцессор Тогда
459 | Если ЭтоWindows Тогда
460 | ШаблонЗапуска = "cmd /c ""%1""";
461 | Иначе
462 | ШаблонЗапуска = "sh -c '%1'";
463 | КонецЕсли;
464 |
465 | СтрокаЗапуска = СтрШаблон(ШаблонЗапуска, СтрокаЗапуска);
466 | КонецЕсли;
467 | Лог.Отладка("Полная строка запуска <%1>", СтрокаЗапуска);
468 |
469 | Возврат СтрокаЗапуска;
470 | КонецФункции // СформироватьСтрокуЗапускаПроцесса()
471 |
472 | Процедура ОбработкаОжиданияПроцесса(Процесс, ЗаписьXML)
473 |
474 | ПрерываниеПроцесса = Ложь;
475 | СтандартнаяОбработка = Истина;
476 | УстановленОбработчикОжиданияПроцесса = НЕ ОбработчикОжиданияПроцесса = Неопределено;
477 |
478 | Если ДополнительныеПараметрыОбработчика = Неопределено Тогда
479 | ДополнительныеПараметры = Новый Структура();
480 | Иначе
481 | ДополнительныеПараметры = ДополнительныеПараметрыОбработчика;
482 | КонецЕсли;
483 |
484 | Если УстановленОбработчикОжиданияПроцесса Тогда
485 |
486 | Обработчик = ОбработчикОжиданияПроцесса;
487 |
488 | Лог.Отладка("Вызов обработчика ожидания");
489 | Попытка
490 | Обработчик.ОбработкаОжиданияПроцесса(Процесс,
491 | ПрерываниеПроцесса,
492 | ПериодОпросаВМиллисекундах,
493 | ДополнительныеПараметры,
494 | СтандартнаяОбработка);
495 | Исключение
496 | Лог.Отладка(ОписаниеОшибки());
497 | ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
498 | КонецПопытки;
499 |
500 | КонецЕсли;
501 |
502 | Если СтандартнаяОбработка Тогда
503 |
504 | Если ПерехватыватьПотоки
505 | И Процесс.ПотокВывода.ЕстьДанные
506 | ИЛИ Процесс.ПотокОшибок.ЕстьДанные Тогда
507 |
508 | ОбработатьОчереднуюСтрокуВывода(Процесс.ПотокВывода, ЗаписьXML);
509 | ОбработатьОчереднуюСтрокуВывода(Процесс.ПотокОшибок, ЗаписьXML, Истина);
510 |
511 | КонецЕсли;
512 |
513 | КонецЕсли;
514 |
515 | Если ПрерываниеПроцесса Тогда
516 |
517 | Если Не Процесс.Завершен Тогда
518 | Процесс.Завершить();
519 | КонецЕсли;
520 |
521 | КонецЕсли;
522 |
523 | КонецПроцедуры
524 |
525 | Процедура ПолучитьВыводПокаПроцессИсполняется(Процесс)
526 |
527 | ЗаписьXML = Новый ЗаписьXML();
528 | ЗаписьXML.УстановитьСтроку();
529 |
530 | Если ПериодОпросаВМиллисекундах <> 0 Тогда
531 | Приостановить(ПериодОпросаВМиллисекундах);
532 | ОбработкаОжиданияПроцесса(Процесс, ЗаписьXML);
533 | КонецЕсли;
534 |
535 | Пока НЕ Процесс.Завершен Цикл
536 |
537 | Если ПериодОпросаВМиллисекундах <> 0 Тогда
538 | Приостановить(ПериодОпросаВМиллисекундах);
539 | КонецЕсли;
540 |
541 | ОбработкаОжиданияПроцесса(Процесс, ЗаписьXML);
542 |
543 | КонецЦикла;
544 |
545 | // Дочитывает данные после завершения ?? Хотя процесс не может завершиться пока есть данные в потоке чтения
546 | Если ПерехватыватьПотоки
547 | И Процесс.ПотокВывода.ЕстьДанные
548 | ИЛИ Процесс.ПотокОшибок.ЕстьДанные Тогда
549 |
550 | ОбработатьОчереднуюСтрокуВывода(Процесс.ПотокВывода, ЗаписьXML);
551 | ОбработатьОчереднуюСтрокуВывода(Процесс.ПотокОшибок, ЗаписьXML, Истина);
552 |
553 | КонецЕсли;
554 |
555 | РезультатРаботыПроцесса = ЗаписьXML.Закрыть();
556 |
557 | Лог.Отладка("Длина вывода %1, количество строк %2", СтрДлина(РезультатРаботыПроцесса),
558 | СтрЧислоСтрок(РезультатРаботыПроцесса));
559 |
560 | УстановитьВывод(РезультатРаботыПроцесса);
561 |
562 | КонецПроцедуры
563 |
564 | Функция ОбработатьОчереднуюСтрокуВывода(ПотокПроцесса, ЗаписьXML, Знач ЭтоВыводОшибки = Ложь)
565 | Рез = "";
566 | Если ПотокПроцесса.ЕстьДанные Тогда
567 | Рез = ПотокПроцесса.Прочитать();
568 | КонецЕсли;
569 |
570 | Если Рез <> "" Тогда
571 | Если ЗначениеЗаполнено(ПодключенныеЛоги) Тогда
572 | Для каждого ПодключенныйЛог Из ПодключенныеЛоги Цикл
573 | Если ЭтоВыводОшибки Тогда
574 | ПодключенныйЛог.Ошибка(Рез);
575 | Иначе
576 | ПодключенныйЛог.Информация(Рез);
577 | КонецЕсли;
578 | КонецЦикла;
579 | Иначе
580 | ЗаписьXML.ЗаписатьБезОбработки(Рез + Символы.ПС);
581 |
582 | Если НемедленныйВывод Тогда
583 | Сообщить(Рез);
584 | КонецЕсли;
585 | КонецЕсли;
586 |
587 | КонецЕсли;
588 |
589 | Возврат Рез;
590 | КонецФункции
591 |
592 | Процедура ПроверитьКодВозврата(Знач КодВозврата)
593 | Если ПроверяемКодВозврата Тогда
594 | Если КодВозврата < МинимальныйОжидаемыйКодВозврата или КодВозврата > МаксимальныйОжидаемыйКодВозврата Тогда
595 | Если МинимальныйОжидаемыйКодВозврата <> МаксимальныйОжидаемыйКодВозврата Тогда
596 | ТекстОшибки = СтрШаблон(
597 | "Ожидали, что код возврата <%1> команды <%2> совпадет с ожидаемым диапазоном <%3>-<%4>, а это не так!
598 | |Лог команды:
599 | |%5",
600 | КодВозврата, Приложение, МинимальныйОжидаемыйКодВозврата, МаксимальныйОжидаемыйКодВозврата,
601 | ПолучитьВывод());
602 | Иначе
603 | ТекстОшибки = СтрШаблон("Ожидали, что код возврата <%1> команды <%2> совпадет с ожидаемым <%3>, а это не так!
604 | |Лог команды:
605 | |%4",
606 | КодВозврата, Приложение, МинимальныйОжидаемыйКодВозврата, ПолучитьВывод());
607 | КонецЕсли;
608 | Ожидаем.Что(КодВозврата, СтрШаблон("%1, вывод %2", ТекстОшибки, ВыводКоманды)).
609 | БольшеИлиРавно(МинимальныйОжидаемыйКодВозврата).
610 | МеньшеИлиРавно(МаксимальныйОжидаемыйКодВозврата);
611 | КонецЕсли;
612 | КонецЕсли;
613 | КонецПроцедуры
614 |
615 | // Инициализация работы библиотеки.
616 | // Задает минимальные настройки.
617 | //
618 | Процедура Инициализация()
619 |
620 | Лог = Логирование.ПолучитьЛог(ИмяЛога());
621 |
622 | СистемнаяИнформация = Новый СистемнаяИнформация;
623 | ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0;
624 |
625 | РабочийКаталог = ".";
626 | ВыводКоманды = "";
627 | КодировкаВывода = Неопределено;//КодировкаТекста.UTF8;
628 | Параметры = Новый Массив;
629 |
630 | ИспользуетсяЕдинаяСтрокаЗапуска = Ложь;
631 | ИспользуемКомандныйПроцессор = Истина;
632 |
633 | ПроверяемКодВозврата = Ложь;
634 | ОжидаемыйКодВозврата = 0;
635 | ПерехватыватьПотоки = Истина;
636 |
637 | ПериодОпросаВМиллисекундах = 100;
638 | НемедленныйВывод = Ложь;
639 |
640 | ПеременныеСредыПроцесса = ПеременныеСреды();
641 |
642 | ПодключенныеЛоги = Новый Массив;
643 | ОбработчикОжиданияПроцесса = Неопределено;
644 |
645 | КонецПроцедуры
646 |
647 | Инициализация();
648 |
--------------------------------------------------------------------------------