├── .github └── workflows │ ├── qa.yml │ ├── release.yml │ └── testing.yml ├── .gitignore ├── .vscode ├── settings.json └── tasks.json ├── Jenkinsfile ├── LICENSE.md ├── NOTICE ├── features ├── opm-build.feature ├── step_definitions │ ├── fixtures │ │ ├── ДолгоеВыполнение.os │ │ └── ОбработчикОжиданияПроцесса.os │ ├── wait-handler.os │ ├── ВыполнениеКоманды.os │ └── КомандныеФайлы.os ├── wait-handler.feature ├── ВыполнениеКоманды.feature └── КомандныеФайлы.feature ├── lib.config ├── packagedef ├── readme.md ├── sonar-project.properties ├── src ├── Команда.os └── КомандныйФайл.os └── tasks ├── coverage.os ├── test-feature.os └── test.os /.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 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.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 -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "editor.rulers": [120] 4 | } -------------------------------------------------------------------------------- /.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 | } -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | ТребуетсяОтказ = Ложь; -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /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/КомандныеФайлы.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 | -------------------------------------------------------------------------------- /lib.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # 1commands 2 | 3 | [![GitHub release](https://img.shields.io/github/release/artbear/1commands.svg)](https://github.com/artbear/1commands/releases) 4 | [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/artbear/1commands/%D0%A2%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5?style=flat-square)](https://github.com/artbear/1commands/actions) 5 | [![Статус Порога Качества](https://sonar.openbsl.ru/api/project_badges/measure?project=1commands&metric=alert_status)](https://sonar.openbsl.ru/dashboard?id=1commands) 6 | [![Покрытие](https://sonar.openbsl.ru/api/project_badges/measure?project=1commands&metric=coverage)](https://sonar.openbsl.ru/dashboard?id=1commands) 7 | [![Технический долг](https://sonar.openbsl.ru/api/project_badges/measure?project=1commands&metric=sqale_index)](https://sonar.openbsl.ru/dashboard?id=1commands) 8 | [![Строки кода](https://sonar.openbsl.ru/api/project_badges/measure?project=1commands&metric=ncloc)](https://sonar.openbsl.ru/dashboard?id=1commands) 9 | 10 | 12 | [Vanessa open-source![Chat on Telegram vanessa_opensource_chat](https://img.shields.io/badge/Chat%20on-Telegram-brightgreen.svg)](https://t.me/vanessa_opensource_chat) или [oscript_library ![Chat on Telegram oscript_library](https://img.shields.io/badge/Chat%20on-Telegram-brightgreen.svg)](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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | --------------------------------------------------------------------------------