├── .github ├── copilot-instructions.md ├── dependabot.yml └── workflows │ ├── copilot-setup-steps.yml │ ├── main.yml │ ├── rebase.yml │ └── release.yml ├── .gitignore ├── .vscode ├── launch.json ├── settings.json ├── spell.json └── tasks.json ├── LICENSE ├── README.md ├── features ├── install-file.feature ├── opm-build.feature ├── step_definitions │ ├── fixtures │ │ └── testpackage │ │ │ ├── folder │ │ │ ├── src.dll │ │ │ └── src.os │ │ │ └── packagedef │ ├── install-file.os │ ├── opm-build.os │ ├── shared.os │ └── Настройки.os └── Настройки.feature ├── packagedef ├── sonar-project.properties ├── src ├── cmd │ ├── opm.os │ ├── Классы │ │ ├── ИсполнительЗадач.os │ │ ├── КомандаOpm_App.os │ │ ├── КомандаOpm_Build.os │ │ ├── КомандаOpm_Config.os │ │ ├── КомандаOpm_Download.os │ │ ├── КомандаOpm_Install.os │ │ ├── КомандаOpm_List.os │ │ ├── КомандаOpm_Prepare.os │ │ ├── КомандаOpm_Push.os │ │ ├── КомандаOpm_Run.os │ │ ├── КомандаOpm_Test.os │ │ ├── КомандаOpm_Update.os │ │ ├── КомандаOpm_Version.os │ │ └── ШаблонКоманды.os-template │ └── Модули │ │ └── ПараметрыПриложенияOpm.os └── core │ ├── Классы │ ├── КэшУстановленныхПакетов.os │ ├── МенеджерПолученияПакетов.os │ ├── МенеджерУстановкиПакетов.os │ ├── ОписаниеПакета.os │ ├── СборщикПакета.os │ ├── СерверПакетов.os │ ├── СериализацияМетаданныхПакета.os │ ├── УстановкаПакета.os │ ├── ФайловыйСерверОтвет.os │ └── ФайловыйСерверПакетов.os │ └── Модули │ ├── КонстантыOpm.os │ ├── НастройкиOpm.os │ ├── ОбщегоНазначенияOpm.os │ ├── РаботаСВерсиями.os │ ├── РаботаСОписаниемПакета.os │ ├── РаботаСПакетами.os │ ├── РежимУстановкиПакетов.os │ └── СерверыПакетов.os ├── tasks ├── coverage.os ├── oscript.cfg └── test.os └── tests ├── build-install-test.os ├── download.os ├── fixtures ├── opm-example.cfg ├── opm-incomplete.cfg ├── opm-servers.cfg └── opm.cfg ├── mft-serializer-test.os ├── packagedef-test.os ├── packagelist.os ├── pkg-cache.os ├── testpackage ├── testpackage-0.3.1 │ ├── folder │ │ ├── src.dll │ │ └── src.os │ └── packagedef └── testpackage-0.3.2 │ ├── folder │ ├── src-new.dll │ └── src-new.os │ └── packagedef └── versions-test.os /.github/copilot-instructions.md: -------------------------------------------------------------------------------- 1 | ## Общее 2 | 3 | Этот проект написан на языке 1С:Предприятие 8 и выполняется в независимой реализации виртуальной машины под названием OneScript или oscript. Документация доступна на сайте https://oscript.io, исходный код движка - https://github.com/EvilBeaver/OneScript 4 | 5 | Для управления версиями движка OneScript используется OneScript Version Manager (ovm), который уже установлен в окружении Coding Agent. Так же в окружение установлена требуемая версия oscript. Документация по ovm - https://github.com/oscript-library/ovm 6 | 7 | Для работы с зависимостями используется пакетный менеджер OneScript Package Manager (opm), который тоже установлен в окружении. При подготовке окружения автоматически был выполнен шаг установки зависимостей текущего проекта. Они доступны в подкаталоге `oscript_modules`, расположенном в корне проекта. 8 | 9 | Документация о продукте содержится в каталоге docs. 10 | 11 | ## Тестирование 12 | 13 | Для запуска тестов используется команда: 14 | 15 | ```sh 16 | oscript tasks/test.os 17 | ``` 18 | 19 | Для запуска тестов с замером покрытия используется команда: 20 | 21 | ```sh 22 | oscript tasks/coverage.os 23 | ``` 24 | 25 | Замеры покрытия доступны в подкаталоге `out`. 26 | 27 | ## Качество кода 28 | 29 | Проект анализируется на сервере SonarQube sonar.openbsl.ru, к которому у тебя есть прямой доступ, в том числе по web-api. Используется плагин для поддержки 1С, основанный на проекте BSL Language Server. 30 | Документация и список диагностик BSL LS доступны на сайте https://1c-syntax.github.io/bsl-language-server 31 | Реализация диагностик доступна по адресу https://github.com/1c-syntax/bsl-language-server 32 | 33 | При необходимости ты можешь скачать из релизов BSL LS исполняемый файл (для Linux или -exec.jar), и запустить bsl ls в режиме analyze с выводом результатов, используя reporter json. 34 | 35 | В корне проекта лежит файл .bsl-language-server.json с дополнительной конфигурацией BSL LS (включая параметры диагностик). 36 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "github-actions" 4 | directory: "/" 5 | schedule: 6 | interval: "daily" 7 | -------------------------------------------------------------------------------- /.github/workflows/copilot-setup-steps.yml: -------------------------------------------------------------------------------- 1 | name: "OneScript Development Environment Setup" 2 | 3 | # Allow testing of the setup steps from your repository's "Actions" tab. 4 | on: workflow_dispatch 5 | 6 | jobs: 7 | # The job MUST be called `copilot-setup-steps` or it will not be picked up by Copilot. 8 | copilot-setup-steps: 9 | runs-on: ubuntu-latest 10 | 11 | # Set the permissions to the lowest permissions possible needed for your steps. 12 | # Copilot will be given its own token for its operations. 13 | permissions: 14 | # Clone the repository to install dependencies 15 | contents: read 16 | 17 | # Setup steps for OneScript development environment 18 | steps: 19 | - name: Checkout code 20 | uses: actions/checkout@v4 21 | 22 | - run: git config --global core.quotepath false 23 | 24 | - name: Вычисление версии OneScript 25 | shell: bash 26 | id: extract_oscript_version 27 | run: | 28 | set -ex 29 | if [ -f packagedef ]; then 30 | extracted_version=$(cat packagedef | grep ".ВерсияСреды(" | sed 's|[^"]*"||' | sed -r 's/".+//' || true) 31 | version="${extracted_version:-stable}" 32 | else 33 | version="stable" 34 | fi 35 | echo "version=$version" >> $GITHUB_OUTPUT 36 | 37 | - name: Установка OneScript 38 | uses: otymko/setup-onescript@v1.5 39 | with: 40 | version: ${{ steps.extract_oscript_version.outputs.version }} 41 | 42 | - name: Установка зависимостей 43 | run: | 44 | opm install opm 45 | opm install -l --dev 46 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Тестирование 2 | on: 3 | push: 4 | pull_request: 5 | workflow_dispatch: 6 | jobs: 7 | test: 8 | strategy: 9 | fail-fast: false 10 | matrix: 11 | oscript_version: ['stable', 'default', 'dev'] 12 | uses: autumn-library/workflows/.github/workflows/test.yml@main 13 | with: 14 | oscript_version: ${{ matrix.oscript_version }} 15 | -------------------------------------------------------------------------------- /.github/workflows/rebase.yml: -------------------------------------------------------------------------------- 1 | name: Automatic Rebase 2 | on: 3 | issue_comment: 4 | types: [created] 5 | jobs: 6 | rebase: 7 | name: Rebase 8 | if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '/rebase') 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: Checkout the latest code 12 | uses: actions/checkout@v4 13 | with: 14 | token: ${{ secrets.GITHUB_TOKEN }} 15 | fetch-depth: 0 # otherwise, you will fail to push refs to dest repo 16 | - name: Automatic Rebase 17 | uses: cirrus-actions/rebase@1.8 18 | env: 19 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 20 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Публикация релиза 2 | 3 | on: 4 | release: 5 | types: 6 | - published 7 | workflow_dispatch: 8 | 9 | jobs: 10 | release: 11 | uses: autumn-library/workflows/.github/workflows/release.yml@main 12 | with: 13 | package_mask: "opm-*.ospx" 14 | secrets: 15 | PUSH_TOKEN: ${{ secrets.PUSH_TOKEN }} 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | oscript_modules/* 2 | tests-reports/* 3 | out/* 4 | bdd-*.xml 5 | *.ospx 6 | src/oscript.cfg 7 | opm\.cfg 8 | tests/testpackage 9 | src/cmd/oscript\.cfg 10 | exec.log 11 | test-reports/tests.xml 12 | tests.xml 13 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Используйте IntelliSense, чтобы узнать о возможных атрибутах. 3 | // Наведите указатель мыши, чтобы просмотреть описания существующих атрибутов. 4 | // Для получения дополнительной информации посетите: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "Отладка 1Script", 9 | "type": "oscript", 10 | "request": "launch", 11 | "args": [], 12 | "program": "${workspaceRoot}/src/cmd/opm.os", 13 | "cwd": "${workspaceRoot}", 14 | "runtimeExecutable": null, 15 | "debugPort": 2801, 16 | "protocol": "internal" 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Поместите параметры в этот файл, чтобы перезаписать параметры по умолчанию и пользовательские параметры. 2 | { 3 | "language-1c-bsl.linterEntryPoint": "src/opm.os" 4 | } 5 | -------------------------------------------------------------------------------- /.vscode/spell.json: -------------------------------------------------------------------------------- 1 | { 2 | "ignoreWordsList": [ 3 | "Прокси", 4 | "Неопределено" 5 | ], 6 | "ignoreRegExp": [ 7 | "/\\(.*\\.(jpg|jpeg|png|md|gif|JPG|JPEG|PNG|MD|GIF)\\)/g", 8 | "/((http|https|ftp|git)\\S*)/g" 9 | ] 10 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "2.0.0", 5 | // "_runner": "terminal", 6 | "windows": { 7 | "command": "cmd", 8 | "args": ["/c", "chcp 65001 && "] 9 | }, 10 | "linux": { 11 | "command": "sh", 12 | "args": ["-c"] 13 | }, 14 | "type": "shell", 15 | "suppressTaskName": true, 16 | "tasks": [ 17 | { 18 | "label": "Full testing", 19 | "args": [ 20 | "oscript", 21 | "${workspaceRoot}/tasks/test.os" 22 | ], 23 | "group": { 24 | "kind": "build", 25 | "isDefault": true 26 | }, 27 | // "presentation": { 28 | // "echo": true, 29 | // "reveal": "always", 30 | // "focus": false, 31 | // "panel": "shared", 32 | // "showReuseMessage": true 33 | // }, 34 | "problemMatcher": { 35 | "fileLocation": "absolute", 36 | "pattern": { 37 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)", 38 | "file": 1, 39 | "location": 2, 40 | "message": 3 41 | } 42 | } 43 | } 44 | ] 45 | } 46 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # opm 2 | [![GitHub release](https://img.shields.io/github/release/oscript-library/opm.svg)](https://github.com/oscript-library/opm/releases) 3 | 4 | OneScript Package Manager 5 | 6 | Возможные команды: 7 | - build - Собрать пакет из исходников 8 | - run - Выполнить произвольную задачу 9 | - test - Выполнить тестирование проекта 10 | - prepare - Подготовить новый каталог разрабатываемого пакета 11 | - install - Выполнить установку. Если указано имя пакета, происходит установка из хаба или из файла. В обратном случае устанавливаются зависимости текущего пакета по файлу packagedef. 12 | - update - Обновить пакет 13 | - app - Создать bat-файл для запуска скрипта в указанном каталоге 14 | - config - Задать пользовательские настройки 15 | - list - Вывести список пакетов 16 | - help - Справка по командам 17 | 18 | Наберите *opm <команда> --help*, чтобы вывести справку по команде 19 | 20 | Справка из википедии: [Система управления пакетами](https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%B0%D0%BC%D0%B8) 21 | 22 | # Сервера 23 | В настоящее время пакеты хранятся на двух серверах: 24 | - [hub.oscript.io](http://hub.oscript.io/download) - основной хаб пакетов 25 | - [hub.oscript.ru](http://hub.oscript.ru/download) - вторичный хаб пакетов. Используется, когда не удаётся получить данные с основного хаба 26 | 27 | # Особенности обновления версий 28 | 29 | ## с 0.14.х на 0.15.х и выше 30 | 31 | * Изменена строка использования (вызова) приложения - теперь соответствует стандарту POSIX. 32 | * Все параметры вызова разделены на опции и аргументы. Для коротких (1 символ) опций обязательно использование `-`, для длинных опций (2 символа и более) - использование двойного тире `--` 33 | * Сначала необходимо указывать опции, а потом аргументы 34 | 35 | Пример изменений использования для команды `build` 36 | ```sh 37 | # версия 0.14.х и младше 38 | 39 | opm build . -mf ./packagedef 40 | 41 | # версия 0.15.x и старше 42 | 43 | opm build --mf ./packagedef . 44 | 45 | ``` 46 | 47 | # Настройка 48 | 49 | ## Настройка путей установки скриптов 50 | Переменная окружения ```OSCRIPTBIN``` отвечает за переопределение пути установки скриптов при глобальной установке. По умолчанию для linux считается "/usr/bin", а для windows КаталогПрограммы(). 51 | При указании данной переменной можно переназначить путь для создания скриптов запуска различных пакетов. Возможно скачать архив, распаковать его и запуская oscript с указанием этих переменных тестировать работу автономной установки. 52 | - **linux** 53 | ``` 54 | OSCRIPTBIN=~/.local/bin opm update -all 55 | ``` 56 | - **windows** 57 | ``` 58 | set OSCRIPTBIN=c:\temp\ 59 | opm update -all 60 | ``` 61 | 62 | ## Настройка прокси-сервера для скачивания пакетов 63 | 64 | Настройка производится с помощью создания служебного файла [opm.cfg](./tests/fixtures/opm-example.cfg) данный файл настроек можно расположить по таким путям (список приведен в порядке убывания приоритета): 65 | - ```./opm.cfg``` - текущий каталог запуска + /opm.cfg 66 | - каталог настроек пользователя 67 | - linux: ```~/.opm.cfg```, **внимание файла должен называться с точкой ```.opm.cfg```** 68 | - windows: ```%USERPROFILE%\opm.cfg``` 69 | - системная настройка: 70 | - linux: ```/etc/opm.cfg``` 71 | - windows: ```c:\ProgramData\opm.cfg``` 72 | - OSCRIPT/lib/opm/opm.cfg - каталог установки opm, для совместимости. 73 | 74 | ## Обновление 75 | 76 | Пакетный менеджер обновляется вместе с oscript'ом, необходимую версию которого можно вручную скачать со страницы https://oscript.io/downloads/ или через [ovm](https://github.com/oscript-library/ovm), или обновить opm через сам opm: 77 | ``` 78 | opm update opm 79 | ``` 80 | -------------------------------------------------------------------------------- /features/install-file.feature: -------------------------------------------------------------------------------- 1 | # language: ru 2 | 3 | Функциональность: Настройки продукта 4 | 5 | Как разработчик 6 | Я хочу иметь устанавливать пакет из файла 7 | Чтобы иметь возможность проверять локальные версии пакетов 8 | 9 | 10 | Контекст: Тестовый контекст 11 | Допустим Я очищаю параметры команды "opm" в контексте 12 | И Я устанавливаю путь выполнения команды "opm" к текущей библиотеке 13 | И Я создаю временный каталог и сохраняю его в переменной "КаталогСборкиПакета" 14 | И Я создаю временный каталог и сохраняю его в переменной "РабочийКаталог" 15 | И Я выполняю сборку пакета "fixtures/testpackage" в каталог из переменной "КаталогСборкиПакета" 16 | И Я сохраняю файл пакета из каталога "КаталогСборкиПакета" в переменную "ИмяФайлаПакета" 17 | 18 | Сценарий: Установка пакета из файла в локальный каталог 19 | Допустим Я установил рабочий каталог из переменной "РабочийКаталог" 20 | И Я добавляю параметр "install" для команды "opm" 21 | И Я добавляю параметр "--local" для команды "opm" 22 | И Я добавляю опцию "-f" для команды "opm" из переменной "ИмяФайлаПакета" 23 | Когда Я выполняю команду "opm" 24 | И я вижу в консоли вывод 25 | | Событие установки - ПередУстановкой - КаталогУстановкиПакета | 26 | | Событие установки - ПриУстановке - КаталогУстановкиПакета | 27 | | ИНФОРМАЦИЯ - Установка завершена | 28 | И Вывод команды "opm" не содержит "Внешнее исключение" 29 | И Код возврата команды "opm" равен 0 30 | И В каталоге из переменной "РабочийКаталог" создается файл или каталог "oscript_modules" 31 | И В каталоге из переменной "РабочийКаталог" создается файл или каталог "oscript_modules/test" 32 | И В каталоге из переменной "РабочийКаталог" создается файл или каталог "oscript_modules/test/opm-metadata.xml" 33 | И В каталоге из переменной "РабочийКаталог" создается файл или каталог "oscript_modules/test/folder" 34 | И В каталоге из переменной "РабочийКаталог" создается файл или каталог "oscript_modules/test/folder/src.os" 35 | И В каталоге из переменной "РабочийКаталог" создается файл или каталог "oscript_modules/test/folder/src.dll" 36 | -------------------------------------------------------------------------------- /features/opm-build.feature: -------------------------------------------------------------------------------- 1 | # language: ru 2 | 3 | Функционал: Проверка сборки продукта 4 | Как Пользователь 5 | Я хочу автоматически проверять сборку моего продукта 6 | Чтобы гарантировать возможность установку моего продукта у пользователей 7 | 8 | Контекст: Отключение отладки в логах 9 | Допустим Я выключаю отладку лога с именем "oscript.lib.gitsync" 10 | И Я очищаю параметры команды "opm" в контексте 11 | 12 | Сценарий: Выполнение команды без параметров 13 | Когда Я добавляю параметр "build ." для команды "opm" 14 | И Я выполняю команду "opm" 15 | Тогда Вывод команды "opm" содержит "Сборка пакета завершена" 16 | И Вывод команды "opm" не содержит "Внешнее исключение" 17 | И Код возврата команды "opm" равен 0 18 | 19 | Сценарий: Сборка, установка и выполнение пакета 20 | Допустим Я создаю временный каталог и сохраняю его в контекст 21 | Допустим Я собираю пакет во временном каталоге 22 | И Я устанавливаю временный каталог как рабочий каталог 23 | И Я установил рабочий каталог как текущий каталог 24 | Тогда каталог "oscript_modules" не существует 25 | Когда я устанавливаю пакет из файла собранного пакета 26 | Тогда файл "oscript_modules/opm/src/cmd/opm.os" существует 27 | Тогда я выполняю команду получения версии установленного пакета "oscript oscript_modules/opm/src/cmd/opm.os version" 28 | И версия установленного пакета равна версии пакета из контекста 29 | -------------------------------------------------------------------------------- /features/step_definitions/fixtures/testpackage/folder/src.dll: -------------------------------------------------------------------------------- 1 | // заглушка 2 | -------------------------------------------------------------------------------- /features/step_definitions/fixtures/testpackage/folder/src.os: -------------------------------------------------------------------------------- 1 | // заглушка 2 | -------------------------------------------------------------------------------- /features/step_definitions/fixtures/testpackage/packagedef: -------------------------------------------------------------------------------- 1 | //////////////////////////////////////////////////////////// 2 | // Описание пакета для сборки и установки 3 | // Полную документацию см. на hub.oscript.io/packaging 4 | // 5 | 6 | /////////////////////////////////////////////////////////////////// 7 | // Процедуры установки пакета с клиентской машины 8 | /////////////////////////////////////////////////////////////////// 9 | 10 | // Вызывается пакетным менеджером перед установкой пакета на клиентскую машину. 11 | // 12 | // Параметры: 13 | // КаталогУстановкиПакета - строка. Путь в который пакетный менеджер устанавливает текущий пакет. 14 | // ЧтениеZipФайла - ЧтениеZipФайла. Архив пакета. 15 | // 16 | Процедура ПередУстановкой(Знач КаталогУстановкиПакета, Знач ЧтениеZipФайла) Экспорт 17 | Сообщить(СтрШаблон("Событие установки - ПередУстановкой - КаталогУстановкиПакета %1", 18 | КаталогУстановкиПакета)); 19 | КонецПроцедуры 20 | 21 | // Вызывается пакетным менеджером после распаковки пакета на клиентскую машину. 22 | // 23 | // Параметры: 24 | // КаталогУстановкиПакета - строка. Путь в который пакетный менеджер устанавливает текущий пакет. 25 | // 26 | Процедура ПриУстановке(Знач КаталогУстановкиПакета, СтандартнаяОбработка) Экспорт 27 | 28 | Сообщить(СтрШаблон("Событие установки - ПриУстановке - КаталогУстановкиПакета %1", 29 | КаталогУстановкиПакета)); 30 | 31 | КонецПроцедуры 32 | 33 | /////////////////////////////////////////////////////////////////// 34 | // Процедуры сборки пакета 35 | /////////////////////////////////////////////////////////////////// 36 | 37 | 38 | // Вызывается пакетным менеджером перед началом сборки пакета. 39 | // 40 | // Параметры: 41 | // РабочийКаталог - Строка - Текущий рабочий каталог с исходниками пакета. 42 | // 43 | Процедура ПередСборкой(Знач РабочийКаталог) Экспорт 44 | 45 | Сообщить(СтрШаблон("Событие установки - ПередСборкой - рабочий каталог %1", 46 | РабочийКаталог)); 47 | 48 | КонецПроцедуры 49 | 50 | // Вызывается пакетным менеджером после помещения файлов в пакет. 51 | // 52 | // Параметры: 53 | // РабочийКаталог - Строка - Текущий рабочий каталог с исходниками пакета. 54 | // АрхивПакета - ЗаписьZIPФайла - ZIP-архив с содержимым пакета (включаемые файлы). 55 | // 56 | Процедура ПриСборке(Знач РабочийКаталог, Знач АрхивПакета) Экспорт 57 | 58 | Сообщить(СтрШаблон("Событие установки - ПриСборке - рабочий каталог %1", 59 | РабочийКаталог)); 60 | 61 | КонецПроцедуры 62 | 63 | 64 | // Вызывается пакетным менеджером после сборки пакета. 65 | // 66 | // Параметры: 67 | // РабочийКаталог - Строка - Текущий рабочий каталог с исходниками пакета. 68 | // ПутьКФайлуПакета - Строка - Полный путь к собранному файлу пакета. 69 | // 70 | Процедура ПослеСборки(Знач РабочийКаталог, Знач ПутьКФайлуПакета) Экспорт 71 | 72 | Сообщить(СтрШаблон("Событие установки - ПослеСборки - рабочий каталог %1, ПутьКФайлуПакета %2", 73 | РабочийКаталог, ПутьКФайлуПакета)); 74 | 75 | КонецПроцедуры 76 | 77 | Описание.Имя("test") 78 | .Версия("0.3.1") 79 | .ВключитьФайл("packagedef") 80 | .ВключитьФайл("folder"); 81 | -------------------------------------------------------------------------------- /features/step_definitions/install-file.os: -------------------------------------------------------------------------------- 1 | // Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd 2 | 3 | Перем БДД; //контекст фреймворка 1bdd 4 | 5 | // Метод выдает список шагов, реализованных в данном файле-шагов 6 | Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт 7 | БДД = КонтекстФреймворкаBDD; 8 | 9 | ВсеШаги = Новый Массив; 10 | 11 | ВсеШаги.Добавить("ЯВыполняюСборкуПакетаВКаталогИзПеременной"); 12 | ВсеШаги.Добавить("ЯСохраняюФайлПакетаИзКаталогаВПеременную"); 13 | ВсеШаги.Добавить("ЯУстановилРабочийКаталогИзПеременной"); 14 | 15 | Возврат ВсеШаги; 16 | КонецФункции 17 | 18 | // Реализация шагов 19 | 20 | // Процедура выполняется перед запуском каждого сценария 21 | Процедура ПередЗапускомСценария(Знач Узел) Экспорт 22 | 23 | КонецПроцедуры 24 | 25 | // Процедура выполняется после завершения каждого сценария 26 | Процедура ПослеЗапускаСценария(Знач Узел) Экспорт 27 | 28 | КонецПроцедуры 29 | 30 | 31 | //Я выполняю сборку пакета "fixture/testpackage" в каталог из переменной "КаталогСборкиПакета" 32 | Процедура ЯВыполняюСборкуПакетаВКаталогИзПеременной(Знач ПутьКаталогуПакета, Знач ИмяПеременнойКаталогаСборки) Экспорт 33 | 34 | ПутьККаталогуПакета = ОбъединитьПути(ТекущийСценарий().Каталог, ПутьКаталогуПакета); 35 | 36 | КаталогСборкиПакета = БДД.ПолучитьИзКонтекста(ИмяПеременнойКаталогаСборки); 37 | 38 | СтрокаЗапуска = СтрШаблон("oscript ""%1"" build --out %2 %3", ПутьКИсполняемомуФайлу(), КаталогСборкиПакета, ПутьККаталогуПакета ); 39 | КодВозврата = ВыполнитьКоманду(СтрокаЗапуска); 40 | 41 | Ожидаем.Что(КодВозврата, 42 | "Ожидали, что сборка пакета (opm build) завершится с кодом возврата 0, а получили другое значение"). 43 | Равно(0); 44 | 45 | КонецПроцедуры 46 | 47 | 48 | //Я установил рабочий каталог из переменной "РабочийКаталог" 49 | Процедура ЯУстановилРабочийКаталогИзПеременной(Знач ИмяКаталога) Экспорт 50 | РабочийКаталог = БДД.ПолучитьИзКонтекста(ИмяКаталога); 51 | 52 | УстановитьТекущийКаталог(РабочийКаталог); 53 | 54 | КонецПроцедуры 55 | 56 | //Я сохраняю файл пакета из каталога "КаталогСборкиПакета" в переменную "ИмяФайлаПакета" 57 | Процедура ЯСохраняюФайлПакетаИзКаталогаВПеременную(Знач ИмяПеременнойКаталога, Знач ИмяПеременнойФайла) Экспорт 58 | ПутьВременногоКаталога = БДД.ПолучитьИзКонтекста(ИмяПеременнойКаталога); 59 | МассивФайлов = НайтиФайлы(ПутьВременногоКаталога, "*.ospx", Ложь); 60 | Ожидаем.Что(МассивФайлов.Количество(), "Должны были найти только 1 собранный пакет, а не несколько").Равно(1); 61 | ФайлПакета = МассивФайлов[0]; 62 | БДД.СохранитьВКонтекст(ИмяПеременнойФайла, ФайлПакета.ПолноеИмя); 63 | 64 | КонецПроцедуры 65 | 66 | Функция ВыполнитьКоманду(Знач СтрокаКоманды, ТекстВывода = "") 67 | Команда = Новый Команда; 68 | Команда.ПоказыватьВыводНемедленно(Истина); 69 | 70 | Команда.УстановитьСтрокуЗапуска(СтрокаКоманды); 71 | 72 | КодВозврата = Команда.Исполнить(); 73 | ТекстВывода = Команда.ПолучитьВывод(); 74 | 75 | Если КодВозврата <> 0 Тогда 76 | // Лог.Информация(ТекстВывода); 77 | Сообщить(ТекстВывода); 78 | КонецЕсли; 79 | Возврат КодВозврата; 80 | КонецФункции 81 | 82 | Функция ПутьКИсполняемомуФайлу() 83 | 84 | Возврат ОбъединитьПути(КаталогБиблиотеки(), "src", "cmd", "opm.os"); 85 | 86 | КонецФункции 87 | 88 | Функция КаталогFixtures() 89 | Возврат ОбъединитьПути(КаталогБиблиотеки(), "tests", "fixtures"); 90 | КонецФункции 91 | 92 | Функция КаталогБиблиотеки() 93 | Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "..", ".."); 94 | КонецФункции 95 | -------------------------------------------------------------------------------- /features/step_definitions/opm-build.os: -------------------------------------------------------------------------------- 1 | // Реализация шагов BDD-фич/сценариев с помощью фреймворка https://github.com/artbear/1bdd 2 | #Использовать tempfiles 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 | СтрокаЗапуска = СтрШаблон("oscript %3 build --out %2 %1", ТекущийКаталог(), ПутьВременногоКаталога, ПутьКИсполняемомуФайлу()); 36 | КодВозврата = ВыполнитьКоманду(СтрокаЗапуска); 37 | 38 | Ожидаем.Что(КодВозврата, 39 | "Ожидали, что сборка пакета (opm build) завершится с кодом возврата 0, а получили другое значение"). 40 | Равно(0); 41 | КонецПроцедуры 42 | 43 | //я устанавливаю пакет из файла собранного пакета 44 | Процедура ЯУстанавливаюПакетИзФайлаСобранногоПакета() Экспорт 45 | ЗапоминаюСобранныйФайлПакетаВКонтексте(); 46 | ЗапоминаюВерсиюСобранногоПакетаВКонтексте(); 47 | ФайлСобранногоПакета = БДД.ПолучитьИзКонтекста("ФайлСобранногоПакета"); 48 | ПутьВременногоКаталога = БДД.ПолучитьИзКонтекста("ВременныйКаталог"); 49 | 50 | УстановитьПеременнуюСреды("OSCRIPTBIN", ПутьВременногоКаталога); 51 | 52 | СтрокаЗапуска = СтрШаблон("oscript %2 install -l -f %1", ФайлСобранногоПакета.Имя, ПутьКИсполняемомуФайлу()); 53 | КодВозврата = ВыполнитьКоманду(СтрокаЗапуска); 54 | 55 | Ожидаем.Что(КодВозврата, "ВыполнитьЛокальнуюУстановкуСобранногоПакета КодВозврата").Равно(0); 56 | 57 | КонецПроцедуры 58 | 59 | //я выполняю команду получения версии установленного пакета "oscript src\main.os version" 60 | Процедура ЯВыполняюКомандуПолученияВерсииУстановленногоПакета(Знач СтрокаЗапуска) Экспорт 61 | УстановленнаяВерсияПакета = ""; 62 | КодВозврата = ВыполнитьКоманду(СтрокаЗапуска, УстановленнаяВерсияПакета); 63 | Ожидаем.Что(КодВозврата, "Должны были получить код возврата 0, а это не так").Равно(0); 64 | УстановленнаяВерсияПакета = СокрЛП(УстановленнаяВерсияПакета); 65 | БДД.СохранитьВКонтекст("УстановленнаяВерсияПакета", УстановленнаяВерсияПакета); 66 | 67 | КонецПроцедуры 68 | 69 | //версия установленного пакета равна версии пакета из контекста 70 | Процедура ВерсияУстановленногоПакетаРавнаВерсииПакетаИзКонтекста() Экспорт 71 | УстановленнаяВерсияПакета = БДД.ПолучитьИзКонтекста("УстановленнаяВерсияПакета"); 72 | ВерсияСобранногоПакета = БДД.ПолучитьИзКонтекста("ВерсияСобранногоПакета"); 73 | 74 | ВерсияСобранногоПакета = СокрЛП(ВерсияСобранногоПакета); 75 | 76 | СообщениеОшибки = СтрШаблон("Ожидали, что установленная версия <%1> равна версии из исходников проекта"); 77 | Если УстановленнаяВерсияПакета <> ВерсияСобранногоПакета И 78 | Найти(УстановленнаяВерсияПакета, ВерсияСобранногоПакета) = Неопределено Тогда 79 | 80 | ВызватьИсключение СообщениеОшибки; 81 | 82 | КонецЕсли; 83 | // Ожидаем.Что(УстановленнаяВерсияПакета, СообщениеОшибки).Равно(ВерсияСобранногоПакета); 84 | КонецПроцедуры 85 | 86 | Функция ВыполнитьКоманду(Знач СтрокаКоманды, ТекстВывода = "") 87 | Команда = Новый Команда; 88 | Команда.ПоказыватьВыводНемедленно(Истина); 89 | 90 | Команда.УстановитьСтрокуЗапуска(СтрокаКоманды); 91 | 92 | КодВозврата = Команда.Исполнить(); 93 | ТекстВывода = Команда.ПолучитьВывод(); 94 | 95 | Если КодВозврата <> 0 Тогда 96 | // Лог.Информация(ТекстВывода); 97 | Сообщить(ТекстВывода); 98 | КонецЕсли; 99 | Возврат КодВозврата; 100 | КонецФункции 101 | 102 | //запоминаю собранный файл пакета в контексте 103 | Процедура ЗапоминаюСобранныйФайлПакетаВКонтексте() //Экспорт 104 | ПутьВременногоКаталога = БДД.ПолучитьИзКонтекста("ВременныйКаталог"); 105 | МассивФайлов = НайтиФайлы(ПутьВременногоКаталога, "*.ospx", Ложь); 106 | Ожидаем.Что(МассивФайлов.Количество(), "Должны были найти только 1 собранный пакет, а не несколько").Равно(1); 107 | ФайлПакета = МассивФайлов[0]; 108 | БДД.СохранитьВКонтекст("ФайлСобранногоПакета", ФайлПакета); 109 | КонецПроцедуры 110 | 111 | //я выполняю команду получения версии установленного пакета 112 | Процедура ЗапоминаюВерсиюСобранногоПакетаВКонтексте() //Экспорт 113 | ФайлПакета = БДД.ПолучитьИзКонтекста("ФайлСобранногоПакета"); 114 | РегулярноеВыражение = Новый РегулярноеВыражение("([^-]+-[^-]+|[^-]+)-(\d+\.(\d+\.)*\d+)\.ospx"); 115 | Совпадения = РегулярноеВыражение.НайтиСовпадения(ФайлПакета.Имя); 116 | СообщениеОшибки = СтрШаблон("Должны были файл пакета с правильным форматом имени, а это не так. <%1>", ФайлПакета.Имя); 117 | Ожидаем.Что(Совпадения.Количество(), СообщениеОшибки).Равно(1); 118 | Ожидаем.Что(Совпадения[0].Группы.Количество(), "Количество групп должно быть 1").БольшеИлиРавно(3); 119 | ИмяСобранногоПакета = Совпадения[0].Группы[1].Значение; 120 | ВерсияПакета = Совпадения[0].Группы[2].Значение; 121 | 122 | БДД.СохранитьВКонтекст("ИмяСобранногоПакета", ИмяСобранногоПакета); 123 | БДД.СохранитьВКонтекст("ВерсияСобранногоПакета", ВерсияПакета); 124 | КонецПроцедуры 125 | 126 | 127 | Функция ПутьКИсполняемомуФайлу() 128 | 129 | Возврат ОбъединитьПути(КаталогБиблиотеки(), "src", "cmd", "opm.os"); 130 | 131 | КонецФункции 132 | 133 | 134 | Функция КаталогFixtures() 135 | Возврат ОбъединитьПути(КаталогБиблиотеки(), "tests", "fixtures"); 136 | КонецФункции 137 | 138 | Функция КаталогБиблиотеки() 139 | Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "..", ".."); 140 | КонецФункции 141 | -------------------------------------------------------------------------------- /features/step_definitions/shared.os: -------------------------------------------------------------------------------- 1 | // Реализация шагов BDD-фич/сценариев с помощью фреймворка https://github.com/artbear/1bdd 2 | #Использовать tempfiles 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 | БДД.СохранитьВКонтекст(ИмяПеременной, ВременныйКаталог); 41 | 42 | КонецПроцедуры 43 | 44 | //Я устанавливаю переменную окружения "GITSYNC_STORAGE_PATH" из переменной "КаталогХранилища1С" 45 | Процедура ЯУстанавливаюПеременнуюОкруженияИзПеременной(Знач ИмяПеременной, Знач КаталогХранилища1С) Экспорт 46 | 47 | ЗначениеПеременной = БДД.ПолучитьИзКонтекста(КаталогХранилища1С); 48 | УстановитьПеременнуюСреды(ИмяПеременной, ЗначениеПеременной); 49 | 50 | КонецПроцедуры 51 | 52 | //Я добавляю позиционный параметр для команды "gitsync" из переменной "URLРепозитория" 53 | Процедура ЯДобавляюАргументДляКомандыИзПеременной(Знач ИмяКоманды, Знач ИмяПеременной) Экспорт 54 | 55 | Команда = БДД.ПолучитьИзКонтекста(КлючКоманды(ИмяКоманды)); 56 | ЗначениеПеременной = БДД.ПолучитьИзКонтекста(ИмяПеременной); 57 | 58 | Команда.ДобавитьПараметр(ЗначениеПеременной); 59 | 60 | КонецПроцедуры 61 | 62 | //Я добавляю параметр "-tmpdir" для команды "gitsync" из переменной "ВременнаяДиректория" 63 | Процедура ЯДобавляюОпциюДляКомандыИзПеременной(Знач Параметр, Знач ИмяКоманды, Знач ИмяПеременной) Экспорт 64 | Команда = БДД.ПолучитьИзКонтекста(КлючКоманды(ИмяКоманды)); 65 | ЗначениеПеременной = БДД.ПолучитьИзКонтекста(ИмяПеременной); 66 | Команда.ДобавитьПараметр(СтрШаблон("%1 %2", Параметр, ЗначениеПеременной)); 67 | КонецПроцедуры 68 | 69 | //Я добавляю параметры для команды "gitsync" 70 | //|--storage-user Администратор| 71 | //|-useVendorUnload| 72 | Процедура ЯДобавляюПараметрыДляКоманды(Знач ИмяКоманды, Знач ТаблицаПараметров) Экспорт 73 | 74 | Команда = БДД.ПолучитьИзКонтекста(КлючКоманды(ИмяКоманды)); 75 | Для Каждого Параметр из ТаблицаПараметров Цикл 76 | Команда.ДобавитьПараметр(Параметр[0]) 77 | КонецЦикла 78 | 79 | КонецПроцедуры 80 | 81 | 82 | //Я устанавливаю путь выполнения команды "gitsync" к текущей библиотеке 83 | Процедура ЯУстанавливаюПутьВыполненияКомандыКТекущейБиблиотеке(Знач ИмяКоманды) Экспорт 84 | 85 | ПутьКПриложению = ПутьКИсполняемомуФайлу(); 86 | Команда = БДД.ПолучитьИзКонтекста(КлючКоманды(ИмяКоманды)); 87 | Команда.УстановитьКоманду("oscript"); 88 | 89 | СистемнаяИнформация = Новый СистемнаяИнформация; 90 | ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; 91 | Если Не ЭтоWindows Тогда 92 | Команда.ДобавитьПараметр("-encoding=utf-8"); 93 | КонецЕсли; 94 | 95 | Команда.ДобавитьПараметр(ОбернутьВКавычки(ПутьКПриложению)); 96 | 97 | КонецПроцедуры 98 | 99 | //В каталоге из переменной "ПутьКаталогаИсходников" создается файл или каталог "AUTHORS" 100 | Процедура ВКаталогеИзПеременнойСоздаетсяФайлИлиКаталог(Знач ПутьКаталогаИсходников, Знач ИмяФайла) Экспорт 101 | 102 | ВременныйКаталог = БДД.ПолучитьИзКонтекста(ПутьКаталогаИсходников); 103 | ИскомыйФайл = Новый Файл(ОбъединитьПути(ВременныйКаталог, ИмяФайла)); 104 | Ожидаем.Что(ИскомыйФайл.Существует(), "Файл должен был существовать").ЭтоИстина(); 105 | 106 | КонецПроцедуры 107 | 108 | Функция КлючКоманды(Знач ИмяКоманды) 109 | Возврат "Команда-" + ИмяКоманды; 110 | КонецФункции 111 | 112 | Функция ОбернутьВКавычки(Знач Строка); 113 | Возврат """" + Строка + """"; 114 | КонецФункции 115 | 116 | Функция ПутьКИсполняемомуФайлу() 117 | 118 | Возврат ОбъединитьПути(КаталогБиблиотеки(), "src", "cmd", "opm.os"); 119 | 120 | КонецФункции 121 | 122 | Функция КаталогFixtures() 123 | Возврат ОбъединитьПути(КаталогБиблиотеки(), "tests", "fixtures"); 124 | КонецФункции 125 | 126 | Функция КаталогБиблиотеки() 127 | Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "..", ".."); 128 | КонецФункции 129 | -------------------------------------------------------------------------------- /features/step_definitions/Настройки.os: -------------------------------------------------------------------------------- 1 | // Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd 2 | #Использовать asserts 3 | 4 | #Использовать "../../src/core" 5 | 6 | Перем БДД; //контекст фреймворка 1bdd 7 | 8 | // Метод выдает список шагов, реализованных в данном файле-шагов 9 | Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт 10 | БДД = КонтекстФреймворкаBDD; 11 | 12 | ВсеШаги = Новый Массив; 13 | 14 | ВсеШаги.Добавить("ЯЧитаюНастройкиИзФайла"); 15 | ВсеШаги.Добавить("ЗначениеНастройкиРавно"); 16 | 17 | Возврат ВсеШаги; 18 | КонецФункции 19 | 20 | // Реализация шагов 21 | 22 | // Процедура выполняется перед запуском каждого сценария 23 | Процедура ПередЗапускомСценария(Знач Узел) Экспорт 24 | 25 | КонецПроцедуры 26 | 27 | // Процедура выполняется после завершения каждого сценария 28 | Процедура ПослеЗапускаСценария(Знач Узел) Экспорт 29 | 30 | КонецПроцедуры 31 | 32 | //я читаю настройки из файла "opm.cfg" 33 | Процедура ЯЧитаюНастройкиИзФайла(Знач ПутьФайла) Экспорт 34 | Файл = Новый Файл(ОбъединитьПути(ТекущийКаталог(), ПутьФайла)); 35 | НастройкиOpm.СброситьНастройки(); 36 | НастроитьOpmИзФайла(Файл.ПолноеИмя); 37 | 38 | Настройки = НастройкиOpm.ПолучитьНастройки(); 39 | БДД.СохранитьВКонтекст(КлючКонтекста(), Настройки); 40 | КонецПроцедуры 41 | 42 | //значение настройки "СоздаватьShСкриптЗапуска" равно "false" 43 | Процедура ЗначениеНастройкиРавно(Знач КлючНастройки, Знач ЗначениеНастройки) Экспорт 44 | Настройки = БДД.ПолучитьИзКонтекста(КлючКонтекста()); 45 | 46 | Ожидаем.Что(КлючНастройки, "Ключ настройки не заполнен").Заполнено(); 47 | 48 | Значение = ЗначениеНастройки(Настройки, КлючНастройки); 49 | 50 | ЗначениеНастройки = КонвертироватьЗначениеПриНеобходимости(ЗначениеНастройки); 51 | 52 | Ожидаем.Что(Значение, СтрШаблон("Не совпадает значение настройки с именем <%1>", КлючНастройки)).Равно(ЗначениеНастройки); 53 | КонецПроцедуры 54 | 55 | // учитываются простые (СоздаватьShСкриптЗапуска) и иерархические ключи (Прокси.ИспользоватьПрокси) 56 | Функция ЗначениеНастройки(Знач Настройки, Знач КлючНастройки) 57 | МассивИерархии = СтрРазделить(КлючНастройки, ".", Ложь); 58 | ПутьКлюча = ""; 59 | ТекущиеНастройки = настройки; 60 | Для Счетчик = 0 По МассивИерархии.ВГраница() Цикл 61 | ТекущийКлюч = МассивИерархии[Счетчик]; 62 | Если ПустаяСтрока(ПутьКлюча) Тогда 63 | ПутьКлюча = ТекущийКлюч; 64 | Иначе 65 | ПутьКлюча = СтрШаблон("%1.%2", ПутьКлюча, ТекущийКлюч); 66 | КонецЕсли; 67 | 68 | Значение = Неопределено; 69 | ЕстьНастройка = ТекущиеНастройки.Свойство(ТекущийКлюч, Значение); 70 | Ожидаем.Что(ЕстьНастройка, СтрШаблон("Не удалось получить настройку с именем <%1>", ПутьКлюча)).ЭтоИстина(); 71 | ТекущиеНастройки = Значение; 72 | КонецЦикла; 73 | 74 | Возврат Значение; 75 | КонецФункции 76 | 77 | Процедура НастроитьOpmИзФайла(ПутьКФайлуНастроек) 78 | 79 | НастройкиOpmИзФайлов = ПрочитатьФайлНастроек(ПутьКФайлуНастроек); 80 | 81 | Если НастройкиOpmИзФайлов.Количество() = 0 Тогда 82 | Возврат; 83 | КонецЕсли; 84 | 85 | НастройкиПроксиЕсть = ПолучитьЗначение(НастройкиOpmИзФайлов,"Прокси", Неопределено); 86 | 87 | Если Не НастройкиПроксиЕсть = Неопределено Тогда 88 | 89 | НастройкиПрокси = НастройкиКакСтруктура(НастройкиOpmИзФайлов.Прокси); 90 | 91 | Сервер = ПолучитьЗначение(НастройкиПрокси, "Сервер", ""); 92 | Порт = Число(ПолучитьЗначение(НастройкиПрокси, "Порт", 0)); 93 | Пользователь = ПолучитьЗначение(НастройкиПрокси, "Пользователь", ""); 94 | Пароль = ПолучитьЗначение(НастройкиПрокси, "Пароль", ""); 95 | 96 | НастройкиOpm.УстановитьНастройкиПроксиСервера(Сервер, Порт, Пользователь, Пароль); 97 | 98 | ПроксиПоУмолчанию = ПолучитьЗначение(НастройкиПрокси,"ПроксиПоУмолчанию", Неопределено); 99 | 100 | Если Не ПроксиПоУмолчанию = Неопределено Тогда 101 | 102 | НастройкиOpm.УстановитьСистемныеНастройкиПроксиСервера(ПроксиПоУмолчанию); 103 | 104 | КонецЕсли; 105 | 106 | ИспользованиеПрокси = ПолучитьЗначение(НастройкиПрокси,"ИспользованиеПрокси", Неопределено); 107 | 108 | Если Не ИспользованиеПрокси = Неопределено Тогда 109 | 110 | НастройкиOpm.УстановитьИспользованиеПрокси(ИспользованиеПрокси); 111 | 112 | КонецЕсли; 113 | 114 | КонецЕсли; 115 | 116 | СоздаватьShСкриптЗапуска = ПолучитьЗначение(НастройкиOpmИзФайлов,"СоздаватьShСкриптЗапуска", Неопределено); 117 | 118 | Если Не СоздаватьShСкриптЗапуска = Неопределено Тогда 119 | 120 | НастройкиOpm.УстановитьСозданиеShСкриптЗапуска(СоздаватьShСкриптЗапуска); 121 | 122 | КонецЕсли; 123 | 124 | СервераПакетов = ПолучитьЗначение(НастройкиOpmИзФайлов,"СервераПакетов", Неопределено); 125 | 126 | Если Не СервераПакетов = Неопределено Тогда 127 | Индекс = 1; 128 | 129 | Для каждого ТекущийСерверПакетов Из СервераПакетов Цикл 130 | 131 | Попытка 132 | СерверПакетов = СерверыПакетов.ИзНастроек(НастройкиКакСтруктура(ТекущийСерверПакетов), Индекс); 133 | Исключение 134 | Продолжить; 135 | КонецПопытки; 136 | 137 | НастройкиOpm.ДобавитьСерверПакетов(СерверПакетов); 138 | Индекс = Индекс + 1; 139 | 140 | КонецЦикла; 141 | 142 | КонецЕсли; 143 | 144 | КонецПроцедуры 145 | 146 | Функция ПрочитатьФайлНастроек(Знач ПутьФайлаНастроек) 147 | 148 | Если НЕ Новый Файл(ПутьФайлаНастроек).Существует() Тогда 149 | Возврат Новый Структура; 150 | КонецЕсли; 151 | 152 | Текст = ПрочитатьФайл(ПутьФайлаНастроек); 153 | 154 | ЧтениеJSON = Новый ЧтениеJSON(); 155 | ЧтениеJSON.УстановитьСтроку(Текст); 156 | НастройкиКакСоответствие = ПрочитатьJSON(ЧтениеJSON, Истина); 157 | ЧтениеJSON.Закрыть(); 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 | Если ЗначениеНастройки = "false" или ЗначениеНастройки = "ложь" Тогда 208 | ЗначениеНастройки = Ложь; 209 | ИначеЕсли ЗначениеНастройки = "true" или ЗначениеНастройки = "истина" Тогда 210 | ЗначениеНастройки = Истина; 211 | ИначеЕсли ЗначениеНастройки = "неопределено" Тогда 212 | ЗначениеНастройки = Неопределено; 213 | КонецЕсли; 214 | КонецЕсли; 215 | Возврат ЗначениеНастройки; 216 | КонецФункции 217 | 218 | Функция КлючКонтекста() 219 | Возврат "ТестовыеНастройкиПриложенияОМП"; 220 | КонецФункции // КлючКонтекста() 221 | -------------------------------------------------------------------------------- /features/Настройки.feature: -------------------------------------------------------------------------------- 1 | # language: ru 2 | 3 | Функциональность: Настройки продукта 4 | 5 | Как разработчик 6 | Я хочу иметь возможность настраивать параметры продукта из внешнего файла 7 | Чтобы управлять поведением продукта, например, если есть прокси 8 | 9 | Контекст: файл настроек 10 | Допустим Я создаю временный каталог и сохраняю его в контекст 11 | И Я устанавливаю временный каталог как рабочий каталог 12 | 13 | И Я установил рабочий каталог как текущий каталог 14 | 15 | # И Я показываю рабочий каталог 16 | 17 | Сценарий: Получение настроек 18 | Допустим Я копирую файл "opm.cfg" из каталога "tests/fixtures" проекта в рабочий каталог 19 | Когда я читаю настройки из файла "opm.cfg" 20 | Тогда значение настройки "СоздаватьShСкриптЗапуска" равно "false" 21 | И значение настройки "ИспользоватьПрокси" равно "false" 22 | И значение настройки "ИспользоватьСистемныйПрокси" равно "false" 23 | И значение настройки "НастройкиПрокси.Сервер" равно "" 24 | И значение настройки "НастройкиПрокси.Порт" равно 0 25 | И значение настройки "НастройкиПрокси.Пользователь" равно "" 26 | И значение настройки "НастройкиПрокси.Пароль" равно "" 27 | И значение настройки "НастройкиПрокси.ИспользоватьАутентификациюОС" равно "false" 28 | 29 | Сценарий: Получение значения по умолчанию, если настройка не задана в файле настроек 30 | Допустим Я копирую файл "opm-incomplete.cfg" из каталога "tests/fixtures" проекта в рабочий каталог 31 | Когда я читаю настройки из файла "opm-incomplete.cfg" 32 | Тогда значение настройки "СоздаватьShСкриптЗапуска" равно "false" 33 | И значение настройки "ИспользоватьПрокси" равно "Истина" 34 | И значение настройки "ИспользоватьСистемныйПрокси" равно "Истина" 35 | И значение настройки "НастройкиПрокси.Сервер" равно "" 36 | И значение настройки "НастройкиПрокси.Порт" равно 0 37 | И значение настройки "НастройкиПрокси.Пользователь" равно "" 38 | И значение настройки "НастройкиПрокси.Пароль" равно "" 39 | И значение настройки "НастройкиПрокси.ИспользоватьАутентификациюОС" равно "false" 40 | 41 | Сценарий: Получение значений по умолчанию, если файл настроек отсутствует 42 | Дано Файл "opm.cfg" не существует 43 | Когда я читаю настройки из файла "opm.cfg" 44 | Тогда значение настройки "СоздаватьShСкриптЗапуска" равно "false" 45 | И значение настройки "ИспользоватьПрокси" равно "false" 46 | И значение настройки "ИспользоватьСистемныйПрокси" равно "false" 47 | И значение настройки "НастройкиПрокси.Сервер" равно "" 48 | И значение настройки "НастройкиПрокси.Порт" равно "" 49 | И значение настройки "НастройкиПрокси.Пользователь" равно "" 50 | И значение настройки "НастройкиПрокси.Пароль" равно "" 51 | И значение настройки "НастройкиПрокси.ИспользоватьАутентификациюОС" равно "false" 52 | -------------------------------------------------------------------------------- /packagedef: -------------------------------------------------------------------------------- 1 | 2 | //////////////////////////////////////////////////////////// 3 | // Описание пакета для сборки и установки 4 | // Полную документацию см. на hub.oscript.io/packaging 5 | // 6 | 7 | ПутьКСценариюКонстант = ОбъединитьПути(ТекущийСценарий().Каталог, "src/core", "Модули", "КонстантыOpm.os"); 8 | 9 | // специальная заглушка для правильной компиляции packagedef при первых действий при установке пакета, 10 | // когда еще не извлечено никаких файлов пакет 11 | ФайлКонстант = Новый Файл(ПутьКСценариюКонстант); 12 | Если ФайлКонстант.Существует() Тогда 13 | Константы_ЛокальнаяВерсия = ЗагрузитьСценарий(ПутьКСценариюКонстант); 14 | ВерсияПродукта = Константы_ЛокальнаяВерсия.ВерсияПродукта; 15 | Иначе 16 | ВерсияПродукта = "1.4.2"; 17 | КонецЕсли; 18 | 19 | Описание.Имя("opm") 20 | .Версия(ВерсияПродукта) 21 | .ВерсияСреды("1.9.2") 22 | .ЗависитОт("strings", "0.5.0") 23 | .ЗависитОт("fs", "1.2.0") 24 | .ЗависитОт("fluent", "0.6.1") 25 | .ЗависитОт("logos", "1.7.1") 26 | .ЗависитОт("cli", "0.11.0") 27 | .ЗависитОт("tempfiles", "1.1.1") 28 | .ЗависитОт("gitrunner", "1.7.1") 29 | .ЗависитОт("reflector", "0.7.1") 30 | .ЗависитОт("semver", "1.0.0") 31 | 32 | // Зависимости для разработки, РазработкаЗависитОт() нельзя использовать 33 | // т.к иначе не получится обновится из старой версии opm 34 | .ЗависитОт("asserts", "1.4.0") 35 | .ЗависитОт("1bdd", "1.15.1") 36 | .ЗависитОт("1testrunner", "1.9.2") 37 | 38 | .ВключитьФайл("packagedef") 39 | .ВключитьФайл("src") 40 | .ВключитьФайл("tasks") 41 | .ВключитьФайл("oscript_modules") 42 | .ОпределяетКласс("КэшУстановленныхПакетов", "src/core/Классы/КэшУстановленныхПакетов.os") 43 | .ОпределяетКласс("МенеджерПолученияПакетов", "src/core/Классы/МенеджерПолученияПакетов.os") 44 | .ОпределяетКласс("МенеджерУстановкиПакетов", "src/core/Классы/МенеджерУстановкиПакетов.os") 45 | .ОпределяетКласс("ОписаниеПакета", "src/core/Классы/ОписаниеПакета.os") 46 | .ОпределяетКласс("СборщикПакета", "src/core/Классы/СборщикПакета.os") 47 | .ОпределяетКласс("СерверПакетов", "src/core/Классы/СерверПакетов.os") 48 | .ОпределяетКласс("СериализацияМетаданныхПакета", "src/core/Классы/СериализацияМетаданныхПакета.os") 49 | .ОпределяетКласс("УстановкаПакета", "src/core/Классы/УстановкаПакета.os") 50 | .ОпределяетМодуль("КонстантыOpm", "src/core/Модули/КонстантыOpm.os") 51 | .ОпределяетМодуль("НастройкиOpm", "src/core/Модули/НастройкиOpm.os") 52 | .ОпределяетМодуль("РаботаСВерсиями", "src/core/Модули/РаботаСВерсиями.os") 53 | .ОпределяетМодуль("РаботаСОписаниемПакета", "src/core/Модули/РаботаСОписаниемПакета.os") 54 | .ОпределяетМодуль("РаботаСПакетами", "src/core/Модули/РаботаСПакетами.os") 55 | .ОпределяетМодуль("РежимУстановкиПакетов", "src/core/Модули/РежимУстановкиПакетов.os") 56 | .ОпределяетМодуль("СерверыПакетов", "src/core/Модули/СерверыПакетов.os") 57 | .ОпределяетМодуль("ОбщегоНазначенияOpm", "src/core/Модули/ОбщегоНазначенияOpm.os") 58 | .ИсполняемыйФайл("src/cmd/opm.os"); 59 | -------------------------------------------------------------------------------- /sonar-project.properties: -------------------------------------------------------------------------------- 1 | # must be unique in a given SonarQube instance 2 | sonar.projectKey=opm 3 | 4 | # this is the name displayed in the SonarQube UI 5 | sonar.projectName=opm 6 | 7 | # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. 8 | # Since SonarQube 4.2, this property is optional if sonar.modules is set. 9 | # If not set, SonarQube starts looking for source code from the directory containing 10 | # the sonar-project.properties file. 11 | 12 | sonar.sources=./src 13 | sonar.tests=./tests 14 | 15 | # Encoding of the source code. Default is default system encoding 16 | sonar.sourceEncoding=UTF-8 17 | 18 | sonar.coverageReportPaths=out/genericCoverage.xml 19 | sonar.testExecutionReportPaths=out/tests.xml 20 | -------------------------------------------------------------------------------- /src/cmd/opm.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////// 2 | // 3 | // OneScript Package Manager 4 | // Установщик пакетов для OneScript 5 | // Выполняется, как os-приложение в командной строке: 6 | // 7 | // opm install my-package.ospx 8 | // 9 | //////////////////////////////////////////////////////////////////////// 10 | 11 | #Использовать "../core" 12 | #Использовать "." 13 | #Использовать cli 14 | 15 | Перем ЭтоWindows; 16 | 17 | /////////////////////////////////////////////////////////////////////////////// 18 | 19 | Процедура ВыполнитьПриложение() 20 | 21 | Приложение = Новый КонсольноеПриложение("opm", НСтр("ru='Пакетный менеджер для OneScript';en='Package manager for OneScript'")); 22 | Приложение.Версия("v version", КонстантыOpm.ВерсияПродукта); 23 | 24 | Приложение.ДобавитьКоманду("a app", НСтр("ru='Создать ';en='Create '") + ?(ЭтоWindows, "bat", "sh") + НСтр("ru='-файл для запуска скрипта в указанном каталоге';en='-file to run the script in the specified directory'"), Новый КомандаOpm_App); 25 | Приложение.ДобавитьКоманду("b build", НСтр("ru='Собрать пакет из исходников';en='Build a package from source'"), Новый КомандаOpm_Build); 26 | Приложение.ДобавитьКоманду("c config", НСтр("ru='Задать пользовательские настройки';en='Configure user settings'"), Новый КомандаOpm_Config); 27 | Приложение.ДобавитьКоманду("i install", НСтр("ru='Выполнить установку пакета. 28 | | Если указано имя пакета, происходит установка из хаба или из файла. 29 | | В обратном случае устанавливаются зависимости текущего пакета по файлу packagedef.' 30 | |en='Install the package. 31 | | If the package name is specified, the installation is performed from the hub or from the file. 32 | | Otherwise, the dependencies of the current package are set using the packagedef file.'"), 33 | Новый КомандаOpm_Install); 34 | Приложение.ДобавитьКоманду("ls list", НСтр("ru='Вывести список пакетов';en='Show list of packages'"), Новый КомандаOpm_List); 35 | Приложение.ДобавитьКоманду("pre prepare", НСтр("ru='Подготовить новый каталог разрабатываемого пакета';en='Prepare a new catalog for the development package'"), Новый КомандаOpm_Prepare); 36 | Приложение.ДобавитьКоманду("p push", НСтр("ru='Отправить пакет в хаб пакетов';en='Send the package to the package hub'"), Новый КомандаOpm_Push); 37 | Приложение.ДобавитьКоманду("r run", НСтр("ru='Выполнить произвольную задачу';en='Run a task'"), Новый КомандаOpm_Run); 38 | Приложение.ДобавитьКоманду("test", НСтр("ru='Выполнить тестирование проекта';en='Run project testing'"), Новый КомандаOpm_Test); 39 | Приложение.ДобавитьКоманду("u update", НСтр("ru='Обновить пакет';en='Update package'"), Новый КомандаOpm_Update); 40 | Приложение.ДобавитьКоманду("version", НСтр("ru='Вывести версию продукта';en='show application version'"), Новый КомандаOpm_Version); 41 | Приложение.ДобавитьКоманду("dl download", 42 | НСтр("ru='Скачать файл пакета и файлы зависимостей'; 43 | |en='Download package and dependencies'"), 44 | Новый КомандаOpm_Download); 45 | 46 | Приложение.Запустить(АргументыКоманднойСтроки); 47 | 48 | КонецПроцедуры 49 | 50 | /////////////////////////////////////////////////////// 51 | 52 | СистемнаяИнформация = Новый СистемнаяИнформация; 53 | ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; 54 | 55 | Попытка 56 | 57 | ВыполнитьПриложение(); 58 | 59 | ВременныеФайлы.Удалить(); 60 | 61 | ЗавершитьРаботу(0); 62 | 63 | Исключение 64 | Сообщить(ОписаниеОшибки()); 65 | 66 | ВременныеФайлы.Удалить(); 67 | 68 | ЗавершитьРаботу(1); 69 | КонецПопытки; 70 | -------------------------------------------------------------------------------- /src/cmd/Классы/ИсполнительЗадач.os: -------------------------------------------------------------------------------- 1 | #Использовать logos 2 | #Использовать "../../core" 3 | 4 | Перем Лог; 5 | 6 | Процедура ВыполнитьЗадачу(Знач ИмяЗадачи, Знач ПараметрыЗадачи) Экспорт 7 | 8 | Если ПараметрыЗадачи = Неопределено Тогда 9 | ПараметрыЗадачи = Новый Массив; 10 | КонецЕсли; 11 | 12 | ПутьККаталогуЗадач = ""; 13 | 14 | Попытка 15 | ОписаниеПакета = РаботаСОписаниемПакета.ПрочитатьОписаниеПакета(); 16 | Свойства = ОписаниеПакета.Свойства(); 17 | Если Свойства.Свойство("Задачи") Тогда 18 | ПутьККаталогуЗадач = Свойства.Задачи; 19 | КонецЕсли; 20 | Исключение 21 | Лог.Отладка("Ошибка чтения описания пакета: 22 | |"+ ОписаниеОшибки()); 23 | КонецПопытки; 24 | 25 | Если НЕ ЗначениеЗаполнено(ПутьККаталогуЗадач) Тогда 26 | ПутьККаталогуЗадач = ОбъединитьПути(ТекущийКаталог(), "tasks"); 27 | КонецЕсли; 28 | 29 | КаталогЗадач = Новый Файл(ПутьККаталогуЗадач); 30 | Если НЕ КаталогЗадач.Существует() Тогда 31 | ТекстСообщения = СтрШаблон("Не найден каталог задач: %1", КаталогЗадач.ПолноеИмя); 32 | Лог.Ошибка(ТекстСообщения); 33 | Возврат; 34 | КонецЕсли; 35 | 36 | ПутьКЗадаче = ОбъединитьПути(ПутьККаталогуЗадач, ИмяЗадачи + ".os"); 37 | 38 | ФайлЗадачи = Новый Файл(ПутьКЗадаче); 39 | Если НЕ ФайлЗадачи.Существует() Тогда 40 | ТекстСообщения = СтрШаблон("Файл задачи не существует: %1", ФайлЗадачи.ПолноеИмя); 41 | Лог.Ошибка(ТекстСообщения); 42 | Возврат; 43 | КонецЕсли; 44 | 45 | ПараметрыСценария = Новый Структура("АргументыКоманднойСтроки", ПараметрыЗадачи); 46 | ЗагрузитьСценарий(ПутьКЗадаче, ПараметрыСценария); 47 | 48 | КонецПроцедуры 49 | 50 | Процедура Инициализация() 51 | 52 | Лог = Логирование.ПолучитьЛог("oscript.app.opm"); 53 | 54 | КонецПроцедуры 55 | 56 | Инициализация(); 57 | -------------------------------------------------------------------------------- /src/cmd/Классы/КомандаOpm_App.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////////////////////////// 2 | // Прикладной интерфейс 3 | 4 | Процедура ОписаниеКоманды(Знач КомандаПриложения) Экспорт 5 | 6 | КомандаПриложения.Опция("n app-name", "", "Имя генерируемого исполняемого файла"); 7 | 8 | КомандаПриложения.Аргумент("PATH", "", "Имя скрипта в текущем каталоге или полный путь скрипта"); 9 | КомандаПриложения.Аргумент("DIR", ТекущийКаталог(), "Каталог, в котором будет создан скрипт запуска") 10 | .Обязательный(Ложь); 11 | 12 | КонецПроцедуры 13 | 14 | // Выполняет логику команды 15 | // 16 | // Параметры: 17 | // ПараметрыКоманды - Соответствие ключей командной строки и их значений 18 | // 19 | Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт 20 | 21 | ИмяФайлаЗапуска = КомандаПриложения.ЗначениеОпции("app-name"); 22 | ИмяСкрипта = КомандаПриложения.ЗначениеАргумента("PATH"); 23 | Каталог = КомандаПриложения.ЗначениеАргумента("DIR"); 24 | 25 | СоздатьСкриптЗапуска(ИмяСкрипта, Каталог, ИмяФайлаЗапуска); 26 | 27 | КонецПроцедуры 28 | 29 | Процедура СоздатьСкриптЗапуска(Знач ИмяСкрипта, Знач Каталог, Знач ИмяФайлаЗапуска) Экспорт 30 | 31 | Если ПустаяСтрока(ИмяСкрипта) Тогда 32 | ВызватьИсключение "Не указано имя файла скрипта"; 33 | КонецЕсли; 34 | 35 | ФайлСкрипта = Новый Файл(ИмяСкрипта); 36 | ПолноеИмяСкрипта = ФайлСкрипта.ПолноеИмя; 37 | Если Не ФайлСкрипта.Существует() Тогда 38 | ФайлСкрипта = Новый Файл(ИмяСкрипта + ".os"); 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 | ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; -------------------------------------------------------------------------------- /src/cmd/Классы/КомандаOpm_Build.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////////////////////////// 2 | // Прикладной интерфейс 3 | 4 | Процедура ОписаниеКоманды(Знач КомандаПриложения) Экспорт 5 | 6 | КомандаПриложения.Опция("m mf manifest-file", "", "Файл манифеста сборки (packagedef)"); 7 | КомандаПриложения.Опция("o out out-dir", "", "Выходной каталог"); 8 | 9 | КомандаПриложения.Аргумент("SRC", ТекущийКаталог(), "Каталог исходников") 10 | .Обязательный(Ложь); 11 | 12 | КонецПроцедуры 13 | 14 | // Выполняет логику команды 15 | Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт 16 | 17 | ФайлМанифеста = КомандаПриложения.ЗначениеОпции("mf"); 18 | ВыходнойКаталог = КомандаПриложения.ЗначениеОпции("out"); 19 | КаталогИсходников = КомандаПриложения.ЗначениеАргумента("SRC"); 20 | 21 | Если ПустаяСтрока(ФайлМанифеста) Тогда 22 | ФайлМанифеста = Неопределено; 23 | КонецЕсли; 24 | 25 | Если ПустаяСтрока(ВыходнойКаталог) Тогда 26 | ВыходнойКаталог = Неопределено; 27 | КонецЕсли; 28 | 29 | Сборщик = Новый СборщикПакета(); 30 | Сборщик.СобратьПакет(КаталогИсходников, ФайлМанифеста, ВыходнойКаталог); 31 | 32 | КонецПроцедуры -------------------------------------------------------------------------------- /src/cmd/Классы/КомандаOpm_Config.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////////////////////////// 2 | // Прикладной интерфейс 3 | 4 | Процедура ОписаниеКоманды(Знач КомандаПриложения) Экспорт 5 | 6 | КомандаПриложения.Опция("winCreateBashLauncher", Ложь, "Создавать sh-скрипт запуска для пакетов приложений в среде Windows"); 7 | КомандаПриложения.Опция("proxyusedefault", Ложь, "Использовать ПроксиПоУмолчанию (системные настройки)"); 8 | КомандаПриложения.Опция("proxyserver", "", "Адрес прокси"); 9 | КомандаПриложения.Опция("proxyport", "", "Порт прокси").ТЧисло(); 10 | КомандаПриложения.Опция("proxyuser", "", "Пользователь прокси"); 11 | КомандаПриложения.Опция("proxypass", "", "Пароль прокси"); 12 | 13 | КонецПроцедуры 14 | 15 | // Выполняет логику команды 16 | // 17 | // Параметры: 18 | // ПараметрыКоманды - Соответствие ключей командной строки и их значений 19 | // 20 | Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт 21 | 22 | ПараметрыКоманды = Новый Соответствие; 23 | 24 | winCreateBashLauncher = КомандаПриложения.ЗначениеОпции("winCreateBashLauncher"); 25 | 26 | Если ЗначениеЗаполнено(winCreateBashLauncher) Тогда 27 | ПараметрыКоманды.Вставить("-winCreateBashLauncher", winCreateBashLauncher); 28 | КонецЕсли; 29 | 30 | proxyusedefault = КомандаПриложения.ЗначениеОпции("proxyusedefault"); 31 | 32 | Если ЗначениеЗаполнено(proxyusedefault) Тогда 33 | ПараметрыКоманды.Вставить("-proxyusedefault", proxyusedefault); 34 | КонецЕсли; 35 | 36 | proxyserver = КомандаПриложения.ЗначениеОпции("proxyserver"); 37 | 38 | Если ЗначениеЗаполнено(proxyserver) Тогда 39 | ПараметрыКоманды.Вставить("-proxyserver", proxyserver); 40 | КонецЕсли; 41 | 42 | proxyport = КомандаПриложения.ЗначениеОпции("proxyport"); 43 | 44 | Если ЗначениеЗаполнено(proxyport) Тогда 45 | ПараметрыКоманды.Вставить("-proxyport", proxyport); 46 | КонецЕсли; 47 | 48 | proxyuser = КомандаПриложения.ЗначениеОпции("proxyuser"); 49 | 50 | Если ЗначениеЗаполнено(proxyuser) Тогда 51 | ПараметрыКоманды.Вставить("-proxyuser", proxyuser); 52 | КонецЕсли; 53 | 54 | proxypass = КомандаПриложения.ЗначениеОпции("proxypass"); 55 | 56 | Если ЗначениеЗаполнено(proxypass) Тогда 57 | ПараметрыКоманды.Вставить("-proxypass", proxypass); 58 | КонецЕсли; 59 | 60 | ПараметрыПриложенияOpm.ЗаполнитьНастройкиИзПараметров(ПараметрыКоманды); 61 | ПараметрыПриложенияOpm.СохранитьТекущиеНастройки(); 62 | 63 | КонецПроцедуры -------------------------------------------------------------------------------- /src/cmd/Классы/КомандаOpm_Download.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////////////////////////// 2 | // Прикладной интерфейс 3 | 4 | Процедура ОписаниеКоманды(Знач КомандаПриложения) Экспорт 5 | 6 | КомандаПриложения.Опция("a all", Ложь, "Установить все пакеты, зарегистрированные в хабе"); 7 | КомандаПриложения.Опция("f file", "", "Указать файл из которого нужно установить пакет. Поддерживает указание маски файла для пакетной установки"); 8 | КомандаПриложения.Опция("u url", "", "Указать прямую интернет-ссылку на файл *.ospx из которого нужно установить пакет"); 9 | 10 | КомандаПриложения.Опция("dev", Ложь, "Признак установки пакетов для разработки"); 11 | КомандаПриложения.Опция("s skip-install-deps", Ложь, "признак пропуска установки зависимых пакетов"); 12 | КомандаПриложения.Опция("d dest", "", "Целевой каталог"); 13 | 14 | ОпцияЗеркала = КомандаПриложения.Опция("m mirror", "", "Указать имя сервера, с которого необходимо ставить пакеты. 15 | | Доступные сервера прописываются в конфигурационном файле opm.cfg, параметр 'СервераПакетов'.") 16 | .ВОкружении("OPM_HUB_MIRROR") 17 | .ТПеречисление(); 18 | 19 | МенеджерПолучения = Новый МенеджерПолученияПакетов(); 20 | Для Каждого ДоступноеЗеркало Из МенеджерПолучения.ИменаДоступныхСерверов() Цикл 21 | ОпцияЗеркала.Перечисление(ДоступноеЗеркало, ДоступноеЗеркало, "Сервер '" + ДоступноеЗеркало + "'"); 22 | КонецЦикла; 23 | 24 | КомандаПриложения.Аргумент("PACKAGE", "", "Имя пакета в хабе. Чтобы установить конкретную версию, используйте ИмяПакета@ВерсияПакета") 25 | .ТМассивСтрок() 26 | .Обязательный(Ложь); 27 | 28 | // КомандаПриложения.Спек = "(-a | --all | -l | --local | -d | --dest )"; 29 | 30 | КонецПроцедуры 31 | 32 | Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт 33 | 34 | УстановкаПакетовРазработчика = КомандаПриложения.ЗначениеОпции("dev"); 35 | УстановкаВсехПакетов = КомандаПриложения.ЗначениеОпции("all"); 36 | КаталогУстановки = КомандаПриложения.ЗначениеОпции("dest"); 37 | ФайлПакетаУстановки = КомандаПриложения.ЗначениеОпции("file"); 38 | ИнтернетСсылкаНаПакет = КомандаПриложения.ЗначениеОпции("url"); 39 | МассивПакетовКУстановке = КомандаПриложения.ЗначениеАргумента("PACKAGE"); 40 | 41 | НеобходимоУстановитьЗависимости = Не КомандаПриложения.ЗначениеОпции("skip-install-deps"); 42 | ИмяСервера = КомандаПриложения.ЗначениеОпции("mirror"); 43 | 44 | РежимУстановки = РежимУстановкиПакетов.Скачивание; 45 | 46 | Если Не ПустаяСтрока(КаталогУстановки) Тогда 47 | ЦелевойКаталог = КаталогУстановки; 48 | Иначе 49 | ЦелевойКаталог = ТекущийКаталог(); 50 | КонецЕсли; 51 | Лог = Логирование.ПолучитьЛог(ПараметрыПриложенияOpm.ИмяЛогаСистемы()); 52 | 53 | Лог.Отладка("УстановкаПакетовРазработчика: %1", УстановкаПакетовРазработчика); 54 | Лог.Отладка("УстановкаВсехПакетов: %1", УстановкаВсехПакетов); 55 | Лог.Отладка("КаталогУстановки: %1", КаталогУстановки); 56 | Лог.Отладка("ФайлПакетаУстановки: %1", ФайлПакетаУстановки); 57 | Лог.Отладка("ИнтернетСсылкаНаПакет: %1", ИнтернетСсылкаНаПакет); 58 | Лог.Отладка("МассивПакетовКУстановке: %1", МассивПакетовКУстановке.Количество()); 59 | Лог.Отладка("НеобходимоУстановитьЗависимости: %1", НеобходимоУстановитьЗависимости); 60 | 61 | НастройкаУстановки = РаботаСПакетами.ПолучитьНастройкуУстановки(); 62 | НастройкаУстановки.УстанавливатьЗависимости = НеобходимоУстановитьЗависимости; 63 | НастройкаУстановки.УстанавливатьЗависимостиРазработчика = УстановкаПакетовРазработчика; 64 | НастройкаУстановки.СоздаватьФайлыЗапуска = Ложь; 65 | НастройкаУстановки.ИмяСервера = ИмяСервера; 66 | 67 | Если УстановкаВсехПакетов Тогда 68 | РаботаСПакетами.УстановитьВсеПакетыИзОблака(РежимУстановки, ЦелевойКаталог, НастройкаУстановки); 69 | ИначеЕсли ПустаяСтрока(ФайлПакетаУстановки) И ПустаяСтрока(ИнтернетСсылкаНаПакет) И МассивПакетовКУстановке.Количество() = 0 Тогда 70 | РаботаСПакетами.УстановитьПакетыПоОписаниюПакета(РежимУстановки, ЦелевойКаталог, НастройкаУстановки); 71 | ИначеЕсли НЕ ПустаяСтрока(ФайлПакетаУстановки) Тогда 72 | 73 | РазобранныйАдрес = СтрРазделить(ФайлПакетаУстановки, ПолучитьРазделительПути()); 74 | Путь = "."; 75 | Маска = ФайлПакетаУстановки; 76 | Если РазобранныйАдрес.Количество() > 1 Тогда // отделим последнюю секцию как имя файла, а остальное опять соберем в строку пути 77 | 78 | Маска = РазобранныйАдрес[РазобранныйАдрес.Количество() - 1]; 79 | РазобранныйАдрес.Удалить(РазобранныйАдрес.Количество() - 1); 80 | Путь = СтрСоединить(РазобранныйАдрес, ПолучитьРазделительПути()); 81 | 82 | КонецЕсли; 83 | 84 | ФайлыПоМаске = НайтиФайлы(Путь, Маска); 85 | Для Каждого ФайлПакета Из ФайлыПоМаске Цикл 86 | 87 | РаботаСПакетами.УстановитьПакетИзФайла(ФайлПакета.ПолноеИмя, РежимУстановки, ЦелевойКаталог, НастройкаУстановки); 88 | 89 | КонецЦикла; 90 | 91 | ИначеЕсли НЕ ПустаяСтрока(ИнтернетСсылкаНаПакет) Тогда 92 | 93 | позСервер = СтрНайти(ИнтернетСсылкаНаПакет, "/", , , 3); 94 | Сервер = Лев(ИнтернетСсылкаНаПакет, позСервер-1); 95 | Адрес = Сред(ИнтернетСсылкаНаПакет, позСервер); 96 | Если Нрег(Лев(Сервер, 5)) = "https" Тогда 97 | Порт = 443; 98 | Иначе 99 | Порт = 80; 100 | КонецЕсли; 101 | 102 | Соединение = Новый HTTPСоединение(Сервер, Порт); 103 | Запрос = Новый HTTPЗапрос(Адрес); 104 | Ответ = Соединение.Получить(Запрос); 105 | ДД = Ответ.ПолучитьТелоКакДвоичныеДанные(); 106 | ИмяВременногоФайла = ПолучитьИмяВременногоФайла("ospx"); 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 | Возврат СтрЗаканчиваетсяНа(НРег(ИмяПакета), ".ospx"); 136 | 137 | КонецФункции 138 | -------------------------------------------------------------------------------- /src/cmd/Классы/КомандаOpm_Install.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////////////////////////// 2 | // Прикладной интерфейс 3 | 4 | Процедура ОписаниеКоманды(Знач КомандаПриложения) Экспорт 5 | 6 | КомандаПриложения.Опция("a all", Ложь, "Установить все пакеты, зарегистрированные в хабе"); 7 | КомандаПриложения.Опция("f file", "", "Указать файл из которого нужно установить пакет. Поддерживает указание маски файла для пакетной установки"); 8 | КомандаПриложения.Опция("u url", "", "Указать прямую интернет-ссылку на файл *.ospx из которого нужно установить пакет"); 9 | 10 | КомандаПриложения.Опция("l local", Ложь, "Установить пакеты в локальный каталог oscript_modules"); 11 | КомандаПриложения.Опция("dev", Ложь, "Признак установки пакетов для разработки"); 12 | КомандаПриложения.Опция("s skip-install-deps", Ложь, "признак пропуска установки зависимых пакетов"); 13 | КомандаПриложения.Опция("skip-create-app", Ложь, "признак отключения создания файла запуска"); 14 | КомандаПриложения.Опция("d dest", "", "Переопределить стандартный каталог в который устанавливаются пакеты (вместо oscript_modules)"); 15 | 16 | ОпцияЗеркала = КомандаПриложения.Опция("m mirror", "", "Указать имя сервера, с которого необходимо ставить пакеты. 17 | | Доступные сервера прописываются в конфигурационном файле opm.cfg, параметр 'СервераПакетов'.") 18 | .ВОкружении("OPM_HUB_MIRROR") 19 | .ТПеречисление(); 20 | 21 | МенеджерПолучения = Новый МенеджерПолученияПакетов(); 22 | Для Каждого ДоступноеЗеркало Из МенеджерПолучения.ИменаДоступныхСерверов() Цикл 23 | ОпцияЗеркала.Перечисление(ДоступноеЗеркало, ДоступноеЗеркало, "Сервер '" + ДоступноеЗеркало + "'"); 24 | КонецЦикла; 25 | 26 | КомандаПриложения.Аргумент("PACKAGE", "", "Имя пакета в хабе. Чтобы установить конкретную версию, используйте ИмяПакета@ВерсияПакета") 27 | .ТМассивСтрок() 28 | .Обязательный(Ложь); 29 | 30 | // КомандаПриложения.Спек = "(-a | --all | -l | --local | -d | --dest )"; 31 | 32 | КонецПроцедуры 33 | 34 | Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт 35 | 36 | УстановкаВЛокальныйКаталог = КомандаПриложения.ЗначениеОпции("local"); 37 | УстановкаПакетовРазработчика = КомандаПриложения.ЗначениеОпции("dev"); 38 | УстановкаВсехПакетов = КомандаПриложения.ЗначениеОпции("all"); 39 | КаталогУстановки = КомандаПриложения.ЗначениеОпции("dest"); 40 | ФайлПакетаУстановки = КомандаПриложения.ЗначениеОпции("file"); 41 | ИнтернетСсылкаНаПакет = КомандаПриложения.ЗначениеОпции("url"); 42 | МассивПакетовКУстановке = КомандаПриложения.ЗначениеАргумента("PACKAGE"); 43 | 44 | НеобходимоУстановитьЗависимости = Не КомандаПриложения.ЗначениеОпции("skip-install-deps"); 45 | СоздаватьФайлыЗапуска = НЕ КомандаПриложения.ЗначениеОпции("skip-create-app"); 46 | ИмяСервера = КомандаПриложения.ЗначениеОпции("mirror"); 47 | 48 | РежимУстановки = РежимУстановкиПакетов.Глобально; 49 | Если УстановкаВЛокальныйКаталог Тогда 50 | РежимУстановки = РежимУстановкиПакетов.Локально; 51 | КонецЕсли; 52 | 53 | ЦелевойКаталог = Неопределено; 54 | 55 | Если Не ПустаяСтрока(КаталогУстановки) Тогда 56 | ЦелевойКаталог = КаталогУстановки; 57 | КонецЕсли; 58 | Лог = Логирование.ПолучитьЛог(ПараметрыПриложенияOpm.ИмяЛогаСистемы()); 59 | 60 | Если (РежимУстановки = РежимУстановкиПакетов.Локально) И ЗначениеЗаполнено(ЦелевойКаталог) Тогда 61 | Лог.Предупреждение("При локальной установке параметр -dest игнорируется"); 62 | ЦелевойКаталог = Неопределено; 63 | КонецЕсли; 64 | 65 | Лог.Отладка("УстановкаВЛокальныйКаталог: %1", УстановкаВЛокальныйКаталог); 66 | Лог.Отладка("УстановкаПакетовРазработчика: %1", УстановкаПакетовРазработчика); 67 | Лог.Отладка("УстановкаВсехПакетов: %1", УстановкаВсехПакетов); 68 | Лог.Отладка("КаталогУстановки: %1", КаталогУстановки); 69 | Лог.Отладка("ФайлПакетаУстановки: %1", ФайлПакетаУстановки); 70 | Лог.Отладка("ИнтернетСсылкаНаПакет: %1", ИнтернетСсылкаНаПакет); 71 | Лог.Отладка("МассивПакетовКУстановке: %1", МассивПакетовКУстановке.Количество()); 72 | Лог.Отладка("НеобходимоУстановитьЗависимости: %1", НеобходимоУстановитьЗависимости); 73 | Лог.Отладка("СоздаватьФайлыЗапуска: %1", СоздаватьФайлыЗапуска); 74 | 75 | НастройкаУстановки = РаботаСПакетами.ПолучитьНастройкуУстановки(); 76 | НастройкаУстановки.УстанавливатьЗависимости = НеобходимоУстановитьЗависимости; 77 | НастройкаУстановки.УстанавливатьЗависимостиРазработчика = УстановкаПакетовРазработчика; 78 | НастройкаУстановки.СоздаватьФайлыЗапуска = СоздаватьФайлыЗапуска; 79 | НастройкаУстановки.ИмяСервера = ИмяСервера; 80 | 81 | Если УстановкаВсехПакетов Тогда 82 | РаботаСПакетами.УстановитьВсеПакетыИзОблака(РежимУстановки, ЦелевойКаталог, НастройкаУстановки); 83 | ИначеЕсли ПустаяСтрока(ФайлПакетаУстановки) И ПустаяСтрока(ИнтернетСсылкаНаПакет) И МассивПакетовКУстановке.Количество() = 0 Тогда 84 | РаботаСПакетами.УстановитьПакетыПоОписаниюПакета(РежимУстановки, ЦелевойКаталог, НастройкаУстановки); 85 | ИначеЕсли НЕ ПустаяСтрока(ФайлПакетаУстановки) Тогда 86 | 87 | РазобранныйАдрес = СтрРазделить(ФайлПакетаУстановки, ПолучитьРазделительПути()); 88 | Путь = "."; 89 | Маска = ФайлПакетаУстановки; 90 | Если РазобранныйАдрес.Количество() > 1 Тогда // отделим последнюю секцию как имя файла, а остальное опять соберем в строку пути 91 | 92 | Маска = РазобранныйАдрес[РазобранныйАдрес.Количество() - 1]; 93 | РазобранныйАдрес.Удалить(РазобранныйАдрес.Количество() - 1); 94 | Путь = СтрСоединить(РазобранныйАдрес, ПолучитьРазделительПути()); 95 | 96 | КонецЕсли; 97 | 98 | ФайлыПоМаске = НайтиФайлы(Путь, Маска); 99 | Для Каждого ФайлПакета Из ФайлыПоМаске Цикл 100 | 101 | РаботаСПакетами.УстановитьПакетИзФайла(ФайлПакета.ПолноеИмя, РежимУстановки, ЦелевойКаталог, НастройкаУстановки); 102 | 103 | КонецЦикла; 104 | 105 | ИначеЕсли НЕ ПустаяСтрока(ИнтернетСсылкаНаПакет) Тогда 106 | 107 | позСервер = СтрНайти(ИнтернетСсылкаНаПакет, "/", , , 3); 108 | Сервер = Лев(ИнтернетСсылкаНаПакет, позСервер-1); 109 | Адрес = Сред(ИнтернетСсылкаНаПакет, позСервер); 110 | Если Нрег(Лев(Сервер, 5)) = "https" Тогда 111 | Порт = 443; 112 | Иначе 113 | Порт = 80; 114 | КонецЕсли; 115 | 116 | Соединение = Новый HTTPСоединение(Сервер, Порт); 117 | Запрос = Новый HTTPЗапрос(Адрес); 118 | Ответ = Соединение.Получить(Запрос); 119 | ДД = Ответ.ПолучитьТелоКакДвоичныеДанные(); 120 | ИмяВременногоФайла = ПолучитьИмяВременногоФайла("ospx"); 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 | Возврат СтрЗаканчиваетсяНа(НРег(ИмяПакета), ".ospx"); 150 | 151 | КонецФункции 152 | -------------------------------------------------------------------------------- /src/cmd/Классы/КомандаOpm_List.os: -------------------------------------------------------------------------------- 1 | #Использовать fluent 2 | 3 | /////////////////////////////////////////////////////////////////////////////////////////////////// 4 | // Прикладной интерфейс 5 | 6 | Процедура ОписаниеКоманды(Знач КомандаПриложения) Экспорт 7 | 8 | КомандаПриложения.Опция("q quiet", Ложь, """Тихий"" режим вывода без лишних сообщений."); 9 | КомандаПриложения.Опция("r remote", Ложь, "Вывести список пакетов в хабе"); 10 | КомандаПриложения.Опция("a all", Ложь, "Вывести список всех пакетов установленных и доступных в хабе"); 11 | 12 | КонецПроцедуры 13 | 14 | Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт 15 | 16 | ТихийРежим = КомандаПриложения.ЗначениеОпции("quiet"); 17 | ВыводВсехПакетов = КомандаПриложения.ЗначениеОпции("all"); 18 | ВыводПакетовНаХабе = КомандаПриложения.ЗначениеОпции("remote") ИЛИ ВыводВсехПакетов; 19 | ВыводУстановленныхПакетов = НЕ КомандаПриложения.ЗначениеОпции("remote") ИЛИ ВыводВсехПакетов; 20 | 21 | Если ВыводВсехПакетов Тогда 22 | 23 | ТекстСообщения = "Все пакеты, установленные и в хабе:"; 24 | 25 | Иначе 26 | 27 | ТекстСообщения = ?(ВыводПакетовНаХабе, "Пакеты в хабе:", "Установленные пакеты:"); 28 | 29 | КонецЕсли; 30 | 31 | МенеджерПолучения = Новый МенеджерПолученияПакетов(); 32 | ДоступныеПакеты = МенеджерПолучения.ПолучитьДоступныеПакеты(); 33 | 34 | ПутьККаталогуПакетов = ПолучитьЗначениеСистемнойНастройки("lib.system"); 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 | ДобавленныйПакет[0].Версия = Версия; 75 | ДобавленныйПакет[0].Выводить = ИСТИНА; // Пакет есть и на хабе и локально, стоит вывести 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 | Сообщить(СтрЗаменить(Лев(ПустаяСтрока, ДлинаИмени + ДлинаВерсии + ДлинаИменСерверов + 6), " ", "-")); 133 | ВывестиСтрокуИнфо(ДлинаИмени, "Пакет", ДлинаВерсии, "Версия", ДлинаИменСерверов, "Имена серверов"); 134 | Сообщить(СтрЗаменить(Лев(ПустаяСтрока, ДлинаИмени + ДлинаВерсии + ДлинаИменСерверов + 6), " ", "-")); 135 | 136 | КонецПроцедуры 137 | 138 | Процедура ВывестиСтрокуИнфо(ДлинаИмени, ИмяПакета, ДлинаВерсии, Версия, ДлинаИменСерверов, ИменаСерверов) 139 | 140 | ПустаяСтрока = " "; 141 | Шаблон = "%1" + Лев(ПустаяСтрока, ДлинаИмени - СтрДлина(ИмяПакета)) 142 | + " | %2" + Лев(ПустаяСтрока, ДлинаВерсии - СтрДлина(Версия)) 143 | + " | %3" + Лев(ПустаяСтрока, ДлинаИменСерверов - СтрДлина(ИменаСерверов)); 144 | Сообщить(СтрШаблон(Шаблон, ИмяПакета, Версия, ИменаСерверов)); 145 | 146 | КонецПроцедуры 147 | -------------------------------------------------------------------------------- /src/cmd/Классы/КомандаOpm_Prepare.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////////////////////////// 2 | // Прикладной интерфейс 3 | 4 | Процедура ОписаниеКоманды(Знач КомандаПриложения) Экспорт 5 | 6 | КомандаПриложения.Аргумент("PATH", "", "Каталог, в котором будет вестись разработка"); 7 | 8 | КонецПроцедуры 9 | 10 | Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт 11 | 12 | ВыходнойКаталог = КомандаПриложения.ЗначениеАргумента("PATH"); 13 | Сборщик = Новый СборщикПакета(); 14 | Сборщик.ПодготовитьКаталогПроекта(ВыходнойКаталог); 15 | 16 | КонецПроцедуры 17 | -------------------------------------------------------------------------------- /src/cmd/Классы/КомандаOpm_Push.os: -------------------------------------------------------------------------------- 1 | #Использовать asserts 2 | #Использовать logos 3 | #Использовать gitrunner 4 | 5 | Перем ДопустимыеИменаКаналов; 6 | Перем Лог; 7 | 8 | /////////////////////////////////////////////////////////////////////////////////////////////////// 9 | // Прикладной интерфейс 10 | 11 | Процедура ОписаниеКоманды(Знач КомандаПриложения) Экспорт 12 | 13 | КомандаПриложения.Опция("token", "", "Токен авторизации на GitHub.com 14 | | - Токен авторизации создается на странице https://github.com/settings/tokens 15 | | - Токен используется только для проверки авторизации на GitHub.com и прав на репозиторий, 16 | | выдача дополнительных разрешений в ""scopes"" НЕ требуется.") 17 | .ВОкружении("GITHUB_OAUTH_TOKEN"); 18 | ; 19 | КомандаПриложения.Опция("f file", "", "Маска или имя файла пакета."); 20 | КомандаПриложения.Опция("c channel", "auto", "Канал публикации.") 21 | .ТПеречисление() 22 | .Перечисление("auto", "auto", "Автоматическое определение канала. 23 | | В случае отправки из ветки master гит-репозитория данный параметр можно опустить - будет использоваться канал ""stable"". 24 | | В любых других случаях его заполнение обязательно.") 25 | .Перечисление("stable", "stable", "Канал содержащий стабильные версии пакетов") 26 | .Перечисление("dev", "dev" , "Канал содержащий разработческие версии пакетов") 27 | .ВОкружении("OPM_HUB_CHANNEL"); 28 | ОпцияЗеркала = КомандаПриложения.Опция("m mirror", "СерверУдаленногоХранилища", "Имя сервера для публикации. 29 | | Доступные сервера прописываются в конфигурационном файле opm.cfg, параметр 'СервераПакетов'.") 30 | .ВОкружении("OPM_HUB_MIRROR") 31 | .ТПеречисление(); 32 | 33 | МенеджерПолучения = Новый МенеджерПолученияПакетов(); 34 | Для Каждого ДоступноеЗеркало Из МенеджерПолучения.ИменаДоступныхСерверов() Цикл 35 | ОпцияЗеркала.Перечисление(ДоступноеЗеркало, ДоступноеЗеркало, "Сервер '" + ДоступноеЗеркало + "'"); 36 | КонецЦикла; 37 | 38 | КомандаПриложения.Аргумент("FILE", "", "Маска или имя файла пакета.") 39 | .Обязательный(Ложь); 40 | 41 | КонецПроцедуры 42 | 43 | Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт 44 | 45 | ТокенАвторизации = КомандаПриложения.ЗначениеОпции("token"); 46 | МаскаФайлаПакетаСтарая = КомандаПриложения.ЗначениеОпции("file"); 47 | ИмяКаналаПубликации = КомандаПриложения.ЗначениеОпции("channel"); 48 | ИмяСервераПакетов = КомандаПриложения.ЗначениеОпции("mirror"); 49 | 50 | Если ПустаяСтрока(ТокенАвторизации) Тогда 51 | НастройкиИзФайла = ПараметрыПриложенияOpm.СобратьНастройкиИзФайлов(); 52 | Если НастройкиИзФайла.Свойство("ТокенПубликацииПакетов") Тогда 53 | ТокенАвторизации = НастройкиИзФайла.ТокенПубликацииПакетов; 54 | КонецЕсли; 55 | КонецЕсли; 56 | 57 | МаскаФайлаПакета = КомандаПриложения.ЗначениеАргумента("FILE"); 58 | 59 | Если Не ПустаяСтрока(МаскаФайлаПакетаСтарая) Тогда 60 | Лог.Предупреждение("Использование опции <--file> устарело в следующих версиях будет удалена. Используйте аргумент "); 61 | МаскаФайлаПакета = МаскаФайлаПакетаСтарая; 62 | КонецЕсли; 63 | 64 | Ожидаем.Что(МаскаФайлаПакета, СтрШаблон("Не заполнено значение обязательного параметра %1", МаскаФайлаПакета)).Заполнено(); 65 | 66 | ФайлПакета = ПолучитьФайлПакета(МаскаФайлаПакета); 67 | 68 | Канал = ПолучитьИмяКаналаПубликации(ИмяКаналаПубликации); 69 | 70 | ОтправитьПакетВХаб(ТокенАвторизации, ФайлПакета, Канал, ИмяСервераПакетов); 71 | 72 | КонецПроцедуры 73 | 74 | Функция ПолучитьИмяКаналаПубликации(Знач ИмяКаналаПубликации) 75 | 76 | ГитРепозиторий = Новый ГитРепозиторий(); 77 | ГитРепозиторий.УстановитьРабочийКаталог(ТекущийКаталог()); 78 | 79 | КаналПубликации = СокрЛП(ИмяКаналаПубликации); 80 | 81 | Если КаналПубликации = "auto" Тогда 82 | 83 | Если НЕ ГитРепозиторий.ЭтоРепозиторий() Тогда 84 | ВызватьИсключение "Не заполнено значение обязательного параметра --channel"; 85 | КонецЕсли; 86 | 87 | ИмяВетки = ГитРепозиторий.ПолучитьТекущуюВетку(); 88 | Если ИмяВетки <> "master" Тогда 89 | ВызватьИсключение "Не заполнено значение обязательного параметра --channel"; 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 | Если НайденныеФайлы.Количество() = 0 Тогда 128 | ВызватьИсключение "По переданной маске файла пакета не найдено файлов"; 129 | КонецЕсли; 130 | Если НайденныеФайлы.Количество() > 1 Тогда 131 | ВызватьИсключение "По переданной маске файла пакета найдено больше одного файла"; 132 | КонецЕсли; 133 | 134 | Возврат НайденныеФайлы[0]; 135 | 136 | КонецФункции 137 | 138 | Процедура ОтправитьПакетВХаб(Знач ТокенАвторизации, Знач ФайлПакета, Знач Канал, Знач ИмяСервераПакетов) 139 | 140 | ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ФайлПакета.ПолноеИмя); 141 | ДвоичныеДанныеФайлаВBase64 = Base64Строка(ДвоичныеДанныеФайла); 142 | 143 | ДоступныеСервераПакетов = НастройкиOpm.ПолучитьНастройки().СервераПакетов; 144 | 145 | // Для настроек по умолчанию 146 | Сервер = КонстантыOpm.СерверУдаленногоХранилища; 147 | Ресурс = КонстантыOpm.РесурсПубликацииПакетов; 148 | Авторизация = Неопределено; 149 | ДополнительныеЗаголовки = Неопределено; 150 | Таймаут = 600; 151 | 152 | Для Каждого НастройкаСервера Из ДоступныеСервераПакетов Цикл 153 | 154 | Если СтрСравнить(НастройкаСервера.Имя, ИмяСервераПакетов) = 0 Тогда 155 | Сервер = НастройкаСервера.Сервер; 156 | Ресурс = НастройкаСервера.РесурсПубликацииПакетов; 157 | Авторизация = НастройкаСервера.Авторизация; 158 | ДополнительныеЗаголовки = НастройкаСервера.ДополнительныеЗаголовки; 159 | Таймаут = НастройкаСервера.Таймаут; 160 | Прервать; 161 | КонецЕсли; 162 | 163 | КонецЦикла; 164 | 165 | Лог.Отладка("Сервер = %1", Сервер); 166 | Лог.Отладка("Ресурс = %1", Ресурс); 167 | 168 | Заголовки = Новый Соответствие(); 169 | Если ЗначениеЗаполнено(Авторизация) Тогда 170 | Заголовки.Вставить("Authorization", ОбщегоНазначенияOpm.ПрименитьПеременныеСреды(Авторизация)); 171 | Иначе 172 | Заголовки.Вставить("OAUTH-TOKEN", ТокенАвторизации); 173 | КонецЕсли; 174 | Заголовки.Вставить("FILE-NAME", ФайлПакета.Имя); 175 | Заголовки.Вставить("CHANNEL", Канал); 176 | Если ЗначениеЗаполнено(ДополнительныеЗаголовки) Тогда 177 | Для Каждого мЗаголовок Из ДополнительныеЗаголовки Цикл 178 | Заголовки.Вставить(мЗаголовок.Ключ, ОбщегоНазначенияOpm.ПрименитьПеременныеСреды(мЗаголовок.Значение)); 179 | КонецЦикла; 180 | КонецЕсли; 181 | 182 | Соединение = Новый HTTPСоединение(Сервер,,,,, Таймаут); 183 | Запрос = Новый HTTPЗапрос(Ресурс, Заголовки); 184 | Запрос.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеФайла); 185 | 186 | Ответ = Соединение.ОтправитьДляОбработки(Запрос); 187 | ТелоОтвета = Ответ.ПолучитьТелоКакСтроку(); 188 | 189 | Если Не КодУспешнойОтправки(Ответ.КодСостояния) Тогда 190 | ВызватьИсключение ТелоОтвета; 191 | КонецЕсли; 192 | 193 | Лог.Информация(ТелоОтвета); 194 | 195 | КонецПроцедуры 196 | 197 | Функция КодУспешнойОтправки(Знач КодСостояния) 198 | 199 | Возврат КодСостояния = 200 // OK 200 | Или КодСостояния = 201 // CREATED 201 | Или КодСостояния = 202 // ACCEPTED 202 | ; 203 | 204 | КонецФункции 205 | 206 | Лог = Логирование.ПолучитьЛог("oscript.app.opm"); 207 | 208 | ДопустимыеИменаКаналов = Новый Структура; 209 | ДопустимыеИменаКаналов.Вставить("Стабильный", "stable"); 210 | ДопустимыеИменаКаналов.Вставить("Разработческий", "dev"); 211 | -------------------------------------------------------------------------------- /src/cmd/Классы/КомандаOpm_Run.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////////////////////////// 2 | // Прикладной интерфейс 3 | 4 | Процедура ОписаниеКоманды(Знач КомандаПриложения) Экспорт 5 | 6 | КомандаПриложения.Аргумент("TASK", "", "Имя выполняемой задачи."); 7 | КомандаПриложения.Аргумент("ARGS", "", "Коллекция параметров, передаваемых задаче") 8 | .ТМассивСтрок() 9 | .Обязательный(Ложь); 10 | 11 | КонецПроцедуры 12 | 13 | Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт 14 | 15 | ИмяЗадачи = КомандаПриложения.ЗначениеАргумента("TASK"); 16 | ПараметрыЗадачи = КомандаПриложения.ЗначениеАргумента("ARGS"); 17 | 18 | ИсполнительЗадач = Новый ИсполнительЗадач(); 19 | ИсполнительЗадач.ВыполнитьЗадачу(ИмяЗадачи, ПараметрыЗадачи); 20 | 21 | КонецПроцедуры -------------------------------------------------------------------------------- /src/cmd/Классы/КомандаOpm_Test.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////////////////////////// 2 | // Прикладной интерфейс 3 | 4 | 5 | Процедура ОписаниеКоманды(Знач КомандаПриложения) Экспорт 6 | 7 | КомандаПриложения.Аргумент("ARGS", "", "Коллекция параметров, передаваемых задаче") 8 | .ТМассивСтрок() 9 | .Обязательный(Ложь); 10 | 11 | КонецПроцедуры 12 | 13 | Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт 14 | 15 | ИмяЗадачи = "test"; 16 | ПараметрыЗадачи = КомандаПриложения.ЗначениеАргумента("ARGS"); 17 | 18 | ИсполнительЗадач = Новый ИсполнительЗадач(); 19 | ИсполнительЗадач.ВыполнитьЗадачу(ИмяЗадачи, ПараметрыЗадачи); 20 | 21 | КонецПроцедуры -------------------------------------------------------------------------------- /src/cmd/Классы/КомандаOpm_Update.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////////////////////////// 2 | // Прикладной интерфейс 3 | 4 | Процедура ОписаниеКоманды(Знач КомандаПриложения) Экспорт 5 | 6 | КомандаПриложения.Опция("a all", Ложь, "Обновить все установленные пакеты"); 7 | КомандаПриложения.Опция("f file", "", "Указать файл из которого нужно установить пакет"); 8 | КомандаПриложения.Опция("u url", "", "Указать прямую интернет-ссылку на файл *.ospx из которого нужно установить пакет"); 9 | 10 | КомандаПриложения.Опция("l local", Ложь, "Обновление пакета в локальном каталоге oscript_modules"); 11 | КомандаПриложения.Опция("s skip-install-deps", Ложь, "признак пропуска установки зависимых пакетов"); 12 | КомандаПриложения.Опция("skip-create-app", Ложь, "признак отключения создания файла запуска"); 13 | КомандаПриложения.Опция("m mirror", "", "Указать имя сервера, с которого необходимо ставить пакеты"); 14 | 15 | ОпцияЗеркала = КомандаПриложения.Опция("m mirror", "", "Указать имя сервера, с которого необходимо ставить пакеты. 16 | | Доступные сервера прописываются в конфигурационном файле opm.cfg, параметр 'СервераПакетов'.") 17 | .ВОкружении("OPM_HUB_MIRROR") 18 | .ТПеречисление(); 19 | 20 | МенеджерПолучения = Новый МенеджерПолученияПакетов(); 21 | Для Каждого ДоступноеЗеркало Из МенеджерПолучения.ИменаДоступныхСерверов() Цикл 22 | ОпцияЗеркала.Перечисление(ДоступноеЗеркало, ДоступноеЗеркало, "Сервер '" + ДоступноеЗеркало + "'"); 23 | КонецЦикла; 24 | 25 | КомандаПриложения.Аргумент("PACKAGE", "", "Имя пакета в хабе. Чтобы установить конкретную версию, используйте ИмяПакета@ВерсияПакета") 26 | .ТМассивСтрок() 27 | .Обязательный(Ложь); 28 | 29 | // КомандаПриложения.Спек = "(-a | --all | -l | --local | -d | --dest )"; 30 | 31 | КонецПроцедуры 32 | 33 | Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт 34 | 35 | ОбновлениеВЛокальныйКаталог = КомандаПриложения.ЗначениеОпции("local"); 36 | ОбновлениеВсехПакетов = КомандаПриложения.ЗначениеОпции("all"); 37 | ФайлПакетаУстановки = КомандаПриложения.ЗначениеОпции("file"); 38 | ИнтернетСсылкаНаПакет = КомандаПриложения.ЗначениеОпции("url"); 39 | МассивПакетовКОбновлению = КомандаПриложения.ЗначениеАргумента("PACKAGE"); 40 | 41 | НеобходимУстановитьЗависимости = Не КомандаПриложения.ЗначениеОпции("skip-install-deps"); 42 | СоздаватьФайлыЗапуска = НЕ КомандаПриложения.ЗначениеОпции("skip-create-app"); 43 | ИмяСервера = КомандаПриложения.ЗначениеОпции("mirror"); 44 | 45 | РежимУстановки = РежимУстановкиПакетов.Глобально; 46 | 47 | Если ОбновлениеВЛокальныйКаталог = Истина Тогда 48 | РежимУстановки = РежимУстановкиПакетов.Локально; 49 | КонецЕсли; 50 | 51 | НастройкаУстановки = РаботаСПакетами.ПолучитьНастройкуУстановки(); 52 | НастройкаУстановки.УстанавливатьЗависимости = НеобходимУстановитьЗависимости; 53 | НастройкаУстановки.СоздаватьФайлыЗапуска = СоздаватьФайлыЗапуска; 54 | НастройкаУстановки.ИмяСервера = ИмяСервера; 55 | 56 | Если ОбновлениеВсехПакетов Тогда 57 | РаботаСПакетами.ОбновитьУстановленныеПакеты(РежимУстановки, , НастройкаУстановки); 58 | ИначеЕсли НЕ ПустаяСтрока(ФайлПакетаУстановки) Тогда 59 | РаботаСПакетами.УстановитьПакетИзФайла(ФайлПакетаУстановки, РежимУстановки, , НастройкаУстановки); 60 | 61 | ИначеЕсли НЕ ПустаяСтрока(ИнтернетСсылкаНаПакет) Тогда 62 | 63 | позСервер = СтрНайти(ИнтернетСсылкаНаПакет, "/", , , 3); 64 | Сервер = Лев(ИнтернетСсылкаНаПакет, позСервер-1); 65 | Адрес = Сред(ИнтернетСсылкаНаПакет, позСервер); 66 | Если Нрег(Лев(Сервер, 5)) = "https" Тогда 67 | Порт = 443; 68 | Иначе 69 | Порт = 80; 70 | КонецЕсли; 71 | 72 | Соединение = Новый HTTPСоединение(Сервер, Порт); 73 | Запрос = Новый HTTPЗапрос(Адрес); 74 | Ответ = Соединение.Получить(Запрос); 75 | ДД = Ответ.ПолучитьТелоКакДвоичныеДанные(); 76 | ИмяВременногоФайла = ПолучитьИмяВременногоФайла("ospx"); 77 | ДД.Записать(ИмяВременногоФайла); 78 | 79 | РаботаСПакетами.УстановитьПакетИзФайла(ИмяВременногоФайла, РежимУстановки, , НастройкаУстановки); 80 | 81 | УдалитьФайлы(ИмяВременногоФайла); 82 | 83 | Иначе 84 | 85 | Для каждого ИмяПакета Из МассивПакетовКОбновлению Цикл 86 | РаботаСПакетами.ОбновитьПакетИзОблака(ИмяПакета, РежимУстановки, , НастройкаУстановки); 87 | КонецЦикла; 88 | 89 | КонецЕсли; 90 | 91 | КонецПроцедуры 92 | -------------------------------------------------------------------------------- /src/cmd/Классы/КомандаOpm_Version.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////////////////////////// 2 | // Прикладной интерфейс 3 | 4 | Процедура ОписаниеКоманды(Знач КомандаПриложения) Экспорт 5 | 6 | // КомандаПриложения.Опция("f full-version", Ложь, "Вывод полного описания версии"); 7 | 8 | КонецПроцедуры 9 | 10 | // Выполняет логику команды 11 | // 12 | // Параметры: 13 | // ПараметрыКоманды - Соответствие ключей командной строки и их значений 14 | // 15 | Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт 16 | Сообщить(КонстантыOpm.ВерсияПродукта); 17 | КонецПроцедуры -------------------------------------------------------------------------------- /src/cmd/Классы/ШаблонКоманды.os-template: -------------------------------------------------------------------------------- 1 | 2 | /////////////////////////////////////////////////////////////////////////////////////////////////// 3 | // Прикладной интерфейс 4 | 5 | Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт 6 | 7 | КонецПроцедуры 8 | 9 | // Выполняет логику команды 10 | // 11 | // Параметры: 12 | // ПараметрыКоманды - Соответствие ключей командной строки и их значений 13 | // 14 | Функция ВыполнитьКоманду(Знач ПараметрыКоманды) Экспорт 15 | ВызватьИсключение "Не реализовано" 16 | КонецФункции -------------------------------------------------------------------------------- /src/cmd/Модули/ПараметрыПриложенияOpm.os: -------------------------------------------------------------------------------- 1 | 2 | Перем Лог; 3 | 4 | Функция ИмяЛогаСистемы() Экспорт 5 | Возврат "oscript.app.opm"; 6 | КонецФункции 7 | 8 | Процедура НастроитьOpm() Экспорт 9 | 10 | НастройкиOpmИзФайлов = СобратьНастройкиИзФайлов(); 11 | 12 | Если НастройкиOpmИзФайлов.Количество() = 0 Тогда 13 | Лог.Отладка("Настройки opm не найдены"); 14 | Возврат; 15 | КонецЕсли; 16 | 17 | НастройкиПроксиЕсть = ПолучитьЗначение(НастройкиOpmИзФайлов,"Прокси", Неопределено); 18 | 19 | Если Не НастройкиПроксиЕсть = Неопределено Тогда 20 | 21 | НастройкиПрокси = НастройкиКакСтруктура(НастройкиOpmИзФайлов.Прокси); 22 | 23 | Сервер = ПолучитьЗначение(НастройкиПрокси, "Сервер", ""); 24 | Порт = Число(ПолучитьЗначение(НастройкиПрокси, "Порт", 80)); 25 | Пользователь = ПолучитьЗначение(НастройкиПрокси, "Пользователь", ""); 26 | Пароль = ПолучитьЗначение(НастройкиПрокси, "Пароль", ""); 27 | 28 | ПроксиПоУмолчанию = ПолучитьЗначение(НастройкиПрокси,"ПроксиПоУмолчанию", Неопределено); 29 | ИспользованиеПрокси = ПолучитьЗначение(НастройкиПрокси, "ИспользоватьПрокси", Неопределено); 30 | 31 | Если ИспользованиеПрокси = Истина Тогда 32 | НастройкиOpm.УстановитьИспользованиеПрокси(ИспользованиеПрокси); 33 | 34 | Если Не ПроксиПоУмолчанию = Неопределено Тогда 35 | НастройкиOpm.УстановитьСистемныеНастройкиПроксиСервера(ПроксиПоУмолчанию); 36 | КонецЕсли; 37 | 38 | Если ПроксиПоУмолчанию = Неопределено Или ПроксиПоУмолчанию = Ложь Тогда 39 | НастройкиOpm.УстановитьНастройкиПроксиСервера(Сервер, Порт, Пользователь, Пароль); 40 | КонецЕсли; 41 | 42 | КонецЕсли; 43 | 44 | КонецЕсли; 45 | 46 | СоздаватьShСкриптЗапуска = ПолучитьЗначение(НастройкиOpmИзФайлов,"СоздаватьShСкриптЗапуска", Неопределено); 47 | 48 | Если Не СоздаватьShСкриптЗапуска = Неопределено Тогда 49 | 50 | НастройкиOpm.УстановитьСозданиеShСкриптЗапуска(СоздаватьShСкриптЗапуска); 51 | 52 | КонецЕсли; 53 | 54 | СервераПакетов = ПолучитьЗначение(НастройкиOpmИзФайлов,"СервераПакетов", Неопределено); 55 | 56 | Если Не СервераПакетов = Неопределено Тогда 57 | Индекс = 1; 58 | 59 | Для каждого ТекущийСерверПакетов Из СервераПакетов Цикл 60 | 61 | Попытка 62 | СерверПакетов = СерверыПакетов.ИзНастроек(НастройкиКакСтруктура(ТекущийСерверПакетов), Индекс); 63 | Исключение 64 | Лог.Отладка(ОписаниеОшибки()); 65 | Продолжить; 66 | КонецПопытки; 67 | 68 | НастройкиOpm.ДобавитьСерверПакетов(СерверПакетов); 69 | Индекс = Индекс + 1; 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 | 95 | Процедура ЗаполнитьНастройкиИзПараметров(Знач ПараметрКоманды) Экспорт 96 | 97 | Если Не ПараметрКоманды["-winCreateBashLauncher"] = Неопределено Тогда 98 | 99 | ЗначениеОпции = Булево(ПараметрКоманды["-winCreateBashLauncher"]); 100 | НастройкиOpm.УстановитьСозданиеShСкриптЗапуска(ЗначениеОпции); 101 | 102 | КонецЕсли; 103 | 104 | ТекущиеНастройки = НастройкиOpm.ПолучитьНастройки(); 105 | НастройкиПрокси = ТекущиеНастройки.НастройкиПрокси; 106 | ПроксиСервер = ?(ПараметрКоманды["-proxyserver"] = Неопределено, НастройкиПрокси.Сервер, ПараметрКоманды["-proxyserver"]); 107 | ПроксиПорт = ?(ПараметрКоманды["-proxyport"] = Неопределено, НастройкиПрокси.Порт, ПараметрКоманды["-proxyport"]); 108 | ПроксиПользователь = ?(ПараметрКоманды["-proxyuser"] = Неопределено, НастройкиПрокси.Пользователь, ПараметрКоманды["-proxyuser"]); 109 | ПроксиПароль = ?(ПараметрКоманды["-proxypass"] = Неопределено, НастройкиПрокси.Пароль, ПараметрКоманды["-proxypass"]); 110 | 111 | НастройкиOpm.УстановитьНастройкиПроксиСервера(ПроксиСервер, ПроксиПорт, ПроксиПользователь, ПроксиПароль); 112 | 113 | Если НЕ ПараметрКоманды["-proxyusedefault"] = Неопределено Тогда 114 | 115 | Лог.Отладка("Устанавливаю прокси по умолчанию <%1>", ПараметрКоманды["-proxyusedefault"]); 116 | НастройкиOpm.УстановитьСистемныеНастройкиПроксиСервера(ПараметрКоманды["-proxyusedefault"]); 117 | 118 | Иначе 119 | 120 | НастройкиOpm.УстановитьИспользованиеПрокси(ЗначениеЗаполнено(ПроксиСервер)); 121 | 122 | КонецЕсли; 123 | 124 | КонецПроцедуры 125 | 126 | Процедура СохранитьТекущиеНастройки() Экспорт 127 | 128 | МассивФайлов = СписокФайловНастроек(); 129 | 130 | ТекущиеНастройки = НормализоватьНастройкиДляЗаписи(); 131 | СохранитьНастройки(ТекущиеНастройки, МассивФайлов[0]); 132 | 133 | КонецПроцедуры 134 | 135 | 136 | Функция НормализоватьНастройкиДляЗаписи() 137 | 138 | НастройкиДляЗаписи = Новый Структура; 139 | 140 | ТекущиеНастройки = НастройкиOpm.ПолучитьНастройки(); 141 | 142 | НастройкиДляЗаписи.Вставить("СоздаватьShСкриптЗапуска", ТекущиеНастройки.СоздаватьShСкриптЗапуска); 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 | Лог.Отладка("Чтение файла настроек %1", Элемент); 191 | 192 | Если НЕ Новый Файл(Элемент).Существует() Тогда 193 | Продолжить; 194 | КонецЕсли; 195 | 196 | Попытка 197 | НастройкиФайла = ПрочитатьФайлНастроек(Элемент); 198 | Прервать; 199 | Исключение 200 | Лог.Отладка("Чтение файла настроек %1. Ошибка: %2", Элемент, ОписаниеОшибки()); 201 | 202 | КонецПопытки; 203 | 204 | КонецЦикла; 205 | 206 | Возврат НастройкиФайла; 207 | 208 | КонецФункции 209 | 210 | Функция ПрочитатьФайлНастроек(Знач ПутьФайлаНастроек) 211 | 212 | Если НЕ Новый Файл(ПутьФайлаНастроек).Существует() Тогда 213 | ВызватьИсключение "Файл настроек не найдет"; 214 | КонецЕсли; 215 | 216 | Текст = ПрочитатьФайл(ПутьФайлаНастроек); 217 | 218 | ЧтениеJSON = Новый ЧтениеJSON(); 219 | ЧтениеJSON.УстановитьСтроку(Текст); 220 | НастройкиКакСоответствие = ПрочитатьJSON(ЧтениеJSON, Истина); 221 | ЧтениеJSON.Закрыть(); 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 | НастройкиЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Unix, " "); 268 | 269 | Json = Новый ЗаписьJSON(); 270 | Json.УстановитьСтроку(НастройкиЗаписи); 271 | 272 | ЗаписатьJSON(Json, Настройки); 273 | 274 | Возврат Json.Закрыть(); 275 | 276 | КонецФункции 277 | 278 | // Возвращает массив путей, где может находиться файла настроек opm 279 | // Текущий каталог запуска, домашний каталог пользователя, системная настройка, каталог opm (для совместимости). 280 | Функция СписокФайловНастроек() 281 | 282 | ИмяФайл = КонстантыOpm.ИмяФайлаНастроек; 283 | МассивФайлов = Новый Массив; 284 | //Текущий каталог 285 | МассивФайлов.Добавить(ОбъединитьПути(ТекущийКаталог(), ИмяФайл)); 286 | //Настройки в профиле пользователя. 287 | ПутьКНастройкам = ""; 288 | СИ = Новый СистемнаяИнформация(); 289 | Если Найти(Нрег(СИ.ВерсияОС), Нрег("Windows")) > 0 Тогда 290 | ПутьКНастройкам = ОбъединитьПути(ПолучитьПеременнуюСреды(Врег("USERPROFILE")), ИмяФайл); 291 | ПутьКНастройкамСистемный = ОбъединитьПути(ПолучитьПеременнуюСреды(Врег("ALLUSERSPROFILE")), ИмяФайл); 292 | Иначе 293 | ПутьКНастройкам = ОбъединитьПути(ПолучитьПеременнуюСреды(Врег("HOME")), "."+ИмяФайл); 294 | ПутьКНастройкамСистемный = ОбъединитьПути("/etc", ИмяФайл); 295 | КонецЕсли; 296 | 297 | МассивФайлов.Добавить(ПутьКНастройкам); 298 | МассивФайлов.Добавить(ПутьКНастройкамСистемный); 299 | 300 | //Совместимость со старым поведением 301 | МассивФайлов.Добавить(ОбъединитьПути(СтартовыйСценарий().Каталог, ИмяФайл)); 302 | 303 | Возврат МассивФайлов; 304 | 305 | КонецФункции 306 | 307 | Процедура Инициализация() 308 | 309 | НастроитьOpm(); 310 | 311 | КонецПроцедуры 312 | 313 | Лог = Логирование.ПолучитьЛог("oscript.app.opm"); 314 | 315 | Инициализация(); 316 | -------------------------------------------------------------------------------- /src/core/Классы/КэшУстановленныхПакетов.os: -------------------------------------------------------------------------------- 1 |  2 | #Использовать fs 3 | #Использовать logos 4 | #Использовать semver 5 | 6 | Перем Лог; 7 | 8 | // Массив каталогов в порядке возрастания приоритета 9 | Перем МассивКаталоговПоискаБиблиотек; 10 | 11 | Перем УстановленныеПакеты; 12 | 13 | Функция ПакетУстановлен(Знач ОписаниеЗависимости, Знач КаталогПоискаБиблиотек = "") Экспорт 14 | 15 | Перем УстановленныеПакеты; 16 | УстановленныеПакеты = ПолучитьУстановленныеПакеты(); 17 | 18 | ДанныеПакета = УстановленныеПакеты.Получить(ОписаниеЗависимости.ИмяПакета); 19 | ПакетУстановлен = ДанныеПакета <> Неопределено; 20 | Если ПакетУстановлен И НЕ ПустаяСтрока(КаталогПоискаБиблиотек) Тогда 21 | КаталогБиблиотекПакета = Новый Файл(ДанныеПакета.КаталогПакета).Путь; 22 | ПакетУстановлен = ФС.ПутиРавны(КаталогБиблиотекПакета, КаталогПоискаБиблиотек); 23 | КонецЕсли; 24 | 25 | ПутьКФайлуМетаданных = ПолучитьПутьКФайлуМетаданныхБиблиотеки(ОписаниеЗависимости.ИмяПакета); 26 | 27 | ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных); 28 | Если ФайлМетаданных.Существует() Тогда 29 | МетаОписаниеПакета = РаботаСПакетами.ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных); 30 | УстановленнаяВерсия = МетаОписаниеПакета.Свойства().Версия; 31 | Иначе 32 | // @deprecated 33 | УстановленнаяВерсия = "0"; 34 | КонецЕсли; 35 | 36 | Лог.Отладка("ПакетУстановлен: Перед вызовом СравнитьВерсии(ЭтаВерсия = <%1>, БольшеЧемВерсия = <%2>)", 37 | УстановленнаяВерсия, 38 | ОписаниеЗависимости.МинимальнаяВерсия); 39 | 40 | ВерсияSNAPSHOT = "SNAPSHOT"; 41 | Если ОписаниеЗависимости.МинимальнаяВерсия = ВерсияSNAPSHOT И УстановленнаяВерсия = ВерсияSNAPSHOT Тогда 42 | УстановленаКорректнаяВерсия = Истина; 43 | ИначеЕсли ОписаниеЗависимости.МинимальнаяВерсия = ВерсияSNAPSHOT И УстановленнаяВерсия <> ВерсияSNAPSHOT Тогда 44 | УстановленаКорректнаяВерсия = Ложь; 45 | Иначе 46 | Если ОписаниеЗависимости.МинимальнаяВерсия = Неопределено Тогда 47 | УстановленаКорректнаяВерсия = Истина; 48 | Иначе 49 | Попытка 50 | // Сначала пытаемся использовать семвер 51 | РезультатСравнения = Версии.СравнитьВерсии(УстановленнаяВерсия, ОписаниеЗависимости.МинимальнаяВерсия); 52 | Исключение 53 | // Если семвер не может обработать версию (например, 4-значную), используем модуль РаботаСВерсиями 54 | РезультатСравнения = РаботаСВерсиями.СравнитьВерсии(УстановленнаяВерсия, ОписаниеЗависимости.МинимальнаяВерсия); 55 | КонецПопытки; 56 | 57 | УстановленаКорректнаяВерсия = РезультатСравнения >= 0; 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 | 95 | Возврат УстановленныеПакеты; 96 | 97 | КонецФункции 98 | 99 | // Добавляет каталог в список, по которому выполняется поиск библиотек 100 | Процедура ДобавитьКаталогБиблиотек(Знач Каталог) Экспорт 101 | 102 | МассивКаталоговПоискаБиблиотек.Добавить(Каталог); 103 | 104 | КонецПроцедуры 105 | 106 | Процедура ДобавитьУстановленныйПакет(Знач ФайлКаталога) 107 | 108 | ПутьКФайлуМетаданных = ОбъединитьПути(ФайлКаталога.ПолноеИмя, КонстантыOpm.ИмяФайлаМетаданныхПакета); 109 | ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных); 110 | Если ФайлМетаданных.Существует() Тогда 111 | МетаОписаниеПакета = РаботаСПакетами.ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных); 112 | Иначе 113 | // @deprecated 114 | МетаОписаниеПакета = Истина; 115 | КонецЕсли; 116 | 117 | СтруктураДанных = Новый Структура(); 118 | СтруктураДанных.Вставить("МетаданныеПакета", МетаОписаниеПакета); 119 | СтруктураДанных.Вставить("КаталогПакета", ФайлКаталога.ПолноеИмя); 120 | 121 | УстановленныеПакеты.Вставить(ФайлКаталога.Имя, СтруктураДанных); 122 | 123 | КонецПроцедуры 124 | 125 | Функция ПолучитьПутьКФайлуМетаданныхБиблиотеки(ИмяПакета) Экспорт 126 | 127 | ПутьКФайлуМетаданных = ""; 128 | Для Каждого КаталогБиблиотек Из МассивКаталоговПоискаБиблиотек Цикл 129 | ВремПутьКФайлуМетаданных = ОбъединитьПути( 130 | КаталогБиблиотек, 131 | ИмяПакета, 132 | КонстантыOpm.ИмяФайлаМетаданныхПакета 133 | ); 134 | 135 | Лог.Отладка(Новый Файл(ВремПутьКФайлуМетаданных).ПолноеИмя); 136 | Если ФС.ФайлСуществует(ВремПутьКФайлуМетаданных) Тогда 137 | ПутьКФайлуМетаданных = ВремПутьКФайлуМетаданных; 138 | КонецЕсли; 139 | КонецЦикла; 140 | 141 | Возврат ПутьКФайлуМетаданных; 142 | 143 | КонецФункции 144 | 145 | 146 | 147 | Процедура ПриСозданииОбъекта(КаталогПоискаБиблиотек = "") 148 | 149 | Лог = Логирование.ПолучитьЛог("oscript.app.opm"); 150 | МассивКаталоговПоискаБиблиотек = Новый Массив; 151 | 152 | Если ЗначениеЗаполнено(КаталогПоискаБиблиотек) Тогда 153 | МассивКаталоговПоискаБиблиотек.Добавить(КаталогПоискаБиблиотек); 154 | Иначе 155 | КаталогСистемныхБиблиотек = ОбъединитьПути( 156 | КаталогПрограммы(), 157 | ПолучитьЗначениеСистемнойНастройки("lib.system") 158 | ); 159 | 160 | МассивКаталоговПоискаБиблиотек.Добавить(КаталогСистемныхБиблиотек); 161 | ДобавитьКаталогБиблиотек("./" + КонстантыOpm.ЛокальныйКаталогУстановкиПакетов); 162 | КонецЕсли; 163 | 164 | КонецПроцедуры 165 | 166 | -------------------------------------------------------------------------------- /src/core/Классы/МенеджерПолученияПакетов.os: -------------------------------------------------------------------------------- 1 | Перем Лог; 2 | 3 | Перем ИндексДоступныхПакетов; 4 | Перем ИндексКешаПакетов; 5 | Перем ИндексСерверовПакетов; 6 | 7 | Процедура ПриСозданииОбъекта() 8 | 9 | Инициализировать(); 10 | 11 | КонецПроцедуры 12 | 13 | Функция ПолучитьПакет(Знач ИмяПакета, Знач ВерсияПакета, ПутьКФайлуПакета = "", ИмяСервера = "") Экспорт 14 | 15 | ОбновитьИндексыКешейПакетов(); 16 | 17 | Если Не ПакетДоступен(ИмяПакета) Тогда 18 | 19 | ТекстИсключения = СтрШаблон("Ошибка установки пакета %1: Пакет не найден", ИмяПакета); 20 | ВызватьИсключение ТекстИсключения; 21 | 22 | КонецЕсли; 23 | 24 | ИмяПакета = ОпределитьИмяАрхива(ИмяПакета); 25 | 26 | Если ВерсияПакета <> Неопределено Тогда 27 | ФайлПакета = ИмяПакета + "-" + ВерсияПакета + ".ospx"; 28 | Иначе 29 | ФайлПакета = ИмяПакета + ".ospx"; 30 | КонецЕсли; 31 | 32 | Лог.Информация("Скачиваю файл: " + ФайлПакета); 33 | 34 | Если ПустаяСтрока(ПутьКФайлуПакета) Тогда 35 | ПутьКФайлуПакета = ВременныеФайлы.НовоеИмяФайла("ospx"); 36 | КонецЕсли; 37 | 38 | ИмяРесурса = ИмяПакета + "/" + ФайлПакета; 39 | 40 | ПереченьСерверов = ИндексКешаПакетов[ИмяПакета]; 41 | 42 | Ответ = ЗапроситьПакет(ПереченьСерверов, ИмяСервера, ИмяРесурса); 43 | 44 | Если Не Ответ = Неопределено Тогда 45 | Лог.Отладка("Файл получен"); 46 | Ответ.ПолучитьТелоКакДвоичныеДанные().Записать(ПутьКФайлуПакета); 47 | Ответ.Закрыть(); 48 | Лог.Отладка("Соединение закрыто"); 49 | Иначе 50 | ТекстИсключения = СтрШаблон("Ошибка установки пакета %1: Нет соединения", ИмяПакета); 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 | Лог.Отладка("Ресурс %1 успешно получен с %2", ИмяРесурса, Сервер.ПолучитьИмя()); 89 | Возврат ОтветСервера; 90 | 91 | КонецЕсли; 92 | 93 | Возврат Неопределено; 94 | 95 | КонецФункции 96 | 97 | Функция ЗапроситьПакетССервера(Сервер, ИмяРесурса) 98 | 99 | ОтветСервера = Неопределено; 100 | Если Сервер.СерверДоступен() Тогда 101 | 102 | ОтветСервера = Сервер.ПолучитьРесурс(ИмяРесурса); 103 | Если ОтветСервера <> Неопределено Тогда 104 | 105 | Если ОтветСервера.КодСостояния = 200 Тогда 106 | 107 | Возврат ОтветСервера; 108 | 109 | КонецЕсли; 110 | 111 | ОтветСервера.Закрыть(); 112 | 113 | Лог.Информация("Ошибка подключения к хабу %1 <%2>", 114 | Сервер.ПолучитьИмя(), 115 | ОтветСервера.КодСостояния); 116 | 117 | ОтветСервера = Неопределено; 118 | 119 | КонецЕсли; 120 | 121 | КонецЕсли; 122 | 123 | Возврат ОтветСервера; 124 | 125 | КонецФункции 126 | 127 | // Функция по имени пакета определяет имя архива в хабе 128 | // https://github.com/oscript-library/opm/issues/50 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 | Настройки = НастройкиOpm.ПолучитьНастройки(); 199 | СервераПакетов = Настройки.СервераПакетов; 200 | 201 | Для каждого НастройкаСервера Из СервераПакетов Цикл 202 | 203 | ИндексСерверовПакетов.Вставить(НастройкаСервера.Имя, НастройкаСервера); 204 | 205 | КонецЦикла; 206 | 207 | КонецПроцедуры 208 | 209 | // ИменаДоступныхСерверов 210 | // Возвращает список доступных серверов-зеркал с пакетами 211 | // Возвращаемое значение: 212 | // Массив - Список имен 213 | // 214 | Функция ИменаДоступныхСерверов() Экспорт 215 | 216 | ИменаПакетов = Новый Массив(); 217 | СервераПакетов = НастройкиOpm.ПолучитьНастройки().СервераПакетов; 218 | 219 | Для каждого НастройкаСервера Из СервераПакетов Цикл 220 | 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 | Лог.Отладка("Добавляю в кеш пакеты <%2> сервера: %1", ИмяСервера, Пакеты.Количество()); 266 | 267 | ДобавитьПакетыВИндексКеша(Пакеты, ИмяСервера); 268 | 269 | КонецЦикла; 270 | 271 | КонецПроцедуры 272 | 273 | Процедура ДобавитьПакетыВИндексКеша(Знач ПакетыСервера, Знач ИмяСервера) 274 | 275 | Для каждого Пакет Из ПакетыСервера Цикл 276 | 277 | КлючПакета = Пакет.Ключ; 278 | ВерсииПакета = Пакет.Значение; 279 | Лог.Отладка("Добавляю пакет: %1 в кеш для сервера %2", КлючПакета, ИмяСервера); 280 | Если ИндексКешаПакетов[КлючПакета] = Неопределено Тогда 281 | ИндексКешаПакетов.Вставить(КлючПакета, Новый Соответствие); 282 | КонецЕсли; 283 | 284 | ИндексКешаПакетов[КлючПакета].Вставить(ИмяСервера, ВерсииПакета) 285 | 286 | КонецЦикла; 287 | 288 | КонецПроцедуры 289 | 290 | Лог = Логирование.ПолучитьЛог("oscript.app.opm"); 291 | -------------------------------------------------------------------------------- /src/core/Классы/МенеджерУстановкиПакетов.os: -------------------------------------------------------------------------------- 1 | #Использовать fluent 2 | #Использовать fs 3 | #Использовать logos 4 | #Использовать tempfiles 5 | 6 | Перем Лог; 7 | Перем мВременныйКаталогУстановки; 8 | 9 | Перем ТекущийРежимУстановкиПакетов; 10 | Перем КэшУстановленныхПакетов; 11 | Перем ЦелевойКаталогУстановки; 12 | Перем КаталогУстановкиЗависимостей; 13 | Перем КаталогСистемныхБиблиотек; 14 | Перем КешУстановленныхПакетов; 15 | Перем ИмяСервера; 16 | 17 | Перем УстанавливатьЗависимости; 18 | Перем УстанавливатьЗависимостиРазработчика; 19 | Перем СоздаватьФайлыЗапуска; 20 | 21 | Процедура ПриСозданииОбъекта(Знач ВходящийРежимУстановкиПакетов = Неопределено, Знач ВходящийКаталогУстановки = Неопределено, Знач ВходящийКаталогУстановкиЗависимостей = Неопределено, Знач ВходящийИмяСервера = "") 22 | 23 | ПутьККаталогуЛокальнойУстановки = ОбъединитьПути( 24 | ТекущийКаталог(), 25 | КонстантыOpm.ЛокальныйКаталогУстановкиПакетов 26 | ); 27 | 28 | Если Не ВходящийРежимУстановкиПакетов = Неопределено Тогда 29 | УстановитьРежимУстановкиПакетов(ВходящийРежимУстановкиПакетов); 30 | Иначе 31 | УстановитьРежимУстановкиПакетов(РежимУстановкиПакетов.Глобально); 32 | КонецЕсли; 33 | 34 | Если Не ВходящийКаталогУстановки = Неопределено Тогда 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 | КонстантыOpm.ЛокальныйКаталогУстановкиПакетов 83 | ); 84 | Если КаталогУстановкиЗависимостей = КаталогСистемныхБиблиотек Тогда 85 | УстановитьКаталогЗависимостей(ПутьККаталогуЛокальнойУстановки); 86 | КонецЕсли; 87 | 88 | ИначеЕсли ТекущийРежимУстановкиПакетов = РежимУстановкиПакетов.Скачивание Тогда 89 | УстановитьКаталогЗависимостей(ЦелевойКаталогУстановки); 90 | 91 | Иначе 92 | УстановитьКаталогЗависимостей(КаталогСистемныхБиблиотек); 93 | КонецЕсли; 94 | 95 | КонецПроцедуры 96 | 97 | Процедура УстановитьЦелевойКаталог(Знач ЗначениеЦелевойКаталогУстановки) Экспорт 98 | Лог.Отладка("Каталог установки пакета '%1'", ЗначениеЦелевойКаталогУстановки); 99 | ФС.ОбеспечитьКаталог(ЗначениеЦелевойКаталогУстановки); 100 | ЦелевойКаталогУстановки = ЗначениеЦелевойКаталогУстановки; 101 | КонецПроцедуры 102 | 103 | Процедура УстановитьКаталогЗависимостей(Знач ВыходящийКаталог) Экспорт 104 | 105 | КаталогУстановкиЗависимостей = ВыходящийКаталог; 106 | 107 | КонецПроцедуры 108 | 109 | Процедура УстановитьПакетПоОписанию(Знач ЗависимостьПакета) Экспорт 110 | 111 | Если ЗависимостьПакета.ДляРазработки Тогда 112 | Если УстанавливатьЗависимостиРазработчика Тогда 113 | Лог.Информация("<%1> отмечена как зависимость для разработчика. Устанавливаем.", ЗависимостьПакета.ИмяПакета); 114 | Иначе 115 | Лог.Информация("<%1> отмечена как зависимость для разработчика, " + 116 | "но установка зависимостей для разработчика не активирована. Пропускаем.", ЗависимостьПакета.ИмяПакета); 117 | Возврат; 118 | КонецЕсли; 119 | КонецЕсли; 120 | 121 | УстановитьПакетПоИмениИВерсии(ЗависимостьПакета.ИмяПакета, ЗависимостьПакета.МинимальнаяВерсия, Истина); 122 | 123 | КонецПроцедуры 124 | 125 | Процедура УстановитьПакетИзАрхива(Знач ФайлПакета, Знач ЭтоЗависимыйПакет = Ложь) Экспорт 126 | 127 | КаталогУстановки = ?(ЭтоЗависимыйПакет, КаталогУстановкиЗависимостей, ЦелевойКаталогУстановки); 128 | УстановкаПакета = Новый УстановкаПакета(); 129 | УстановкаПакета.СоздаватьФайлЗапуска(СоздаватьФайлыЗапуска); 130 | УстановкаПакета.УстановитьЦелевойКаталог(КаталогУстановки); 131 | Лог.Отладка("КаталогУстановки: %1", КаталогУстановки); 132 | Если ЭтоЗависимыйПакет Тогда 133 | УстановкаПакета.УстановитьКешПакетов(КешУстановленныхПакетов); 134 | КонецЕсли; 135 | Лог.Отладка("ТекущийРежимУстановкиПакетов: %1", ТекущийРежимУстановкиПакетов); 136 | УстановкаПакета.УстановитьРежимУстановкиПакета(ТекущийРежимУстановкиПакетов); 137 | 138 | Попытка 139 | УстановкаПакета.УстановитьПакетИзАрхива(ФайлПакета); 140 | Исключение 141 | ВызватьИсключение ОписаниеОшибки(); 142 | КонецПопытки; 143 | 144 | МанифестПакета = УстановкаПакета.ПолучитьМанифестПакета(); 145 | ИмяПакета = МанифестПакета.Свойства().Имя; 146 | 147 | ПолныйПутьККаталогуУстановки = Новый Файл(КаталогУстановки).ПолноеИмя; 148 | ИмяКаталогаЛокальныхЗависимостей = КонстантыOpm.ЛокальныйКаталогУстановкиПакетов; 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 | Если Зависимости.Количество() = 0 Тогда 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 | Если Зависимости.Количество() = 0 Тогда 204 | Возврат; 205 | КонецЕсли; 206 | 207 | УстановленныеПакеты = ПолучитьУстановленныеПакеты(); 208 | 209 | Для Каждого Зависимость Из Зависимости Цикл 210 | Лог.Информация("Устанавливаю зависимость: <%1> из каталога локальных зависимостей", Зависимость.ИмяПакета); 211 | 212 | Если УстановленныеПакеты.ПакетУстановлен(Зависимость, КаталогУстановкиЗависимостей) Тогда 213 | Лог.Информация("<%1> уже установлен. Пропускаем.", Зависимость.ИмяПакета); 214 | Продолжить; 215 | КонецЕсли; 216 | 217 | ПутьККаталогуПакетаЗависимостиИсточник = ОбъединитьПути(ПутьККаталогуЛокальныхЗависимостей, Зависимость.ИмяПакета); 218 | 219 | Если ТекущийРежимУстановкиПакетов <> РежимУстановкиПакетов.Скачивание 220 | И ФС.КаталогСуществует(ПутьККаталогуПакетаЗависимостиИсточник) Тогда 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 | СистемныеБиблиотеки = ОбъединитьПути(КаталогПрограммы(), ПолучитьЗначениеСистемнойНастройки("lib.system")); 252 | Лог.Отладка("СистемныеБиблиотеки %1", СистемныеБиблиотеки); 253 | Если СистемныеБиблиотеки = Неопределено Тогда 254 | ВызватьИсключение "Не определен каталог системных библиотек"; 255 | КонецЕсли; 256 | 257 | Возврат СистемныеБиблиотеки; 258 | 259 | КонецФункции 260 | 261 | Лог = Логирование.ПолучитьЛог("oscript.app.opm"); 262 | //Лог.УстановитьУровень(УровниЛога.Отладка); 263 | -------------------------------------------------------------------------------- /src/core/Классы/ОписаниеПакета.os: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////// 2 | // 3 | // Fluent-API для описания пакета 4 | // 5 | ////////////////////////////////////////////////////////////////////// 6 | 7 | Перем мСвойстваПакета; 8 | Перем мЗависимости; 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 | Возврат ЭтотОбъект; 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 | Зависимость = Зависимость(ИмяПакета); 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 | ////////////////////////////////////////////////////////////////////// 218 | // Вспомогательные функции 219 | 220 | Процедура УстановитьСвойствоПакета(Знач Имя, Знач Значение) 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 | Инициализация(); -------------------------------------------------------------------------------- /src/core/Классы/СерверПакетов.os: -------------------------------------------------------------------------------- 1 | Перем Лог; 2 | 3 | Перем Имя Экспорт; 4 | Перем Сервер Экспорт; 5 | Перем ПутьНаСервере Экспорт; 6 | Перем Порт Экспорт; 7 | Перем Приоритет Экспорт; 8 | Перем Соединение; 9 | Перем РесурсПубликацииПакетов Экспорт; 10 | Перем Авторизация Экспорт; 11 | Перем ДополнительныеЗаголовки Экспорт; 12 | Перем Таймаут Экспорт; 13 | 14 | Перем ПакетыХаба; 15 | 16 | Процедура ПриСозданииОбъекта(Знач ИмяСервера, Знач АдресСервер, Знач ВходящийПутьНаСервере = "", 17 | Знач ВходящийРесурсПубликацииПакетов = "", Знач ВходящийПорт = 0, Знач ВходящийПриоритет = 0, 18 | Знач ВходящаяАвторизация = Неопределено, Знач Заголовки = Неопределено, Знач ВходящийТаймаут = 60) 19 | 20 | Имя = ИмяСервера; 21 | Сервер = АдресСервер; 22 | ПутьНаСервере = ВходящийПутьНаСервере; 23 | Порт = ВходящийПорт; 24 | Приоритет = ВходящийПриоритет; 25 | РесурсПубликацииПакетов = ВходящийРесурсПубликацииПакетов; 26 | Авторизация = ВходящаяАвторизация; 27 | ДополнительныеЗаголовки = Заголовки; 28 | Таймаут = ВходящийТаймаут; 29 | 30 | КонецПроцедуры 31 | 32 | Функция ПолучитьИмя() Экспорт 33 | Возврат Имя; 34 | КонецФункции 35 | 36 | Функция СерверДоступен() Экспорт 37 | Возврат Не Соединение = Неопределено; 38 | КонецФункции 39 | 40 | Функция ИнициализироватьСоединение() 41 | 42 | Если Не Соединение = Неопределено Тогда 43 | Возврат Соединение; 44 | КонецЕсли; 45 | 46 | Настройки = НастройкиOpm.ПолучитьНастройки(); 47 | Если Настройки.ИспользоватьПрокси Тогда 48 | НастройкиПрокси = НастройкиOpm.ПолучитьИнтернетПрокси(); 49 | Соединение = Новый HTTPСоединение(Сервер, Порт, , , НастройкиПрокси, Таймаут); 50 | Иначе 51 | Соединение = Новый HTTPСоединение(Сервер, Порт, , , , Таймаут); 52 | КонецЕсли; 53 | 54 | Возврат Соединение; 55 | 56 | КонецФункции 57 | 58 | // ИмяРесурса - имя файла относительно "Сервер/ПутьВХранилище" 59 | // Возвращает HttpОтвет или Неопределено, если запрос вернул исключение. 60 | Функция ПолучитьРесурс(Знач ИмяРесурса) Экспорт 61 | 62 | Соединение = ИнициализироватьСоединение(); 63 | Ресурс = ПутьНаСервере + ИмяРесурса; 64 | Запрос = Новый HTTPЗапрос(Ресурс); 65 | ДобавитьЗаголовки(Запрос); 66 | 67 | Попытка 68 | 69 | Возврат Соединение.Получить(Запрос); 70 | 71 | Исключение 72 | 73 | Лог.Ошибка(ОписаниеОшибки()); 74 | Возврат Неопределено; 75 | 76 | КонецПопытки; 77 | 78 | КонецФункции 79 | 80 | Функция ПрочитатьФайлСпискаПакетов(Текст) 81 | 82 | ТекстовыйДокумент = Новый ТекстовыйДокумент; 83 | ТекстовыйДокумент.УстановитьТекст(Текст); 84 | КоличествоПакетовВХабе = ТекстовыйДокумент.КоличествоСтрок(); 85 | Для НомерСтроки = 1 По КоличествоПакетовВХабе Цикл 86 | ИмяПакета = СокрЛП(ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки)); 87 | 88 | Если ПустаяСтрока(ИмяПакета) Тогда 89 | Продолжить; 90 | КонецЕсли; 91 | 92 | Если ПакетыХаба[ИмяПакета] = Неопределено Тогда 93 | ПакетыХаба.Вставить(ИмяПакета, Новый Массив); 94 | КонецЕсли; 95 | ПакетыХаба[ИмяПакета] = ""; // Тут должна быть строка версий 96 | КонецЦикла; 97 | 98 | КонецФункции 99 | 100 | Функция ПолучитьСписокПакетов(Ресурс) 101 | 102 | Ответ = ПолучитьРесурс(Ресурс); 103 | Если Ответ = Неопределено Тогда 104 | ТекстИсключения = "Ошибка подключения к зеркалу"; 105 | ВызватьИсключение ТекстИсключения; 106 | КонецЕсли; 107 | 108 | Если Ответ.КодСостояния <> 200 Тогда 109 | ТекстОтвета = Ответ.ПолучитьТелоКакСтроку(); 110 | ТекстИсключения = СтрШаблон("Ошибка подключения к зеркалу код ответа: <%1> 111 | |Текст ответа: <%2>", Ответ.КодСостояния, ТекстОтвета); 112 | ВызватьИсключение ТекстИсключения; 113 | КонецЕсли; 114 | ТекстОтвета = Ответ.ПолучитьТелоКакСтроку(); 115 | Ответ.Закрыть(); 116 | 117 | Возврат ТекстОтвета; 118 | 119 | КонецФункции 120 | 121 | Функция ПолучитьПакеты() Экспорт 122 | 123 | ПакетыХаба = Новый Соответствие; 124 | 125 | ТекстОтвета = ""; 126 | 127 | Попытка 128 | ТекстОтвета = ПолучитьСписокПакетов("list.txt"); 129 | Исключение 130 | Лог.Предупреждение( 131 | СтрШаблон("Ошибка получения списка пакетов с хаба %1 по причине %2", 132 | Имя, ОписаниеОшибки() 133 | ) 134 | ); 135 | КонецПопытки; 136 | 137 | ПрочитатьФайлСпискаПакетов(ТекстОтвета); 138 | 139 | Возврат ПакетыХаба; 140 | 141 | КонецФункции 142 | 143 | Процедура ДобавитьЗаголовки(Знач Запрос) 144 | 145 | Если ЗначениеЗаполнено(ДополнительныеЗаголовки) Тогда 146 | Для Каждого мЗаголовок Из ДополнительныеЗаголовки Цикл 147 | ДобавитьЗаголовокКЗапросу(Запрос, мЗаголовок.Ключ, мЗаголовок.Значение); 148 | КонецЦикла; 149 | КонецЕсли; 150 | 151 | Если ЗначениеЗаполнено(Авторизация) Тогда 152 | ДобавитьЗаголовокКЗапросу(Запрос, "Authorization", Авторизация); 153 | КонецЕсли; 154 | 155 | КонецПроцедуры 156 | 157 | Процедура ДобавитьЗаголовокКЗапросу(Знач Запрос, Знач Заголовок, Знач Значение) 158 | Запрос.Заголовки.Вставить(Заголовок, ОбщегоНазначенияOpm.ПрименитьПеременныеСреды(Значение)); 159 | КонецПроцедуры 160 | 161 | Функция НастройкаДляВыгрузки() Экспорт 162 | 163 | Результат = Новый Структура; 164 | Результат.Вставить("Имя", Имя); 165 | Результат.Вставить("Сервер", Сервер); 166 | Результат.Вставить("ПутьНаСервере", ПутьНаСервере); 167 | Результат.Вставить("РесурсПубликацииПакетов", РесурсПубликацииПакетов); 168 | Если ЗначениеЗаполнено(Порт) Тогда 169 | Результат.Вставить("Порт", Порт); 170 | КонецЕсли; 171 | Результат.Вставить("Таймаут", Таймаут); 172 | Результат.Вставить("Авторизация", Авторизация); 173 | Результат.Вставить("Заголовки", ДополнительныеЗаголовки); 174 | Результат.Вставить("Приоритет", Приоритет); 175 | 176 | Возврат Результат; 177 | 178 | КонецФункции // 179 | 180 | Лог = Логирование.ПолучитьЛог("oscript.app.opm"); 181 | ДополнительныеЗаголовки = Новый Соответствие; -------------------------------------------------------------------------------- /src/core/Классы/СериализацияМетаданныхПакета.os: -------------------------------------------------------------------------------- 1 |  2 | Перем ИменаКоллекцийПакета; 3 | Перем Лог; 4 | 5 | ///////////////////////////////////////////////////////////////////////////// 6 | // Чтение 7 | 8 | Процедура ЗаписатьXML(Знач ЗаписьXML, Знач ОписаниеПакета) Экспорт 9 | 10 | ЗаписатьXMLВнутр(ЗаписьXML, ОписаниеПакета, Истина); 11 | 12 | КонецПроцедуры 13 | 14 | Процедура ЗаписатьМетаданныеВXML(Знач ЗаписьXML, Знач ОписаниеПакета) Экспорт 15 | 16 | ЗаписатьXMLВнутр(ЗаписьXML, ОписаниеПакета, Ложь); 17 | 18 | КонецПроцедуры 19 | 20 | Процедура ЗаписатьXMLВнутр(Знач ЗаписьXML, Знач ОписаниеПакета, Знач Полностью) 21 | 22 | ЗаписьXML.ЗаписатьОбъявлениеXML(); 23 | ЗаписьXML.ЗаписатьНачалоЭлемента("opm-metadata"); 24 | ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("", "http://oscript.io/schemas/opm-metadata/1.0"); 25 | 26 | ЗаписатьСвойстваПакета(ЗаписьXML, ОписаниеПакета); 27 | ЗаписатьЗависимостиПакета(ЗаписьXML, ОписаниеПакета); 28 | ЗаписатьИсполняемыеФайлыПакета(ЗаписьXML, ОписаниеПакета); 29 | Если Полностью Тогда 30 | ЗаписатьСодержимоеПакета(ЗаписьXML, ОписаниеПакета); 31 | ЗаписатьЯвноеОбъявлениеМодулейПакета(ЗаписьXML, ОписаниеПакета); 32 | КонецЕсли; 33 | 34 | ЗаписьXML.ЗаписатьКонецЭлемента(); 35 | 36 | КонецПроцедуры 37 | 38 | Функция СоответствиеИменСвойствДляЗаписи() 39 | 40 | СоответствиеИменСвойств = Новый Соответствие; 41 | СоответствиеИменСвойств.Вставить("Имя" , "name"); 42 | СоответствиеИменСвойств.Вставить("Версия", "version"); 43 | СоответствиеИменСвойств.Вставить("Автор" , "author"); 44 | СоответствиеИменСвойств.Вставить("Описание" , "description"); 45 | СоответствиеИменСвойств.Вставить("АдресАвтора", "author-email"); 46 | СоответствиеИменСвойств.Вставить("АдресРепозитория", "repo-address"); 47 | СоответствиеИменСвойств.Вставить("ВерсияСреды", "engine-version"); 48 | СоответствиеИменСвойств.Вставить("ВерсияМанифеста", "manifest-version"); 49 | СоответствиеИменСвойств.Вставить("Задачи", "tasks"); 50 | 51 | Возврат СоответствиеИменСвойств; 52 | 53 | КонецФункции 54 | 55 | Процедура ЗаписатьСвойстваПакета(Знач Запись, Знач Манифест) 56 | 57 | СоответствиеИменСвойств = СоответствиеИменСвойствДляЗаписи(); 58 | 59 | СвойстваПакета = Манифест.Свойства(); 60 | 61 | Для Каждого КлючИЗначение Из СвойстваПакета Цикл 62 | 63 | Если Не ЗначениеЗаполнено(КлючИЗначение.Значение) Тогда 64 | Продолжить; 65 | КонецЕсли; 66 | 67 | СинонимСвойства = СоответствиеИменСвойств[КлючИЗначение.Ключ]; 68 | Если СинонимСвойства = Неопределено Тогда 69 | ИмяЭлемента = КлючИЗначение.Ключ; 70 | Лог.Предупреждение("Свойство '%1' не используется при чтении метаданных пакета", КлючИЗначение.Ключ); 71 | Иначе 72 | ИмяЭлемента = СинонимСвойства; 73 | КонецЕсли; 74 | 75 | Запись.ЗаписатьНачалоЭлемента(ИмяЭлемента); 76 | Запись.ЗаписатьТекст(XMLСтрока(КлючИЗначение.Значение)); 77 | Запись.ЗаписатьКонецЭлемента(); 78 | 79 | КонецЦикла; 80 | 81 | КонецПроцедуры 82 | 83 | Процедура ЗаписатьЗависимостиПакета(Знач Запись, Знач Манифест) 84 | 85 | Зависимости = Манифест.Зависимости(); 86 | Если Зависимости.Количество() = 0 Тогда 87 | Возврат; 88 | КонецЕсли; 89 | 90 | Для Каждого Зависимость Из Зависимости Цикл 91 | Запись.ЗаписатьНачалоЭлемента(ИменаКоллекцийПакета().Зависимости); 92 | Запись.ЗаписатьАтрибут("name", Зависимость.ИмяПакета); 93 | Запись.ЗаписатьАтрибут("dev", Формат(Зависимость.ДляРазработки, "БЛ=false; БИ=true")); 94 | Если Не ПустаяСтрока(Зависимость.МинимальнаяВерсия) Тогда 95 | Запись.ЗаписатьАтрибут("version", Зависимость.МинимальнаяВерсия); 96 | КонецЕсли; 97 | Если Не ПустаяСтрока(Зависимость.МаксимальнаяВерсия) Тогда 98 | Запись.ЗаписатьАтрибут("version-max", Зависимость.МаксимальнаяВерсия); 99 | КонецЕсли; 100 | Запись.ЗаписатьКонецЭлемента(); 101 | КонецЦикла; 102 | 103 | КонецПроцедуры 104 | 105 | Процедура ЗаписатьИсполняемыеФайлыПакета(Знач Запись, Знач Манифест) 106 | 107 | ИсполняемыеФайлы = Манифест.ИсполняемыеФайлы(); 108 | Если ИсполняемыеФайлы.Количество() = 0 Тогда 109 | Возврат; 110 | КонецЕсли; 111 | 112 | Для Каждого Файл Из ИсполняемыеФайлы Цикл 113 | Запись.ЗаписатьНачалоЭлемента(ИменаКоллекцийПакета().ИсполняемыеФайлы); 114 | Если Не ПустаяСтрока(Файл.ИмяПриложения) Тогда 115 | Запись.ЗаписатьАтрибут("name", Файл.ИмяПриложения); 116 | КонецЕсли; 117 | Запись.ЗаписатьТекст(Файл.Путь); 118 | Запись.ЗаписатьКонецЭлемента(); 119 | КонецЦикла 120 | 121 | КонецПроцедуры 122 | 123 | Процедура ЗаписатьЯвноеОбъявлениеМодулейПакета(Знач Запись, Знач Манифест) 124 | 125 | Модули = Манифест.ВсеМодулиПакета(); 126 | Запись.ЗаписатьНачалоЭлемента(ИменаКоллекцийПакета().ОбъявлениеМодулей); 127 | 128 | Для Каждого ОписаниеМодуля Из Модули Цикл 129 | Если ОписаниеМодуля.Тип = Манифест.ТипыМодулей.Класс Тогда 130 | Запись.ЗаписатьНачалоЭлемента("class"); 131 | Иначе 132 | Запись.ЗаписатьНачалоЭлемента("module"); 133 | КонецЕсли; 134 | 135 | Запись.ЗаписатьАтрибут("name", ОписаниеМодуля.Идентификатор); 136 | Запись.ЗаписатьАтрибут("src" , ОписаниеМодуля.Файл); 137 | Запись.ЗаписатьКонецЭлемента(); 138 | 139 | КонецЦикла; 140 | 141 | Запись.ЗаписатьКонецЭлемента(); 142 | 143 | КонецПроцедуры 144 | 145 | Процедура ЗаписатьСодержимоеПакета(Знач ЗаписьXML, Знач Манифест) 146 | 147 | Файлы = Манифест.ВключаемыеФайлы(); 148 | Если Файлы.Количество() = 0 Тогда 149 | Возврат; 150 | КонецЕсли; 151 | 152 | Для Каждого Файл Из Файлы Цикл 153 | ЗаписьXML.ЗаписатьНачалоЭлемента(ИменаКоллекцийПакета().ВключаемыеФайлы); 154 | ЗаписьXML.ЗаписатьТекст(Файл); 155 | ЗаписьXML.ЗаписатьКонецЭлемента(); 156 | КонецЦикла; 157 | 158 | КонецПроцедуры 159 | 160 | ///////////////////////////////////////////////////////////////////////////// 161 | // Запись 162 | 163 | Функция ПрочитатьXML(Знач ЧтениеXML) Экспорт 164 | 165 | ЧтениеXML.ПерейтиКСодержимому(); 166 | Описание = Новый ОписаниеПакета(); 167 | 168 | Лог.Отладка("Начинаю чтение манифеста из XML. Корневой узел:" + ЧтениеXML.ЛокальноеИмя); 169 | 170 | Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда 171 | ПрочитатьУзлыПакета(ЧтениеXML, Описание); 172 | КонецЕсли; 173 | 174 | Лог.Отладка("Манифест прочитан"); 175 | 176 | Возврат Описание; 177 | 178 | КонецФункции 179 | 180 | Функция СоответствиеИменСвойствДляЧтения() 181 | 182 | ИсходныеСвойства = СоответствиеИменСвойствДляЗаписи(); 183 | ИнвертированныеСвойства = Новый Соответствие; 184 | Для Каждого КЗ Из ИсходныеСвойства Цикл 185 | ИнвертированныеСвойства.Вставить(КЗ.Значение, КЗ.Ключ); 186 | КонецЦикла; 187 | 188 | Возврат ИнвертированныеСвойства; 189 | 190 | КонецФункции 191 | 192 | Процедура ПрочитатьУзлыПакета(Знач ЧтениеXML, Знач ОписаниеПакета) 193 | 194 | СоответствиеИменСвойств = СоответствиеИменСвойствДляЧтения(); 195 | 196 | Рефлектор = Новый Рефлектор; 197 | 198 | Пока ЧтениеXML.Прочитать() и ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Цикл 199 | 200 | ИмяУзла = ЧтениеXML.ЛокальноеИмя; 201 | Лог.Отладка("Выбран узел " + ИмяУзла); 202 | Если ИмяУзла = ИменаКоллекцийПакета().Зависимости Тогда 203 | ПрочитатьЗависимости(ЧтениеXML, ОписаниеПакета); 204 | ИначеЕсли ИмяУзла = ИменаКоллекцийПакета().ИсполняемыеФайлы Тогда 205 | ПрочитатьИсполняемыеФайлы(ЧтениеXML, ОписаниеПакета); 206 | ИначеЕсли ИмяУзла = ИменаКоллекцийПакета().ОбъявлениеМодулей Тогда 207 | ПрочитатьЯвноеОбъявлениеМодулей(ЧтениеXML, ОписаниеПакета); 208 | ИначеЕсли ИмяУзла = ИменаКоллекцийПакета().ВключаемыеФайлы Тогда 209 | ПрочитатьВключаемыеФайлы(ЧтениеXML, ОписаниеПакета); 210 | Иначе 211 | 212 | ИмяСвойства = СоответствиеИменСвойств[ИмяУзла]; 213 | Если ИмяСвойства <> Неопределено Тогда 214 | Лог.Отладка("Читаю свойство " + ИмяСвойства); 215 | ЗначениеСвойства = ПрочитатьТекст(ЧтениеXML); 216 | Лог.Отладка("Прочитано значение " + ЗначениеСвойства); 217 | Аргументы = Новый Массив; 218 | Аргументы.Добавить(ЗначениеСвойства); 219 | Рефлектор.ВызватьМетод(ОписаниеПакета, ИмяСвойства, Аргументы); 220 | Иначе 221 | Лог.Предупреждение("Нестандартное имя узла %1", ИмяУзла); 222 | ЧтениеXML.Пропустить(); 223 | КонецЕсли; 224 | 225 | КонецЕсли; 226 | 227 | КонецЦикла; 228 | 229 | КонецПроцедуры 230 | 231 | Процедура ПрочитатьЗависимости(Знач ЧтениеXML, Знач ОписаниеПакета) 232 | 233 | Лог.Отладка("Читаю зависимость"); 234 | ИмяЗависимости = ЧтениеXML.ПолучитьАтрибут("name"); 235 | Если ИмяЗависимости = Неопределено Тогда 236 | ВызватьИсключение "Некорректно заданы зависимости в XML описании пакета"; 237 | КонецЕсли; 238 | 239 | МинимальнаяВерсия = ЧтениеXML.ПолучитьАтрибут("version"); 240 | МаксимальнаяВерсия = ЧтениеXML.ПолучитьАтрибут("version-max"); 241 | ДляРазработки = ЧтениеXML.ПолучитьАтрибут("dev"); 242 | 243 | Лог.Отладка( 244 | "Добавляем зависимость %1 %2 %3 %4", 245 | ИмяЗависимости, 246 | МинимальнаяВерсия, 247 | МаксимальнаяВерсия, 248 | ДляРазработки 249 | ); 250 | 251 | Если ДляРазработки = "true" Тогда 252 | ОписаниеПакета.РазработкаЗависитОт(ИмяЗависимости, МинимальнаяВерсия, МаксимальнаяВерсия); 253 | Иначе 254 | ОписаниеПакета.ЗависитОт(ИмяЗависимости, МинимальнаяВерсия, МаксимальнаяВерсия); 255 | КонецЕсли; 256 | ЧтениеXML.Прочитать(); 257 | 258 | КонецПроцедуры 259 | 260 | Процедура ПрочитатьИсполняемыеФайлы(Знач ЧтениеXML, Знач ОписаниеПакета) 261 | 262 | Лог.Отладка("Читаю исполняемый модуль"); 263 | 264 | ИмяПриложения = ЧтениеXML.ПолучитьАтрибут("name"); 265 | Путь = ПрочитатьТекст(ЧтениеXML); 266 | Лог.Отладка("Прочитан путь " + Путь); 267 | Если Путь <> Неопределено Тогда 268 | ОписаниеПакета.ИсполняемыйФайл(Путь, ИмяПриложения); 269 | КонецЕсли; 270 | 271 | КонецПроцедуры 272 | 273 | Процедура ПрочитатьВключаемыеФайлы(Знач ЧтениеXML, Знач ОписаниеПакета) 274 | 275 | Лог.Отладка("Читаю элемент содержимого"); 276 | 277 | Путь = ПрочитатьТекст(ЧтениеXML); 278 | Лог.Отладка("Прочитан путь " + Путь); 279 | Если Путь <> Неопределено Тогда 280 | ОписаниеПакета.ВключитьФайл(Путь); 281 | КонецЕсли; 282 | 283 | КонецПроцедуры 284 | 285 | Процедура ПрочитатьЯвноеОбъявлениеМодулей(Знач ЧтениеXML, Знач ОписаниеПакета) 286 | 287 | Лог.Отладка("Читаю явные объявления модулей"); 288 | 289 | Пока ЧтениеXML.Прочитать() и ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Цикл 290 | 291 | Идентификатор = ЧтениеXML.ПолучитьАтрибут("name"); 292 | Источник = ЧтениеXML.ПолучитьАтрибут("src"); 293 | 294 | Если ЧтениеXML.ЛокальноеИмя = "module" Тогда 295 | Лог.Отладка("Прочитан модуль: " + Идентификатор + ", источник " + Источник); 296 | ОписаниеПакета.ОпределяетМодуль(Идентификатор, Источник); 297 | ИначеЕсли ЧтениеXML.ЛокальноеИмя = "class" Тогда 298 | Лог.Отладка("Прочитан класс: " + Идентификатор + ", источник " + Источник); 299 | ОписаниеПакета.ОпределяетКласс(Идентификатор, Источник); 300 | Иначе 301 | Лог.Отладка("Неизвестный тип узла модуля: " + ЧтениеXML.ЛокальноеИмя); 302 | КонецЕсли; 303 | 304 | ЧтениеXML.Прочитать(); // конец тек. узла 305 | 306 | КонецЦикла; 307 | 308 | КонецПроцедуры 309 | 310 | Функция ПрочитатьТекст(Знач Чтение) 311 | 312 | Результат = Неопределено; 313 | 314 | Пока Чтение.Прочитать() и Чтение.ТипУзла = ТипУзлаXML.Текст Цикл 315 | Результат = Чтение.Значение; 316 | КонецЦикла; 317 | 318 | Возврат Результат; 319 | 320 | КонецФункции 321 | 322 | ///////////////////////////////////////////////////////////// 323 | // Общие функции 324 | 325 | Функция ИменаКоллекцийПакета() 326 | 327 | Если ИменаКоллекцийПакета = Неопределено Тогда 328 | ИменаКоллекцийПакета = Новый Структура; 329 | ИменаКоллекцийПакета.Вставить("Зависимости", "depends-on"); 330 | ИменаКоллекцийПакета.Вставить("ИсполняемыеФайлы", "executable"); 331 | ИменаКоллекцийПакета.Вставить("ВключаемыеФайлы", "include-content"); 332 | ИменаКоллекцийПакета.Вставить("ОбъявлениеМодулей", "explicit-modules"); 333 | КонецЕсли; 334 | 335 | Возврат ИменаКоллекцийПакета; 336 | 337 | КонецФункции 338 | 339 | //////////////////////////////////////////////////////////////////////// 340 | 341 | Лог = Логирование.ПолучитьЛог("oscript.app.opm"); -------------------------------------------------------------------------------- /src/core/Классы/ФайловыйСерверОтвет.os: -------------------------------------------------------------------------------- 1 | #Использовать semver 2 | 3 | Перем Лог; 4 | Перем КодСостояния Экспорт; 5 | Перем ИмяФайла; 6 | 7 | Процедура ПриСозданииОбъекта(Знач ПутьКФайлу) 8 | 9 | ИмяФайла = ПутьКФайлу; 10 | 11 | Файл = Новый Файл(ПутьКФайлу); 12 | Если Файл.Существует() Тогда 13 | КодСостояния = 200; 14 | Иначе 15 | 16 | КодСостояния = 404; 17 | 18 | Если СтрЗаканчиваетсяНа(ПутьКФайлу, ".ospx") Тогда 19 | ПодобратьФайлПакета(Файл.Путь); 20 | КонецЕсли; 21 | 22 | КонецЕсли; 23 | 24 | КонецПроцедуры 25 | 26 | Функция ПолучитьТелоКакДвоичныеДанные() Экспорт 27 | Возврат Новый ДвоичныеДанные(ИмяФайла); 28 | КонецФункции 29 | 30 | Процедура Закрыть() Экспорт 31 | // для совместимости контракта 32 | КонецПроцедуры 33 | 34 | Процедура ПодобратьФайлПакета(Знач КаталогФайловПакета) 35 | 36 | ИмяПакета = Новый Файл(КаталогФайловПакета).Имя; 37 | ИмяСРазделителем = ИмяПакета + "-"; 38 | 39 | ФайлыПакета = НайтиФайлы(КаталогФайловПакета, "*.ospx"); 40 | 41 | ВыбранныйФайл = Неопределено; 42 | ВыбраннаяВерсия = Неопределено; 43 | 44 | Для Каждого мФайлПакета Из ФайлыПакета Цикл 45 | 46 | ИмяСВерсией = мФайлПакета.ИмяБезРасширения; 47 | ТекущаяВерсия = Неопределено; 48 | 49 | ФайлМетаданных = Новый Файл(ОбъединитьПути(мФайлПакета.Путь, ИмяСВерсией, КонстантыOpm.ИмяФайлаМетаданныхПакета)); 50 | Если ФайлМетаданных.Существует() Тогда 51 | 52 | // есть сохраненный файл метаданных 53 | МетаданныеПакета = РаботаСПакетами.ПрочитатьМетаданныеПакета(ФайлМетаданных.ПолноеИмя); 54 | ТекущаяВерсия = Версии.ВерсияИзСтроки(МетаданныеПакета.Свойства().Версия); 55 | 56 | ИначеЕсли СтрНачинаетсяС(ИмяСВерсией, ИмяСРазделителем) Тогда 57 | 58 | // извлекаем номер версии из имени файла 59 | ВерсияИзИмениФайла = Сред(ИмяСВерсией, СтрДлина(ИмяСРазделителем) + 1); 60 | Если Не ПустаяСтрока(ВерсияИзИмениФайла) Тогда 61 | ТекущаяВерсия = Версии.ВерсияИзСтроки(ВерсияИзИмениФайла); 62 | КонецЕсли; 63 | 64 | Иначе 65 | // Файл не по канону - пропустим 66 | Лог.Отладка("Файл %1 не соответствует правилам расположения файлов пакета.", мФайлПакета.ПолноеИмя); 67 | КонецЕсли; 68 | 69 | Если (ТекущаяВерсия <> Неопределено) Тогда 70 | 71 | Лог.Отладка("Найден файл %1 с версией %2", мФайлПакета.ПолноеИмя, ТекущаяВерсия.ВСтроку()); 72 | 73 | Если ((ВыбраннаяВерсия = Неопределено) 74 | Или (ВыбраннаяВерсия.Сравнить(ТекущаяВерсия) < 0)) Тогда 75 | 76 | ВыбраннаяВерсия = ТекущаяВерсия; 77 | ВыбранныйФайл = мФайлПакета; 78 | 79 | КонецЕсли; 80 | 81 | КонецЕсли; 82 | 83 | КонецЦикла; 84 | 85 | Если ВыбранныйФайл <> Неопределено Тогда 86 | 87 | Лог.Отладка("Для пакета %1 подобрана версия %2", ИмяПакета, ВыбраннаяВерсия.ВСтроку()); 88 | 89 | ИмяФайла = ВыбранныйФайл.ПолноеИмя; 90 | КодСостояния = 200; 91 | 92 | КонецЕсли; 93 | 94 | КонецПроцедуры 95 | 96 | Лог = Логирование.ПолучитьЛог("oscript.app.opm.fileserver"); -------------------------------------------------------------------------------- /src/core/Классы/ФайловыйСерверПакетов.os: -------------------------------------------------------------------------------- 1 | Перем Лог; 2 | 3 | Перем Имя Экспорт; 4 | Перем Сервер Экспорт; 5 | Перем КаталогПакетов Экспорт; 6 | Перем КорневойКаталогПоиска; 7 | 8 | Процедура ПриСозданииОбъекта(Знач ИмяСервера, Знач АдресСервера, Знач КаталогПакетовНаСервере) 9 | 10 | Имя = ИмяСервера; 11 | Сервер = АдресСервера; 12 | КаталогПакетов = КаталогПакетовНаСервере; 13 | 14 | Если СтрНачинаетсяС(Сервер, "file://") Тогда 15 | КорневойКаталогПоиска = Сред(Сервер, СтрДлина("file://") + 1); 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 | Функция ПолучитьРесурс(Знач ИмяРесурса) Экспорт 41 | 42 | ПутьКРесурсу = ОбъединитьПути(КорневойКаталогПоиска, ИмяРесурса); 43 | 44 | Попытка 45 | 46 | Возврат Новый ФайловыйСерверОтвет(ПутьКРесурсу); 47 | 48 | Исключение 49 | 50 | Лог.Ошибка(ОписаниеОшибки()); 51 | Возврат Неопределено; 52 | 53 | КонецПопытки; 54 | 55 | КонецФункции 56 | 57 | Функция ПолучитьПакеты() Экспорт 58 | 59 | ПакетыХаба = Новый Соответствие; 60 | ФайлыПакетов = Новый Массив; 61 | Попытка 62 | ФайлыПакетов = НайтиФайлы(КорневойКаталогПоиска, "*.ospx", Истина); 63 | Исключение 64 | Лог.Предупреждение( 65 | СтрШаблон("Ошибка получения списка пакетов с хаба %1 по причине %2", 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 | Результат.Вставить("Порт", 0); 92 | Результат.Вставить("Таймаут", 0); 93 | Результат.Вставить("Авторизация", ""); 94 | Результат.Вставить("Заголовки", Новый Соответствие()); 95 | Результат.Вставить("Приоритет", 0); 96 | 97 | Возврат Результат; 98 | 99 | КонецФункции // 100 | 101 | Лог = Логирование.ПолучитьЛог("oscript.app.opm"); 102 | -------------------------------------------------------------------------------- /src/core/Модули/КонстантыOpm.os: -------------------------------------------------------------------------------- 1 |  2 | Перем ИмяФайлаСпецификацииПакета Экспорт; 3 | Перем ИмяФайлаСодержимогоПакета Экспорт; 4 | Перем ИмяФайлаМетаданныхПакета Экспорт; 5 | Перем РесурсПубликацииПакетов Экспорт; 6 | Перем СерверУдаленногоХранилища Экспорт; 7 | Перем ПутьВХранилище Экспорт; 8 | Перем СерверЗапасногоХранилища Экспорт; 9 | Перем ПутьВЗапасномХранилище Экспорт; 10 | Перем ЛокальныйКаталогУстановкиПакетов Экспорт; 11 | Перем ИмяЛога Экспорт; 12 | Перем ВерсияПродукта Экспорт; 13 | Перем ИмяФайлаНастроек Экспорт; 14 | 15 | /////////////////////////////////////////////////////////////// 16 | 17 | ИмяФайлаСпецификацииПакета = "packagedef"; 18 | ИмяФайлаСодержимогоПакета = "content.zip"; 19 | ИмяФайлаМетаданныхПакета = "opm-metadata.xml"; 20 | СерверУдаленногоХранилища = "http://hub.oscript.io"; 21 | РесурсПубликацииПакетов = "/push"; 22 | ПутьВХранилище = "/download/"; 23 | СерверЗапасногоХранилища = "http://hub.oscript.ru"; 24 | ПутьВЗапасномХранилище = "/download/"; 25 | ЛокальныйКаталогУстановкиПакетов = "oscript_modules"; 26 | ИмяЛога = "oscript.app.opm"; 27 | ВерсияПродукта = "1.4.2"; 28 | ИмяФайлаНастроек = "opm.cfg"; 29 | -------------------------------------------------------------------------------- /src/core/Модули/НастройкиOpm.os: -------------------------------------------------------------------------------- 1 | #Использовать logos 2 | 3 | Перем мНастройки; 4 | Перем Лог; 5 | Перем КешИнтернетПрокси; 6 | 7 | Функция ПолучитьНастройки() Экспорт 8 | Если мНастройки.СервераПакетов.Количество() = 0 Тогда 9 | ИнициализацияСерверовПакетов(); 10 | КонецЕсли; 11 | Возврат мНастройки; 12 | КонецФункции 13 | 14 | Процедура УстановитьНастройкиПроксиСервера(Знач Сервер, 15 | Знач Порт = 0, 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 | Если мНастройки.ИспользоватьСистемныйПрокси Тогда 41 | 42 | КешИнтернетПрокси = Новый ИнтернетПрокси(Истина); 43 | КешИнтернетПрокси.НеИспользоватьПроксиДляЛокальныхАдресов = Истина; 44 | 45 | Иначе 46 | 47 | НастройкиПрокси = мНастройки.НастройкиПрокси; 48 | 49 | КешИнтернетПрокси = Новый ИнтернетПрокси(); 50 | 51 | КешИнтернетПрокси.Установить("http", НастройкиПрокси.Сервер, НастройкиПрокси.Порт, 52 | НастройкиПрокси.Пользователь, НастройкиПрокси.Пароль, 53 | НастройкиПрокси.ИспользоватьАутентификациюОС); 54 | 55 | КешИнтернетПрокси.Установить("https", НастройкиПрокси.Сервер, НастройкиПрокси.Порт, 56 | НастройкиПрокси.Пользователь, НастройкиПрокси.Пароль, 57 | НастройкиПрокси.ИспользоватьАутентификациюОС); 58 | 59 | КешИнтернетПрокси.НеИспользоватьПроксиДляЛокальныхАдресов = Истина; 60 | 61 | КонецЕсли; 62 | 63 | КонецЕсли; 64 | 65 | Возврат КешИнтернетПрокси; 66 | 67 | КонецФункции 68 | 69 | Процедура УстановитьИспользованиеПрокси(Знач ЗначениеНастройки) Экспорт 70 | 71 | мНастройки.ИспользоватьПрокси = ЗначениеНастройки; 72 | 73 | КонецПроцедуры 74 | 75 | Процедура УстановитьСозданиеShСкриптЗапуска(Знач ЗначениеНастройки) Экспорт 76 | 77 | мНастройки.СоздаватьShСкриптЗапуска = ЗначениеНастройки; 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 | мНастройки.Вставить("СоздаватьShСкриптЗапуска", Ложь); 113 | мНастройки.Вставить("СервераПакетов", Новый Массив); 114 | 115 | КонецПроцедуры 116 | 117 | Лог = Логирование.ПолучитьЛог("oscript.app.opm"); 118 | 119 | Инициализация(); 120 | -------------------------------------------------------------------------------- /src/core/Модули/ОбщегоНазначенияOpm.os: -------------------------------------------------------------------------------- 1 | #Использовать strings 2 | 3 | // Подставляет переменные среды в строку 4 | // 5 | // Параметры: 6 | // Значение - Строка - Исходная строка. Подстроки вида ${ИМЯ_ПЕРЕМЕННОЙ} заменяются на значение переменной 7 | // 8 | // Возвращаемое значение: 9 | // Строка - Строка с подставленными значениями переменных 10 | Функция ПрименитьПеременныеСреды(Знач Значение) Экспорт 11 | ПеременныеСреды = КакМассив(ПеременныеСреды()); 12 | Возврат ПрименитьПеременныеСредыШаг(Значение, ПеременныеСреды, 0); 13 | КонецФункции 14 | 15 | Функция ПрименитьПеременныеСредыШаг(Знач Значение, Знач ПеременныеСреды, Знач Индекс) 16 | 17 | ПеременнаяИмя = СтрШаблон("${%1}", ПеременныеСреды[Индекс].Ключ); 18 | Части = СтроковыеФункции.РазложитьСтрокуВМассивПодстрок(Значение, ПеременнаяИмя); 19 | Если Индекс < ПеременныеСреды.Количество() - 1 Тогда 20 | Для Инд = 0 По Части.ВГраница() Цикл 21 | Части[Инд] = ПрименитьПеременныеСредыШаг(Части[Инд], ПеременныеСреды, Индекс + 1); 22 | КонецЦикла; 23 | КонецЕсли; 24 | 25 | Результат = СтрСоединить(Части, ПеременныеСреды[Индекс].Значение); 26 | Возврат Результат; 27 | 28 | КонецФункции 29 | 30 | Функция КакМассив(Знач Соответствие) 31 | 32 | Массив = Новый Массив; 33 | Для Каждого мКлючИЗанчение Из Соответствие Цикл 34 | Массив.Добавить(мКлючИЗанчение); 35 | КонецЦикла; 36 | 37 | Возврат Массив; 38 | 39 | КонецФункции -------------------------------------------------------------------------------- /src/core/Модули/РаботаСВерсиями.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////// 2 | // 3 | // Работа с номерами версий пакетов (сравнение, разбор и т.р.) 4 | // 5 | ////////////////////////////////////////////////////////////////// 6 | 7 | #Использовать logos 8 | 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 | Результат = Результат + "." + ПредставлениеКомпонентаВерсии(КомпонентВерсии.Значение); 41 | КонецЕсли; 42 | КонецЦикла; 43 | 44 | Возврат Сред(Результат, 2); 45 | 46 | КонецФункции 47 | 48 | Функция ЗаписатьПолнуюВерсиюВСтроку(Знач Версия) Экспорт 49 | 50 | Результат = ""; 51 | 52 | Для Каждого КомпонентВерсии Из Версия Цикл 53 | Результат = Результат + "." + ПредставлениеКомпонентаВерсии(КомпонентВерсии.Значение); 54 | КонецЦикла; 55 | 56 | Возврат Сред(Результат, 2); 57 | 58 | КонецФункции 59 | 60 | // Возвращает 1, если ЭтаВерсия > БольшеЧемВерсия, -1 если ЭтаВерсия < БольшеЧемВерсия и 0, если они равны 61 | // 62 | Функция СравнитьВерсии(Знач ЭтаВерсия, Знач БольшеЧемВерсия) Экспорт 63 | Лог.Отладка(СтрШаблон("Вызываю СравнитьВерсии(ЭтаВерсия = <%1>, БольшеЧемВерсия = <%2>)", ЭтаВерсия, БольшеЧемВерсия)); 64 | 65 | Если ЭтаВерсия = 0 Тогда 66 | ЭтаВерсия = "0"; 67 | КонецЕсли; 68 | Если БольшеЧемВерсия = 0 Тогда 69 | БольшеЧемВерсия = "0"; 70 | КонецЕсли; 71 | Если ТипЗнч(ЭтаВерсия) <> Тип("Строка") и ТипЗнч(ЭтаВерсия) <> ТипЗнч(СоздатьВерсию()) Тогда 72 | ВызватьИсключение "СравнитьВерсии: Передали неверный параметр <ЭтаВерсия>"; 73 | КонецЕсли; 74 | Если ТипЗнч(БольшеЧемВерсия) <> Тип("Строка") и ТипЗнч(БольшеЧемВерсия) <> ТипЗнч(СоздатьВерсию()) Тогда 75 | ВызватьИсключение "СравнитьВерсии: Передали неверный параметр <БольшеЧемВерсия>"; 76 | КонецЕсли; 77 | 78 | Если ТипЗнч(ЭтаВерсия) = Тип("Строка") Тогда 79 | ЭтаВерсия = РазобратьВерсиюНаКомпоненты(ЭтаВерсия); 80 | КонецЕсли; 81 | 82 | Если ТипЗнч(БольшеЧемВерсия) = Тип("Строка") Тогда 83 | БольшеЧемВерсия = РазобратьВерсиюНаКомпоненты(БольшеЧемВерсия); 84 | КонецЕсли; 85 | 86 | Для Каждого КомпонентВерсии Из ЭтаВерсия Цикл 87 | 88 | КомпонентЭтаВерсия = КомпонентВерсии.Значение; 89 | КомпонентБольшеЧем = БольшеЧемВерсия[КомпонентВерсии.Ключ]; 90 | 91 | Если КомпонентЭтаВерсия = Неопределено и КомпонентБольшеЧем <> Неопределено Тогда 92 | Возврат -1; 93 | КонецЕсли; 94 | 95 | Если КомпонентЭтаВерсия <> Неопределено и КомпонентБольшеЧем = Неопределено Тогда 96 | Возврат 1; 97 | КонецЕсли; 98 | 99 | Если КомпонентЭтаВерсия = Неопределено И КомпонентБольшеЧем = Неопределено Тогда 100 | Возврат 0; 101 | КонецЕсли; 102 | 103 | Попытка 104 | ЧислоЭтаВерсия = Число(КомпонентЭтаВерсия); 105 | ЧислоБольшеЧем = Число(КомпонентБольшеЧем); 106 | Исключение 107 | ВызватьИсключение "Ошибка в формате номера версии метаданных. Не удалось преобразовать к типу Число: " + ЭтаВерсия + "/" + БольшеЧемВерсия; 108 | КонецПопытки; 109 | 110 | Если ЧислоЭтаВерсия > ЧислоБольшеЧем Тогда 111 | Возврат 1; 112 | ИначеЕсли ЧислоЭтаВерсия < ЧислоБольшеЧем Тогда 113 | Возврат -1; 114 | КонецЕсли; 115 | 116 | Если ПустаяСтрока(ЭтаВерсия) или ПустаяСтрока(БольшеЧемВерсия) Тогда 117 | Прервать; 118 | КонецЕсли; 119 | 120 | КонецЦикла; 121 | 122 | Возврат 0; 123 | 124 | КонецФункции 125 | 126 | Функция ПредставлениеКомпонентаВерсии(Знач Компонент) 127 | Возврат ?(Компонент = Неопределено, "0", Компонент); 128 | КонецФункции 129 | 130 | Функция КомпонентСтроки(ИсходнаяСтрока, Знач Разделитель) 131 | 132 | Если ПустаяСтрока(ИсходнаяСтрока) Тогда 133 | Возврат Неопределено; 134 | КонецЕсли; 135 | 136 | Поз = Найти(ИсходнаяСтрока, Разделитель); 137 | Если Поз = 0 Тогда 138 | Результат = ИсходнаяСтрока; 139 | ИсходнаяСтрока = ""; 140 | Возврат Результат; 141 | КонецЕсли; 142 | 143 | Компонент = Лев(ИсходнаяСтрока, Поз-1); 144 | ИсходнаяСтрока = Сред(ИсходнаяСтрока, Поз+1); 145 | 146 | Возврат Компонент; 147 | 148 | КонецФункции 149 | 150 | Функция РазобратьИмяПакета(знач ИмяПакета) Экспорт 151 | 152 | Пакет = Новый Структура("ИмяПакета,Версия","",Неопределено); 153 | ИмяВерсия = СтрРазделить(ИмяПакета,"@"); 154 | Пакет.Вставить("ИмяПакета", ИмяВерсия[0]); 155 | Если ИмяВерсия.Количество() > 1 Тогда 156 | Пакет.Вставить("Версия", ИмяВерсия[1]); 157 | КонецЕсли; 158 | 159 | Возврат Пакет; 160 | 161 | КонецФункции 162 | 163 | Лог = Логирование.ПолучитьЛог(КонстантыOpm.ИмяЛога); 164 | -------------------------------------------------------------------------------- /src/core/Модули/РаботаСОписаниемПакета.os: -------------------------------------------------------------------------------- 1 | #Использовать logos 2 | #Использовать semver 3 | 4 | Перем Лог; 5 | 6 | Функция ПрочитатьОписаниеПакета() Экспорт 7 | 8 | Описание = Новый ОписаниеПакета(); 9 | 10 | ПутьКМанифесту = ОбъединитьПути(ТекущийКаталог(), КонстантыOpm.ИмяФайлаСпецификацииПакета); 11 | 12 | Файл_Манифест = Новый Файл(ПутьКМанифесту); 13 | Если Файл_Манифест.Существует() Тогда 14 | Контекст = Новый Структура("Описание", Описание); 15 | ЗагрузитьСценарий(ПутьКМанифесту, Контекст); 16 | КонецЕсли; 17 | 18 | Возврат Описание; 19 | 20 | КонецФункции 21 | 22 | Процедура ПроверитьВерсиюМанифеста(Манифест) Экспорт 23 | 24 | Свойства = Манифест.Свойства(); 25 | Если НЕ Свойства.Свойство("ВерсияМанифеста") Тогда 26 | Возврат; 27 | КонецЕсли; 28 | 29 | ИмяПакета = Свойства.Имя; 30 | ТребуемаяВерсияМанифеста = Свойства.ВерсияМанифеста; 31 | ТекущаяВерсияМанифеста = КонстантыOpm.ВерсияПродукта; 32 | Лог().Отладка( 33 | "ПроверитьВерсиюМанифеста: Перед вызовом СравнитьВерсии(ЭтаВерсия = <%1>, БольшеЧемВерсия = <%2>)", 34 | ТребуемаяВерсияМанифеста, 35 | ТекущаяВерсияМанифеста 36 | ); 37 | Если Версии.СравнитьВерсии(ТребуемаяВерсияМанифеста, ТекущаяВерсияМанифеста) > 0 Тогда 38 | ТекстСообщения = СтрШаблон( 39 | "Ошибка установки пакета <%1>: Обнаружена устаревшая версия opm. 40 | |Требуемая версия: %2 41 | |Текущая версия: %3 42 | |Обновите opm перед установкой пакета", 43 | ИмяПакета, 44 | ТребуемаяВерсияМанифеста, 45 | ТекущаяВерсияМанифеста 46 | ); 47 | 48 | ВызватьИсключение ТекстСообщения; 49 | КонецЕсли; 50 | 51 | КонецПроцедуры 52 | 53 | Процедура ПроверитьВерсиюСреды(Манифест) Экспорт 54 | 55 | Свойства = Манифест.Свойства(); 56 | Если НЕ Свойства.Свойство("ВерсияСреды") Тогда 57 | Возврат; 58 | КонецЕсли; 59 | 60 | ИмяПакета = Свойства.Имя; 61 | ТребуемаяВерсияСреды = Свойства.ВерсияСреды; 62 | СистемнаяИнформация = Новый СистемнаяИнформация; 63 | ВерсияСреды = СистемнаяИнформация.Версия; 64 | Лог().Отладка("ПроверитьВерсиюСреды: Перед вызовом СравнитьВерсии(ЭтаВерсия = <%1>, БольшеЧемВерсия = <%2>)", ТребуемаяВерсияСреды, ВерсияСреды); 65 | 66 | Попытка 67 | // До приведения версии движка к семверу 68 | РезультатСравнения = РаботаСВерсиями.СравнитьВерсии(ТребуемаяВерсияСреды, ВерсияСреды); 69 | Исключение 70 | РезультатСравнения = Версии.СравнитьВерсии(ТребуемаяВерсияСреды, ВерсияСреды); 71 | КонецПопытки; 72 | 73 | Если РезультатСравнения > 0 Тогда 74 | ТекстСообщения = СтрШаблон( 75 | "Ошибка установки пакета <%1>: Обнаружена устаревшая версия движка OneScript. 76 | |Требуемая версия: %2 77 | |Текущая версия: %3 78 | |Обновите OneScript перед установкой пакета", 79 | ИмяПакета, 80 | ТребуемаяВерсияСреды, 81 | ВерсияСреды 82 | ); 83 | 84 | ВызватьИсключение ТекстСообщения; 85 | КонецЕсли; 86 | 87 | КонецПроцедуры 88 | 89 | Функция Лог() 90 | Если Лог = Неопределено Тогда 91 | Лог = Логирование.ПолучитьЛог("oscript.app.opm"); 92 | КонецЕсли; 93 | 94 | Возврат Лог; 95 | КонецФункции 96 | -------------------------------------------------------------------------------- /src/core/Модули/РаботаСПакетами.os: -------------------------------------------------------------------------------- 1 | #Использовать fluent 2 | #Использовать fs 3 | #Использовать logos 4 | #Использовать tempfiles 5 | 6 | Перем Лог; 7 | Перем ВнутреннийМенеджерПолученияПакетов; 8 | 9 | Процедура ОбновитьУстановленныеПакеты(Знач РежимУстановки, Знач ЦелевойКаталог = Неопределено, Знач НастройкаУстановки = Неопределено) Экспорт 10 | 11 | КэшУстановленныхПакетов = ПолучитьУстановленныеПакеты(РежимУстановки); 12 | УстановленныеПакеты = КэшУстановленныхПакетов.ПолучитьУстановленныеПакеты(); 13 | Для Каждого КлючИЗначение Из УстановленныеПакеты Цикл 14 | ИмяПакета = КлючИЗначение.Ключ; 15 | 16 | МенеджерПолучения = ПолучитьМенеджерПолученияПакетов(); 17 | 18 | Если Не МенеджерПолучения.ПакетДоступен(ИмяПакета) Тогда 19 | Лог.Предупреждение("Ошибка обновления пакета %1: Пакет не найден в хабе", ИмяПакета); 20 | Продолжить; 21 | КонецЕсли; 22 | 23 | ОбновитьПакетИзОблака(ИмяПакета, РежимУстановки, ЦелевойКаталог, НастройкаУстановки); 24 | 25 | КонецЦикла; 26 | 27 | КонецПроцедуры 28 | 29 | Функция ПрочитатьМетаданныеПакета(Знач ФайлМетаданных) Экспорт 30 | 31 | Перем Метаданные; 32 | Лог.Отладка("Чтение метаданных пакета"); 33 | Попытка 34 | Чтение = Новый ЧтениеXML; 35 | Чтение.ОткрытьФайл(ФайлМетаданных); 36 | Лог.Отладка("XML загружен"); 37 | Сериализатор = Новый СериализацияМетаданныхПакета; 38 | Метаданные = Сериализатор.ПрочитатьXML(Чтение); 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 | КонстантыOpm.ЛокальныйКаталогУстановкиПакетов 69 | ); 70 | КонецЕсли; 71 | 72 | КэшУстановленныхПакетов = Новый КэшУстановленныхПакетов(КаталогУстановкиЗависимостей); 73 | 74 | Возврат КэшУстановленныхПакетов; 75 | 76 | КонецФункции 77 | 78 | Функция ПолучитьНастройкуУстановки() Экспорт 79 | 80 | Настройка = Новый Структура(); 81 | Настройка.Вставить("УстанавливатьЗависимости", Истина); 82 | Настройка.Вставить("УстанавливатьЗависимостиРазработчика", Ложь); 83 | Настройка.Вставить("СоздаватьФайлыЗапуска", Истина); 84 | Настройка.Вставить("ИмяСервера", ""); 85 | 86 | Возврат Настройка; 87 | 88 | КонецФункции 89 | 90 | Процедура УстановитьПакетИзОблака(Знач ИмяПакета, Знач РежимУстановки, Знач ЦелевойКаталог, Знач НастройкаУстановки = Неопределено) Экспорт 91 | 92 | Лог.Отладка("Устанавливаю пакет <%1> из доступного хаба", ИмяПакета); 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 | ШаблонТекстаКонфигурационногоФайла = "lib.additional=%1"; 180 | 181 | Для Каждого КаталогИсполняемогоФайла Из КаталогиИсполняемыхФайлов Цикл 182 | 183 | РазделительПути = "/"; 184 | РазницаВКаталогах = ФС.ОтносительныйПуть(КаталогУстановки, КаталогИсполняемогоФайла, РазделительПути); 185 | Директории = СтрРазделить(РазницаВКаталогах, РазделительПути); 186 | 187 | ПутьКЛокальнымБиблиотекам = ПроцессорыКоллекций.ИзКоллекции(Директории) 188 | .Обработать("Директория -> ""../""") 189 | .Сократить("Результат, Элемент -> Результат + Элемент", ""); 190 | 191 | ПутьКЛокальнымБиблиотекам = ПутьКЛокальнымБиблиотекам + КонстантыOpm.ЛокальныйКаталогУстановкиПакетов; 192 | 193 | ТекстКонфигурационногоФайла = СтрШаблон(ШаблонТекстаКонфигурационногоФайла, ПутьКЛокальнымБиблиотекам); 194 | ПутьККонфигурационномуФайлу = ОбъединитьПути(КаталогИсполняемогоФайла, "oscript.cfg"); 195 | 196 | ТекстовыйДокумент = Новый ТекстовыйДокумент; 197 | ТекстовыйДокумент.УстановитьТекст(ТекстКонфигурационногоФайла); 198 | ТекстовыйДокумент.Записать(ПутьККонфигурационномуФайлу, КодировкаТекста.UTF8NoBOM); 199 | 200 | КонецЦикла; 201 | 202 | КонецПроцедуры 203 | 204 | Процедура ОбеспечитьФайлыИнфраструктурыЛокальнойУстановки(Знач ОписаниеПакета, Знач РежимУстановки) 205 | 206 | КаталогНазначения = КонстантыOpm.ЛокальныйКаталогУстановкиПакетов; 207 | КаталогЗагрузчика = ПолучитьКаталогСистемныхБиблиотек(); 208 | 209 | ФС.ОбеспечитьКаталог(КаталогНазначения); 210 | СоздатьКонфигурационныеФайлыОСкрипт(ТекущийКаталог(), ОписаниеПакета, РежимУстановки); 211 | 212 | ИмяЗагрузчика = "package-loader.os"; 213 | ФайлЗагрузчика = ОбъединитьПути(КаталогЗагрузчика, ИмяЗагрузчика); 214 | Если Не ФС.ФайлСуществует(ФайлЗагрузчика) Тогда 215 | Лог.Предупреждение("Не удалось скопировать системный загрузчик в локальный каталог пакетов"); 216 | Возврат; 217 | КонецЕсли; 218 | 219 | ПутьКНовомуЗагрузчику = ОбъединитьПути(КаталогНазначения, ИмяЗагрузчика); 220 | Если ФС.ФайлСуществует(ПутьКНовомуЗагрузчику) Тогда 221 | Лог.Отладка("Файл загрузчика уже существует."); 222 | Возврат; 223 | КонецЕсли; 224 | 225 | КопироватьФайл(ФайлЗагрузчика, ОбъединитьПути(КаталогНазначения, ИмяЗагрузчика)); 226 | 227 | КонецПроцедуры 228 | 229 | Функция ПолучитьПакет(Знач ИмяПакета, Знач ВерсияПакета, ПутьКФайлуПакета = "", ИмяСервера = "") Экспорт 230 | 231 | МенеджерПолучения = ПолучитьМенеджерПолученияПакетов(); 232 | ПутьКФайлуПакета = МенеджерПолучения.ПолучитьПакет(ИмяПакета, ВерсияПакета, ПутьКФайлуПакета, ИмяСервера); 233 | 234 | Возврат ПутьКФайлуПакета; 235 | 236 | КонецФункции 237 | 238 | Функция ПолучитьКаталогСистемныхБиблиотек() 239 | 240 | СистемныеБиблиотеки = ОбъединитьПути(КаталогПрограммы(), ПолучитьЗначениеСистемнойНастройки("lib.system")); 241 | Лог.Отладка("СистемныеБиблиотеки " + СистемныеБиблиотеки); 242 | Если СистемныеБиблиотеки = Неопределено Тогда 243 | ВызватьИсключение "Не определен каталог системных библиотек"; 244 | КонецЕсли; 245 | 246 | Возврат СистемныеБиблиотеки; 247 | 248 | КонецФункции 249 | 250 | Лог = Логирование.ПолучитьЛог("oscript.app.opm"); 251 | -------------------------------------------------------------------------------- /src/core/Модули/РежимУстановкиПакетов.os: -------------------------------------------------------------------------------- 1 | 2 | Перем Локально Экспорт; 3 | Перем Глобально Экспорт; 4 | Перем Скачивание Экспорт; 5 | 6 | /////////////////////////////////////////////////////////////// 7 | 8 | Локально = "Локально"; 9 | Глобально = "Глобально"; 10 | Скачивание = "Скачивание"; -------------------------------------------------------------------------------- /src/core/Модули/СерверыПакетов.os: -------------------------------------------------------------------------------- 1 | 2 | Функция ИзНастроек(Знач ТекущийСерверПакетов, Знач Индекс) Экспорт 3 | 4 | Сервер = ПолучитьЗначение(ТекущийСерверПакетов, "Сервер", ""); 5 | Порт = Число(ПолучитьЗначение(ТекущийСерверПакетов, "Порт", 0)); 6 | ПутьНаСервере = ПолучитьЗначение(ТекущийСерверПакетов, "ПутьНаСервере", "/"); 7 | Имя = ПолучитьЗначение(ТекущийСерверПакетов, "Имя", СтрШаблон("ДопСервер_%1", Индекс)); 8 | РесурсПубликацииПакетов = ПолучитьЗначение(ТекущийСерверПакетов, "РесурсПубликацииПакетов", "/"); 9 | Приоритет = Число(ПолучитьЗначение(ТекущийСерверПакетов, "Приоритет", 0)); 10 | Авторизация = ПолучитьЗначение(ТекущийСерверПакетов, "Авторизация", ""); 11 | ДополнительныеЗаголовки = ПолучитьЗначение(ТекущийСерверПакетов, "Заголовки", Новый Соответствие); 12 | Таймаут = ПолучитьЗначение(ТекущийСерверПакетов, "Таймаут", 600); 13 | 14 | Если ПустаяСтрока(Сервер) Тогда 15 | ВызватьИсключение СтрШаблон("Для сервера <%1> не задан адрес", Индекс); 16 | КонецЕсли; 17 | 18 | Если СтрНачинаетсяС(Сервер, "file://") Тогда 19 | СерверПакетов = Новый ФайловыйСерверПакетов(Имя, Сервер, ПутьНаСервере); 20 | Иначе 21 | СерверПакетов = Новый СерверПакетов(Имя, Сервер, ПутьНаСервере, РесурсПубликацииПакетов, 22 | Порт, Приоритет, Авторизация, ДополнительныеЗаголовки, Таймаут 23 | ); 24 | КонецЕсли; 25 | 26 | Возврат СерверПакетов; 27 | 28 | КонецФункции 29 | 30 | Функция ОсновнойСервер() Экспорт 31 | Возврат Новый СерверПакетов("ОсновнойСерверПакетов", 32 | КонстантыOpm.СерверУдаленногоХранилища, 33 | КонстантыOpm.ПутьВХранилище, 34 | КонстантыOpm.РесурсПубликацииПакетов, 35 | 80, 36 | 0 37 | ); 38 | КонецФункции 39 | 40 | Функция ЗапаснойСервер() Экспорт 41 | Возврат Новый СерверПакетов("ЗапаснойСерверПакетов", 42 | КонстантыOpm.СерверЗапасногоХранилища, 43 | КонстантыOpm.ПутьВЗапасномХранилище, 44 | Неопределено, 45 | 80, 46 | 1 47 | ); 48 | КонецФункции 49 | 50 | Функция ПолучитьЗначение(Знач ВходящаяСтруктура, Знач Ключ, Знач ЗначениеПоУмолчанию) 51 | 52 | Перем ЗначениеКлюча; 53 | 54 | Если Не ВходящаяСтруктура.Свойство(Ключ, ЗначениеКлюча) Тогда 55 | Возврат ЗначениеПоУмолчанию; 56 | КонецЕсли; 57 | 58 | Если ЗначениеКлюча = Неопределено Тогда 59 | Возврат ЗначениеПоУмолчанию; 60 | КонецЕсли; 61 | 62 | Возврат ЗначениеКлюча; 63 | 64 | КонецФункции 65 | -------------------------------------------------------------------------------- /tasks/coverage.os: -------------------------------------------------------------------------------- 1 | #Использовать coverage 2 | #Использовать 1commands 3 | #Использовать fs 4 | 5 | ФС.ОбеспечитьПустойКаталог("out"); 6 | 7 | ПутьКСтат = ОбъединитьПути("out", "stat.json"); 8 | 9 | Команда = Новый Команда; 10 | Команда.УстановитьКоманду("oscript"); 11 | Команда.ДобавитьПараметр(СтрШаблон("-codestat=%1", ПутьКСтат)); 12 | Команда.ДобавитьПараметр("tasks/test.os"); // Файла запуска тестов 13 | Команда.ПоказыватьВыводНемедленно(Истина); 14 | 15 | КодВозврата = Команда.Исполнить(); 16 | 17 | ПроцессорГенерации = Новый ГенераторОтчетаПокрытия(); 18 | 19 | ПроцессорГенерации.ОтносительныеПути() 20 | .ИмяФайлаСтатистики() 21 | .РабочийКаталог("out") 22 | .GenericCoverage() 23 | .Cobertura() 24 | .Сформировать(); 25 | 26 | ЗавершитьРаботу(КодВозврата); 27 | -------------------------------------------------------------------------------- /tasks/oscript.cfg: -------------------------------------------------------------------------------- 1 | lib.additional=../oscript_modules 2 | -------------------------------------------------------------------------------- /tasks/test.os: -------------------------------------------------------------------------------- 1 | #Использовать 1bdd 2 | #Использовать 1testrunner 3 | #Использовать fs 4 | 5 | Функция ПрогнатьТесты() 6 | 7 | Тестер = Новый Тестер; 8 | Тестер.УстановитьФорматЛогФайла(Тестер.ФорматыЛогФайла().GenericExec); 9 | 10 | ПутьКТестам = "tests"; 11 | ПутьКОтчетуJUnit = "out"; 12 | 13 | ФС.ОбеспечитьПустойКаталог(ПутьКОтчетуJUnit); 14 | 15 | РезультатТестирования = Тестер.ТестироватьКаталог( 16 | Новый Файл(ПутьКТестам), 17 | Новый Файл(ПутьКОтчетуJUnit) 18 | ); 19 | 20 | Успешно = РезультатТестирования = 0; 21 | 22 | Возврат Успешно; 23 | КонецФункции // ПрогнатьТесты() 24 | 25 | Функция ПрогнатьФичи() 26 | 27 | ПутьОтчетаJUnit = ОбъединитьПути(ТекущийКаталог(), "out", "bdd-log.xml"); 28 | 29 | КаталогФич = ОбъединитьПути(".", "features"); 30 | 31 | Файл_КаталогФич = Новый Файл(КаталогФич); 32 | 33 | ИсполнительБДД = Новый ИсполнительБДД; 34 | РезультатыВыполнения = ИсполнительБДД.ВыполнитьФичу(Файл_КаталогФич, Файл_КаталогФич); 35 | ИтоговыйРезультатВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); 36 | 37 | СтатусВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения().НеВыполнялся; 38 | Если РезультатыВыполнения.Строки.Количество() > 0 Тогда 39 | 40 | СтатусВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); 41 | 42 | КонецЕсли; 43 | 44 | ГенераторОтчетаJUnit = Новый ГенераторОтчетаJUnit; 45 | ГенераторОтчетаJUnit.Сформировать(РезультатыВыполнения, СтатусВыполнения, ПутьОтчетаJUnit); 46 | 47 | Сообщить(СтрШаблон("Результат прогона фич <%1> 48 | |", ИтоговыйРезультатВыполнения)); 49 | 50 | Возврат ИтоговыйРезультатВыполнения <> ИсполнительБДД.ВозможныеСтатусыВыполнения().Сломался; 51 | КонецФункции // ПрогнатьФичи() 52 | 53 | // основной код 54 | 55 | ТекКаталог = ТекущийКаталог(); 56 | 57 | Попытка 58 | ТестыПрошли = ПрогнатьТесты(); 59 | Исключение 60 | ТестыПрошли = Ложь; 61 | Сообщить(СтрШаблон("Тесты через 1testrunner выполнены неудачно 62 | |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); 63 | КонецПопытки; 64 | 65 | УстановитьТекущийКаталог(ТекКаталог); 66 | 67 | Попытка 68 | ФичиПрошли = ПрогнатьФичи(); 69 | Исключение 70 | ФичиПрошли = Ложь; 71 | Сообщить(СтрШаблон("Тесты поведения через 1bdd выполнены неудачно 72 | |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); 73 | КонецПопытки; 74 | 75 | Если Не ТестыПрошли Или Не ФичиПрошли Тогда 76 | ВызватьИсключение "Тестирование завершилось неудачно!"; 77 | Иначе 78 | Сообщить(СтрШаблон("Результат прогона тестов <%1> 79 | |", ТестыПрошли)); 80 | Сообщить(СтрШаблон("Результат прогона основных фич <%1> 81 | |", ФичиПрошли)); 82 | КонецЕсли; 83 | -------------------------------------------------------------------------------- /tests/build-install-test.os: -------------------------------------------------------------------------------- 1 | #Использовать "../src/core" 2 | #Использовать asserts 3 | #Использовать fs 4 | #Использовать tempfiles 5 | 6 | Перем юТест; 7 | Перем мВременныеФайлы; 8 | 9 | Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт 10 | 11 | юТест = Тестирование; 12 | 13 | ИменаТестов = Новый Массив; 14 | 15 | ИменаТестов.Добавить("ТестДолжен_ПроверитьЧтоПакетСобранКорректно"); 16 | ИменаТестов.Добавить("ТестДолжен_ОчиститьКаталогОтСтарыхСкриптовПриОбновленииПакета"); 17 | 18 | Возврат ИменаТестов; 19 | 20 | КонецФункции 21 | 22 | Процедура ПередЗапускомТеста() Экспорт 23 | КонецПроцедуры 24 | 25 | Процедура ПослеЗапускаТеста() Экспорт 26 | мВременныеФайлы.Удалить(); 27 | ПутьККаталогу = ОбъединитьПути(ТекущийКаталог(), "oscript_modules", "test"); 28 | Если ФС.КаталогСуществует(ПутьККаталогу) Тогда 29 | УдалитьФайлы(ПутьККаталогу); 30 | КонецЕсли; 31 | КонецПроцедуры 32 | 33 | Процедура ТестДолжен_ПроверитьЧтоПакетСобранКорректно() Экспорт 34 | 35 | Сборщик = Новый СборщикПакета; 36 | 37 | КаталогСборки = юТест.ИмяВременногоФайла(); 38 | СоздатьКаталог(КаталогСборки); 39 | Сборщик.СобратьПакет(ОбъединитьПути(ТекущийСценарий().Каталог, "testpackage", "testpackage-0.3.1"), Неопределено, КаталогСборки); 40 | 41 | ФайлПакета = Новый Файл(ОбъединитьПути(КаталогСборки, "test-0.3.1.ospx")); 42 | 43 | Утверждения.ПроверитьИстину(ФайлПакета.Существует(), "Файл пакета должен существовать"); 44 | ЧтениеАрхива = Новый ЧтениеZipФайла(ФайлПакета.ПолноеИмя); 45 | 46 | ЭлементСодержимого = ЧтениеАрхива.Элементы.Найти("content.zip"); 47 | ЭлементМанифеста = ЧтениеАрхива.Элементы.Найти("opm-metadata.xml"); 48 | 49 | Утверждения.ПроверитьНеравенство(Неопределено, ЭлементСодержимого); 50 | Утверждения.ПроверитьНеравенство(Неопределено, ЭлементМанифеста); 51 | 52 | КаталогПроверки = ПолучитьИмяВременногоФайла();//юТест.ИмяВременногоФайла(); 53 | СоздатьКаталог(КаталогПроверки); 54 | 55 | ЧтениеАрхива.Извлечь(ЭлементСодержимого, КаталогПроверки); 56 | ЧтениеАрхива.Закрыть(); 57 | 58 | ЧтениеАрхива = Новый ЧтениеZipФайла(ОбъединитьПути(КаталогПроверки, "content.zip")); 59 | ЧтениеАрхива.ИзвлечьВсе(КаталогПроверки); 60 | ЧтениеАрхива.Закрыть(); 61 | ФайлИсходника = Новый Файл(ОбъединитьПути(КаталогПроверки, "folder/src.os")); 62 | Утверждения.ПроверитьИстину(ФайлИсходника.Существует(), "Существует файл в подкаталоге"); 63 | 64 | КонецПроцедуры 65 | 66 | Процедура ТестДолжен_ОчиститьКаталогОтСтарыхСкриптовПриОбновленииПакета() Экспорт 67 | 68 | 69 | //устанавливаем новую версию пакета в которой есть test-new.os 70 | // 71 | //ожидаем что в каталоге пакета есть только test-new.os 72 | 73 | //подготовка двух версий пакета 74 | 75 | Сборщик = Новый СборщикПакета; 76 | 77 | КаталогСборкиПервойВерсии = мВременныеФайлы.СоздатьКаталог(); 78 | 79 | Сборщик.СобратьПакет( 80 | ОбъединитьПути(ТекущийСценарий().Каталог, "testpackage", "testpackage-0.3.1"), 81 | Неопределено, КаталогСборкиПервойВерсии); 82 | 83 | ФайлПакетаВерсии1 = Новый Файл(ОбъединитьПути(КаталогСборкиПервойВерсии, "test-0.3.1.ospx")); 84 | 85 | КаталогСборкиВторойВерсии = мВременныеФайлы.СоздатьКаталог(); 86 | 87 | Сборщик.СобратьПакет( 88 | ОбъединитьПути(ТекущийСценарий().Каталог, "testpackage", "testpackage-0.3.2"), 89 | Неопределено, КаталогСборкиВторойВерсии); 90 | 91 | ФайлПакетаВерсии2 = Новый Файл(ОбъединитьПути(КаталогСборкиВторойВерсии, "test-0.3.2.ospx")); 92 | 93 | Установщик = Новый МенеджерУстановкиПакетов(); 94 | Установщик.УстановитьРежимУстановкиПакетов(РежимУстановкиПакетов.Локально); 95 | Установщик.УстановитьПакетИзАрхива(ФайлПакетаВерсии1.ПолноеИмя, Истина); 96 | 97 | ПутьКФайлуOsТестовогоПакета = ОбъединитьПути( 98 | КонстантыOpm.ЛокальныйКаталогУстановкиПакетов, "test","folder","src.os"); 99 | ФайлOsИзСтарогоПакета = Новый Файл(ПутьКФайлуOsТестовогоПакета); 100 | 101 | ПутьКФайлуDllТестовогоПакета = ОбъединитьПути( 102 | КонстантыOpm.ЛокальныйКаталогУстановкиПакетов, "test","folder","src.dll"); 103 | ФайлDllИзСтарогоПакета = Новый Файл(ПутьКФайлуDllТестовогоПакета); 104 | 105 | Ожидаем.Что(ФайлOsИзСтарогоПакета.Существует(), "Файл src.os должен существовать").ЭтоИстина(); 106 | Ожидаем.Что(ФайлDllИзСтарогоПакета.Существует(), "Файл src.dll должен существовать").ЭтоИстина(); 107 | 108 | Установщик.УстановитьПакетИзАрхива(ФайлПакетаВерсии2.ПолноеИмя, Истина); 109 | 110 | Ожидаем.Что(ФайлOsИзСтарогоПакета.Существует(), "Файл src.os не должен существовать, потому что мы установили новую версию").ЭтоЛожь(); 111 | Ожидаем.Что(ФайлDllИзСтарогоПакета.Существует(), "Файл src.dll не должен существовать, потому что мы установили новую версию").ЭтоЛожь(); 112 | 113 | 114 | КонецПроцедуры 115 | 116 | мВременныеФайлы = Новый МенеджерВременныхФайлов; 117 | -------------------------------------------------------------------------------- /tests/download.os: -------------------------------------------------------------------------------- 1 | #Использовать asserts 2 | #Использовать fs 3 | #Использовать tempfiles 4 | #Использовать "../src/core" 5 | #Использовать "../src/cmd" 6 | 7 | Перем Лог; 8 | 9 | Перем юТест; 10 | Перем мВременныеФайлы; 11 | Перем Проц; 12 | Перем КаталогСборки; 13 | 14 | Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт 15 | 16 | юТест = Тестирование; 17 | 18 | ИменаТестов = Новый Массив; 19 | СИ = Новый СистемнаяИнформация(); 20 | Если НЕ (Найти(СИ.ВерсияОС, "Windows") > 0) Тогда 21 | ИменаТестов.Добавить("ТестДолжен_СкачатьПакетыСЛокальногоХранилища"); 22 | КонецЕсли; 23 | 24 | Возврат ИменаТестов; 25 | 26 | КонецФункции 27 | 28 | Процедура ПередЗапускомТеста() Экспорт 29 | КаталогСборки = юТест.ИмяВременногоФайла(); 30 | СоздатьКаталог(КаталогСборки); 31 | СтрокаЗапуска = "python3 -m http.server"; 32 | Проц = СоздатьПроцесс(СтрокаЗапуска, КаталогСборки); 33 | Проц.Запустить(); 34 | Приостановить(1000); 35 | КонецПроцедуры 36 | 37 | Процедура ПослеЗапускаТеста() Экспорт 38 | 39 | ПутьККаталогу = ОбъединитьПути(ТекущийКаталог(), "oscript_modules", "test"); 40 | Если ФС.КаталогСуществует(ПутьККаталогу) Тогда 41 | УдалитьФайлы(ПутьККаталогу); 42 | КонецЕсли; 43 | Попытка 44 | Проц.Завершить(); 45 | Исключение 46 | КонецПопытки; 47 | 48 | КонецПроцедуры 49 | 50 | Процедура ТестДолжен_СкачатьПакетыСЛокальногоХранилища() Экспорт 51 | 52 | ФайлНастройки = Новый Файл(ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "opm-servers.cfg")); 53 | 54 | Сборщик = Новый СборщикПакета; 55 | КаталогПакета = ОбъединитьПути(ТекущийСценарий().Каталог, "testpackage", "testpackage-0.3.1"); 56 | КопироватьФайл(ФайлНастройки.ПолноеИмя, ОбъединитьПути(КаталогПакета, КонстантыOpm.ИмяФайлаНастроек)); 57 | 58 | мТекущийКаталог = ТекущийКаталог(); 59 | 60 | УстановитьТекущийКаталог(КаталогПакета); 61 | 62 | 63 | Сборщик.СобратьПакет(КаталогПакета, Неопределено, КаталогСборки); 64 | 65 | ФайлПакета = Новый Файл(ОбъединитьПути(КаталогСборки, "test-0.3.1.ospx")); 66 | Утверждения.ПроверитьИстину(ФайлПакета.Существует(), "Файл пакета должен существовать"); 67 | СоздатьКаталог(ОбъединитьПути(КаталогСборки, "test")); 68 | КопироватьФайл(ФайлПакета.ПолноеИмя, ОбъединитьПути(КаталогСборки, "test/test-0.3.1.ospx")); 69 | КопироватьФайл(ФайлПакета.ПолноеИмя, ОбъединитьПути(КаталогСборки, "test/test.ospx")); 70 | 71 | 72 | Запись = Новый ЗаписьТекста(ОбъединитьПути(КаталогСборки, "list.txt")); 73 | Запись.ЗаписатьСтроку("test"); 74 | Запись.Закрыть(); 75 | 76 | ПараметрыПриложенияOpm.НастроитьOpm(); 77 | 78 | МенеджерПолучения = Новый МенеджерПолученияПакетов(); 79 | 80 | Лог.Отладка("Количество доступных пакетов <%1>", МенеджерПолучения.ПолучитьДоступныеПакеты().Количество()); 81 | 82 | ПакетТестДоступен = МенеджерПолучения.ПакетДоступен("test"); 83 | 84 | Утверждения.ПроверитьИстину(ПакетТестДоступен, "Пакета test не существует на внутреннем хабе."); 85 | 86 | МенеджерПолучения = Неопределено; 87 | 88 | РаботаСПакетами.УстановитьПакетИзОблака("test", РежимУстановкиПакетов.Локально, Неопределено); 89 | 90 | КэшЛокальный = Новый КэшУстановленныхПакетов; 91 | Пакеты = КэшЛокальный.ПолучитьУстановленныеПакеты(); 92 | ПутьККаталогу = ОбъединитьПути(ТекущийКаталог(), "oscript_modules", "test"); 93 | 94 | Утверждения.ПроверитьИстину(Новый Файл(ПутьККаталогу).Существует(), "Пакет не существует на локальной машине."); 95 | УдалитьФайлы(ОбъединитьПути(КаталогПакета, КонстантыOpm.ИмяФайлаНастроек)); 96 | 97 | УстановитьТекущийКаталог(мТекущийКаталог); 98 | 99 | КонецПроцедуры 100 | 101 | Лог = Логирование.ПолучитьЛог("oscript.app.opm"); 102 | -------------------------------------------------------------------------------- /tests/fixtures/opm-example.cfg: -------------------------------------------------------------------------------- 1 | { 2 | "Прокси": { 3 | "ИспользоватьПрокси": false, 4 | "ПроксиПоУмолчанию": false, 5 | "Сервер": "", 6 | "Порт": "", 7 | "Пользователь": "", 8 | "Пароль": "", 9 | "ИспользоватьАутентификациюОС": false 10 | }, 11 | "СоздаватьShСкриптЗапуска": false, 12 | "СервераПакетов": [ 13 | { 14 | "Имя":"defaultrepo", 15 | "Сервер": "http://hub.oscript.io", 16 | "Порт": 80, 17 | "ПутьНаСервере":"/download/", 18 | "РесурсПубликацииПакетов": "/push", 19 | }, 20 | { 21 | "Имя":"mylocalhost", 22 | "Сервер": "http://localhost", 23 | "Порт": 8000, 24 | "Таймаут": 600, 25 | "ПутьНаСервере":"/", 26 | "Авторизация": "OAUTH_TOKEN ${OPM_OAUTH_TOKEN}", 27 | "Заголовки": { 28 | "X-Dummy": "${USERNAME}", 29 | "Any-Header": "Any value with ${ENVIRONMENT_VARIABLE}" 30 | } 31 | } 32 | ] 33 | } 34 | -------------------------------------------------------------------------------- /tests/fixtures/opm-incomplete.cfg: -------------------------------------------------------------------------------- 1 | { 2 | "Прокси": { 3 | "ПроксиПоУмолчанию": true 4 | } 5 | } -------------------------------------------------------------------------------- /tests/fixtures/opm-servers.cfg: -------------------------------------------------------------------------------- 1 | { 2 | "СоздаватьShСкриптЗапуска": false, 3 | "СервераПакетов": [ 4 | { 5 | "Имя":"defaultrepo", 6 | "Сервер": "http://hub.oscript.io", 7 | "Порт": 80, 8 | "ПутьНаСервере":"/download/" 9 | }, 10 | { 11 | "Имя":"mylocalhost", 12 | "Сервер": "http://localhost", 13 | "Порт": 8000, 14 | "ПутьНаСервере":"/", 15 | "Авторизация": "", 16 | "Заголовки": { 17 | "X-Dummy": "${USERNAME}" 18 | } 19 | }, 20 | { 21 | "Имя": "Файловый", 22 | "Сервер": "file://", 23 | "ПутьНаСервере": "C:\\opm\\hub", 24 | "Приоритет": 2 25 | } 26 | ] 27 | } 28 | -------------------------------------------------------------------------------- /tests/fixtures/opm.cfg: -------------------------------------------------------------------------------- 1 | { 2 | "Прокси": { 3 | "ИспользоватьПрокси": false, 4 | "ПроксиПоУмолчанию": false, 5 | "Сервер": "", 6 | "Порт": "", 7 | "Пользователь": "", 8 | "Пароль": "", 9 | "ИспользоватьАутентификациюОС": false 10 | }, 11 | "СоздаватьShСкриптЗапуска": false 12 | } 13 | -------------------------------------------------------------------------------- /tests/mft-serializer-test.os: -------------------------------------------------------------------------------- 1 | #Использовать asserts 2 | #Использовать logos 3 | #Использовать "../src/core" 4 | 5 | Перем юТест; 6 | 7 | Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт 8 | 9 | юТест = Тестирование; 10 | 11 | Тесты = Новый Массив; 12 | 13 | Тесты.Добавить("ТестДолжен_ЗаписатьМанифестВXML"); 14 | Тесты.Добавить("ТестДолжен_ЗаписатьМетаданныеВXML"); 15 | Тесты.Добавить("ТестДолжен_ПрочитатьМанифестИзXML"); 16 | 17 | Возврат Тесты; 18 | 19 | КонецФункции 20 | 21 | Процедура ПередЗапускомТеста() Экспорт 22 | КонецПроцедуры 23 | 24 | Процедура ПослеЗапускаТеста() Экспорт 25 | КонецПроцедуры 26 | 27 | Функция СоздатьТестовыйМанифест() 28 | 29 | Манифест = Новый ОписаниеПакета(); 30 | Манифест.Имя("mft-test") 31 | .Автор("Я") 32 | .Версия("1.0.5") 33 | .ВерсияСреды("1.0") 34 | .ВерсияМанифеста("1.0") 35 | .Описание("Это пакет для тестирования") 36 | .АдресАвтора("mail@server.com") 37 | .АдресРепозитория("https://github.com/oscript-library/mypackage") 38 | .ЗависитОт("asserts") 39 | .ЗависитОт("cmdline",">=2.1","<3.0") 40 | .РазработкаЗависитОт("logos") 41 | .Задачи("tasks") 42 | .ВключитьФайл("src") 43 | .ВключитьФайл("tests") 44 | .ОпределяетМодуль("Модуль1", "src/m1.os") 45 | .ОпределяетМодуль("Модуль2", "src/m2.os") 46 | .ОпределяетКласс("Класс1", "src/class1.os") 47 | .ОпределяетКласс("Класс2", "src/class2.os") 48 | .ИсполняемыйФайл("src/app1.os") 49 | .ИсполняемыйФайл("src/app2.os"); 50 | 51 | Возврат Манифест; 52 | 53 | КонецФункции 54 | 55 | Процедура ЗаписатьМанифест(Знач Запись, Знач Манифест) 56 | Сериализатор = Новый СериализацияМетаданныхПакета; 57 | Сериализатор.ЗаписатьXML(Запись, Манифест); 58 | КонецПроцедуры 59 | 60 | Процедура ТестДолжен_ЗаписатьМанифестВXML() Экспорт 61 | 62 | Запись = Новый ЗаписьXML; 63 | Запись.УстановитьСтроку(); 64 | 65 | ЗаписатьМанифест(Запись, СоздатьТестовыйМанифест()); 66 | 67 | Результат = СтрЗаменить(Запись.Закрыть(), Символы.ВК + Символы.ПС, Символы.ПС); 68 | Результат = СтрЗаменить(Результат, " />", "/>"); 69 | 70 | Эталон = 71 | " 72 | | 73 | | mft-test 74 | | Я 75 | | 1.0.5 76 | | 1.0 77 | | 1.0 78 | | Это пакет для тестирования 79 | | mail@server.com 80 | | https://github.com/oscript-library/mypackage 81 | | tasks 82 | | 83 | | 84 | | 85 | | src/app1.os 86 | | src/app2.os 87 | | src 88 | | tests 89 | | 90 | | 91 | | 92 | | 93 | | 94 | | 95 | |"; 96 | 97 | Утверждения.ПроверитьРавенство(Эталон, Результат); 98 | 99 | КонецПроцедуры 100 | 101 | Процедура ТестДолжен_ЗаписатьМетаданныеВXML() Экспорт 102 | 103 | Запись = Новый ЗаписьXML; 104 | Запись.УстановитьСтроку(); 105 | 106 | Сериализатор = Новый СериализацияМетаданныхПакета; 107 | Сериализатор.ЗаписатьМетаданныеВXML(Запись, СоздатьТестовыйМанифест()); 108 | 109 | Результат = СтрЗаменить(Запись.Закрыть(), Символы.ВК+Символы.ПС, Символы.ПС); 110 | Результат = СтрЗаменить(Результат, " />", "/>"); 111 | 112 | Эталон = 113 | " 114 | | 115 | | mft-test 116 | | Я 117 | | 1.0.5 118 | | 1.0 119 | | 1.0 120 | | Это пакет для тестирования 121 | | mail@server.com 122 | | https://github.com/oscript-library/mypackage 123 | | tasks 124 | | 125 | | 126 | | 127 | | src/app1.os 128 | | src/app2.os 129 | |"; 130 | 131 | Утверждения.ПроверитьРавенство(Эталон, Результат); 132 | 133 | КонецПроцедуры 134 | 135 | Процедура ТестДолжен_ПрочитатьМанифестИзXML() Экспорт 136 | 137 | Манифест = СоздатьТестовыйМанифест(); 138 | Запись = Новый ЗаписьXML; 139 | Запись.УстановитьСтроку(); 140 | ЗаписатьМанифест(Запись, Манифест); 141 | Текст = Запись.Закрыть(); 142 | Чтение = Новый ЧтениеXML; 143 | Чтение.УстановитьСтроку(Текст); 144 | 145 | Сериализатор = Новый СериализацияМетаданныхПакета(); 146 | ПрочитанныйМанифест = Сериализатор.ПрочитатьXML(Чтение); 147 | 148 | Утверждения.ПроверитьРавенство(Тип("ОписаниеПакета"), ТипЗнч(ПрочитанныйМанифест), "Сравниваем типы до и после сериализации"); 149 | 150 | СвойстваИсходного = Манифест.Свойства(); 151 | СвойстваПрочитанного = ПрочитанныйМанифест.Свойства(); 152 | 153 | Утверждения.ПроверитьРавенство(СвойстваИсходного.Количество(), СвойстваПрочитанного.Количество(), "Количество свойств"); 154 | Для Каждого КЗ Из СвойстваИсходного Цикл 155 | Утверждения.ПроверитьРавенство(КЗ.Значение, СвойстваПрочитанного[КЗ.Ключ], "Проверка свойства " + КЗ.Ключ); 156 | КонецЦикла; 157 | 158 | ЗависимостиИсходного = Манифест.Зависимости(); 159 | ЗависимостиПроверяемого = ПрочитанныйМанифест.Зависимости(); 160 | 161 | Утверждения.ПроверитьИстину(ТаблицыЗначенийИдентичны(ЗависимостиИсходного, ЗависимостиПроверяемого)); 162 | 163 | ПриложенияИсходного = Манифест.ИсполняемыеФайлы(); 164 | ПриложенияПрочитанного = ПрочитанныйМанифест.ИсполняемыеФайлы(); 165 | 166 | Утверждения.ПроверитьРавенство(ПриложенияИсходного.Количество(), ПриложенияПрочитанного.Количество()); 167 | Для Сч = 0 По ПриложенияИсходного.Количество()-1 Цикл 168 | Утверждения.ПроверитьРавенство(ПриложенияИсходного[Сч].Путь, ПриложенияПрочитанного[Сч].Путь, "Приложение в строке " + Сч); 169 | КонецЦикла; 170 | 171 | МодулиИсходного = Манифест.ВсеМодулиПакета(); 172 | МодулиПрочитанного = ПрочитанныйМанифест.ВсеМодулиПакета(); 173 | 174 | Утверждения.ПроверитьИстину(ТаблицыЗначенийИдентичны(МодулиИсходного, МодулиПрочитанного)); 175 | 176 | КонецПроцедуры 177 | 178 | Функция ТаблицыЗначенийИдентичны(Знач Исходная, Знач Проверяемая) 179 | 180 | Утверждения.ПроверитьРавенство(Исходная.Количество(), Проверяемая.Количество(), "Количество строк должно быть равным"); 181 | Утверждения.ПроверитьРавенство(Исходная.Колонки.Количество(), Проверяемая.Колонки.Количество(), "Количество колоно должно быть равным"); 182 | 183 | Для Сч = 0 По Исходная.Количество()-1 Цикл 184 | СтрокаИсходной = Исходная[Сч]; 185 | СтрокаПроверяемой = Проверяемая[Сч]; 186 | 187 | Для Каждого Колонка Из Исходная.Колонки Цикл 188 | Утверждения.ПроверитьРавенство(СтрокаИсходной[Колонка.Имя], СтрокаПроверяемой[Колонка.Имя], "Проверяем равенство " + Колонка.Имя + " в строке " + Сч); 189 | КонецЦикла; 190 | 191 | КонецЦикла; 192 | 193 | Возврат Истина; 194 | 195 | КонецФункции 196 | 197 | Логирование.ПолучитьЛог("oscript.app.opm").УстановитьУровень(УровниЛога.Отладка); 198 | -------------------------------------------------------------------------------- /tests/packagedef-test.os: -------------------------------------------------------------------------------- 1 | #Использовать asserts 2 | #Использовать "../src/core" 3 | 4 | Перем юТест; 5 | 6 | Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт 7 | 8 | юТест = Тестирование; 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 | Пакет.Имя("имя").Версия("1.0"); 36 | Возврат Пакет; 37 | 38 | КонецФункции 39 | 40 | Функция ТестДолжен_ЗадатьОсновныеМетаданные() Экспорт 41 | 42 | Описание = СоздатьОпределениеПакета(); 43 | 44 | Описание.Имя("ТестовыйПакет") 45 | .Автор("Я") 46 | .Версия("1.0.5") 47 | .ВерсияСреды("1.0") 48 | .ВерсияМанифеста("1.0") 49 | .Описание("Это пакет для тестирования") 50 | .АдресАвтора("mail@server.com") 51 | .АдресРепозитория("https://github.com/oscript-library/mypackage") 52 | ; 53 | 54 | Свойства = Описание.Свойства(); 55 | 56 | Ожидаем.Что(Свойства.Имя).Равно("ТестовыйПакет"); 57 | Ожидаем.Что(Свойства.Автор).Равно("Я"); 58 | Ожидаем.Что(Свойства.Версия).Равно("1.0.5"); 59 | Ожидаем.Что(Свойства.ВерсияСреды).Равно("1.0"); 60 | Ожидаем.Что(Свойства.ВерсияМанифеста).Равно("1.0"); 61 | Ожидаем.Что(Свойства.Описание).Равно("Это пакет для тестирования"); 62 | Ожидаем.Что(Свойства.АдресАвтора).Равно("mail@server.com"); 63 | Ожидаем.Что(Свойства.АдресРепозитория).Равно("https://github.com/oscript-library/mypackage"); 64 | 65 | КонецФункции 66 | 67 | Функция ТестДолжен_ЗадатьЗависимостьБезВерсий() Экспорт 68 | 69 | Пакет = СоздатьОпределениеПакета(); 70 | 71 | Пакет.ЗависитОт("asserts") 72 | .ЗависитОт("cmdline"); 73 | 74 | Ожидаем.Что(Пакет.Зависимость("asserts")).Заполнено(); 75 | Ожидаем.Что(Пакет.Зависимость("cmdline")).Заполнено(); 76 | 77 | КонецФункции 78 | 79 | Функция ТестДолжен_ЗадатьЗависимостьОтВерсии() Экспорт 80 | 81 | Пакет = СоздатьОпределениеПакета(); 82 | 83 | Пакет.ЗависитОт("asserts", "1.0") 84 | .ЗависитОт("cmdline",">=2.1"); 85 | 86 | Ожидаем.Что(Пакет.Зависимость("asserts")).Заполнено(); 87 | Ожидаем.Что(Пакет.Зависимость("cmdline")).Заполнено(); 88 | Ожидаем.Что(Пакет.Зависимость("asserts").МинимальнаяВерсия).Равно("1.0"); 89 | Ожидаем.Что(Пакет.Зависимость("cmdline").МинимальнаяВерсия).Равно(">=2.1"); 90 | 91 | КонецФункции 92 | 93 | Функция ТестДолжен_ЗадатьЗависимостьОтВерсииНоНеБольшеДругой() Экспорт 94 | 95 | Пакет = СоздатьОпределениеПакета(); 96 | 97 | Пакет.ЗависитОт("cmdline",">=2.1","<3.0"); 98 | 99 | Ожидаем.Что(Пакет.Зависимость("cmdline")).Заполнено(); 100 | Ожидаем.Что(Пакет.Зависимость("cmdline").МинимальнаяВерсия).Равно(">=2.1"); 101 | Ожидаем.Что(Пакет.Зависимость("cmdline").МаксимальнаяВерсия).Равно("<3.0"); 102 | 103 | КонецФункции 104 | 105 | Процедура ТестДолжен_ЗадатьСпецификациюМодуля() Экспорт 106 | 107 | Пакет = СоздатьОпределениеПакета(); 108 | 109 | Пакет.ОпределяетМодуль("СуперДелательХорошо", "src/goodmaker.os"); 110 | Пакет.ОпределяетМодуль("СуперДелательХорошо2", "src/goodmaker2.os"); 111 | 112 | Классы = Пакет.Модули(); 113 | 114 | Ожидаем.Что(Классы).ИмеетДлину(2); 115 | Ожидаем.Что(Классы[0].Идентификатор).Равно("СуперДелательХорошо"); 116 | Ожидаем.Что(Классы[0].Тип).Равно("Модуль"); 117 | Ожидаем.Что(Классы[0].Файл).Равно("src/goodmaker.os"); 118 | 119 | Ожидаем.Что(Классы[1].Идентификатор).Равно("СуперДелательХорошо2"); 120 | Ожидаем.Что(Классы[1].Тип).Равно("Модуль"); 121 | Ожидаем.Что(Классы[1].Файл).Равно("src/goodmaker2.os"); 122 | 123 | КонецПроцедуры 124 | 125 | Процедура ТестДолжен_ЗадатьСпецификациюМодуляПовторно() Экспорт 126 | 127 | Пакет = СоздатьОпределениеПакета(); 128 | 129 | Пакет.ОпределяетМодуль("СуперДелательХорошо", "src/goodmaker.os"); 130 | Попытка 131 | Пакет.ОпределяетМодуль("СуперДелательХорошо", "src/goodmaker2.os"); 132 | Исключение 133 | Если ИнформацияОбОшибке().Описание = "Уже определен модуль с именем СуперДелательХорошо" Тогда 134 | Возврат; 135 | КонецЕсли; 136 | ВызватьИсключение; 137 | КонецПопытки; 138 | 139 | юТест.ПрерватьТест("Ожидали что будет выброшено исключение"); 140 | 141 | КонецПроцедуры 142 | 143 | Процедура ТестДолжен_ЗадатьСпецификациюКласса() Экспорт 144 | 145 | Пакет = СоздатьОпределениеПакета(); 146 | 147 | Пакет.ОпределяетКласс("СуперДелательХорошо", "src/goodmaker.os"); 148 | Пакет.ОпределяетКласс("СуперДелательХорошо2", "src/goodmaker2.os"); 149 | 150 | Классы = Пакет.Классы(); 151 | 152 | Ожидаем.Что(Классы).ИмеетДлину(2); 153 | Ожидаем.Что(Классы[0].Идентификатор).Равно("СуперДелательХорошо"); 154 | Ожидаем.Что(Классы[0].Тип).Равно("Класс"); 155 | Ожидаем.Что(Классы[0].Файл).Равно("src/goodmaker.os"); 156 | 157 | Ожидаем.Что(Классы[1].Идентификатор).Равно("СуперДелательХорошо2"); 158 | Ожидаем.Что(Классы[1].Тип).Равно("Класс"); 159 | Ожидаем.Что(Классы[1].Файл).Равно("src/goodmaker2.os"); 160 | 161 | КонецПроцедуры 162 | 163 | Процедура ТестДолжен_ЗадатьСпецификациюКлассаПовторно() Экспорт 164 | 165 | Пакет = СоздатьОпределениеПакета(); 166 | 167 | Пакет.ОпределяетКласс("СуперДелательХорошо", "src/goodmaker.os"); 168 | Попытка 169 | Пакет.ОпределяетКласс("СуперДелательХорошо", "src/goodmaker2.os"); 170 | Исключение 171 | Если ИнформацияОбОшибке().Описание = "Уже определен класс с именем СуперДелательХорошо" Тогда 172 | Возврат; 173 | КонецЕсли; 174 | ВызватьИсключение; 175 | КонецПопытки; 176 | 177 | юТест.ПрерватьТест("Ожидали что будет выброшено исключение"); 178 | КонецПроцедуры 179 | 180 | Процедура ТестДолжен_ЗадатьСпецификациюПриложения() Экспорт 181 | Пакет = СоздатьОпределениеПакета(); 182 | Пакет.ИсполняемыйФайл("src/main.os"); 183 | 184 | Утверждения.ПроверитьРавенство("src/main.os", Пакет.ИсполняемыеФайлы()[0].Путь); 185 | 186 | КонецПроцедуры 187 | -------------------------------------------------------------------------------- /tests/packagelist.os: -------------------------------------------------------------------------------- 1 | #Использовать asserts 2 | #Использовать "../src/core" 3 | 4 | Перем юТест; 5 | 6 | Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт 7 | 8 | юТест = Тестирование; 9 | 10 | СписокТестов = Новый Массив; 11 | 12 | СписокТестов.Добавить("ТестДолжен_ПолучитьПакетыХаба"); 13 | СписокТестов.Добавить("ТестДолжен_ПроверитьРегистроНезависимостьПакетовХаба"); 14 | 15 | Возврат СписокТестов; 16 | 17 | КонецФункции 18 | 19 | Процедура ПередЗапускомТеста() Экспорт 20 | // Завязаны на основной хаб. 21 | НастройкиOpm.СброситьНастройки(); 22 | НастройкиOpm.ДобавитьСерверПакетов(СерверыПакетов.ОсновнойСервер()); 23 | КонецПроцедуры 24 | 25 | Процедура ПослеЗапускаТеста() Экспорт 26 | КонецПроцедуры 27 | 28 | Функция ТестДолжен_ПолучитьПакетыХаба() Экспорт 29 | 30 | МенеджерПолучения = Новый МенеджерПолученияПакетов(); 31 | СписокПакетовХаба = МенеджерПолучения.ПолучитьДоступныеПакеты(); 32 | 33 | Ожидаем.Что(СписокПакетовХаба.Количество()).Больше(1); 34 | 35 | НайденПакет_gitsync = МенеджерПолучения.ПакетДоступен("gitsync"); 36 | НайденПакет_opm = МенеджерПолучения.ПакетДоступен("opm"); 37 | НайденНесуществующийПакет = МенеджерПолучения.ПакетДоступен("someelsepackadge"); 38 | 39 | Ожидаем.Что(НайденПакет_gitsync).Равно(Истина); 40 | Ожидаем.Что(НайденПакет_opm).Равно(Истина); 41 | Ожидаем.Что(НайденНесуществующийПакет).Равно(Ложь); 42 | 43 | КонецФункции 44 | 45 | Функция ТестДолжен_ПроверитьРегистроНезависимостьПакетовХаба() Экспорт 46 | 47 | ИзмененноеИмяПакета = "PARSERFileV8i"; 48 | 49 | МенеджерПолучения = Новый МенеджерПолученияПакетов(); 50 | ПакетДоступен = МенеджерПолучения.ПакетДоступен(ИзмененноеИмяПакета); 51 | 52 | Ожидаем.Что(ПакетДоступен).Равно(Истина); 53 | 54 | КонецФункции 55 | -------------------------------------------------------------------------------- /tests/pkg-cache.os: -------------------------------------------------------------------------------- 1 | #Использовать asserts 2 | #Использовать "../src/core" 3 | Перем юТест; 4 | 5 | Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт 6 | 7 | юТест = Тестирование; 8 | 9 | ИменаТестов = Новый Массив; 10 | 11 | ИменаТестов.Добавить("ТестДолжен_ПроверитьЧтоПакетУстановлен"); 12 | 13 | Возврат ИменаТестов; 14 | 15 | КонецФункции 16 | 17 | Процедура ПередЗапускомТеста() Экспорт 18 | КонецПроцедуры 19 | 20 | Процедура ПослеЗапускаТеста() Экспорт 21 | КонецПроцедуры 22 | 23 | Процедура ТестДолжен_ПроверитьЧтоПакетУстановлен() Экспорт 24 | 25 | КаталогБиблиотеки = ОбъединитьПути(КаталогПрограммы(), ПолучитьЗначениеСистемнойНастройки("lib.system")); 26 | 27 | ФайлыКаталога = НайтиФайлы(КаталогБиблиотеки, ПолучитьМаскуВсеФайлы()); 28 | НайденныйКаталог = Неопределено; 29 | Для Каждого Каталог Из ФайлыКаталога Цикл 30 | Если Каталог.ЭтоКаталог() Тогда 31 | НайденныйКаталог = Каталог; 32 | Прервать; 33 | КонецЕсли; 34 | КонецЦикла; 35 | 36 | Утверждения.ПроверитьЛожь(НайденныйКаталог = Неопределено, "в библиотеке должен быть хоть один пакет"); 37 | 38 | КэшПакетов = Новый КэшУстановленныхПакетов(); 39 | ОписаниеЗависимости = Новый Структура("ИмяПакета, МинимальнаяВерсия, МаксимальнаяВерсия", Каталог.Имя); 40 | Утверждения.ПроверитьИстину(КэшПакетов.ПакетУстановлен(ОписаниеЗависимости), "Должен быть найден пакет " + Каталог.Имя); 41 | 42 | КонецПроцедуры 43 | -------------------------------------------------------------------------------- /tests/testpackage/testpackage-0.3.1/folder/src.dll: -------------------------------------------------------------------------------- 1 | // заглушка 2 | -------------------------------------------------------------------------------- /tests/testpackage/testpackage-0.3.1/folder/src.os: -------------------------------------------------------------------------------- 1 | // заглушка 2 | -------------------------------------------------------------------------------- /tests/testpackage/testpackage-0.3.1/packagedef: -------------------------------------------------------------------------------- 1 |  2 | Описание.Имя("test") 3 | .Версия("0.3.1") 4 | .ВключитьФайл("folder"); 5 | -------------------------------------------------------------------------------- /tests/testpackage/testpackage-0.3.2/folder/src-new.dll: -------------------------------------------------------------------------------- 1 | // заглушка 2 | -------------------------------------------------------------------------------- /tests/testpackage/testpackage-0.3.2/folder/src-new.os: -------------------------------------------------------------------------------- 1 | // заглушка 2 | -------------------------------------------------------------------------------- /tests/testpackage/testpackage-0.3.2/packagedef: -------------------------------------------------------------------------------- 1 | ПутьКВложенномуФайлу = ОбъединитьПути(ТекущийСценарий().Каталог, "folder", "src-new.os"); 2 | Заглушка = ЗагрузитьСценарий(ПутьКВложенномуФайлу); 3 | 4 | Описание.Имя("test") 5 | .Версия("0.3.2") 6 | .ВключитьФайл("folder") 7 | .ВключитьФайл("packagedef"); 8 | -------------------------------------------------------------------------------- /tests/versions-test.os: -------------------------------------------------------------------------------- 1 |  2 | #Использовать asserts 3 | #Использовать "../src/core" 4 | 5 | Перем юТест; 6 | 7 | Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт 8 | 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 | Версия = РаботаСВерсиями.РазобратьВерсиюНаКомпоненты("1.5.12.7"); 34 | 35 | Ожидаем.Что(Версия.СтаршийНомер).Равно("1"); 36 | Ожидаем.Что(Версия.МладшийНомер).Равно("5"); 37 | Ожидаем.Что(Версия.Релиз).Равно("12"); 38 | Ожидаем.Что(Версия.Ревизия).Равно("7"); 39 | 40 | КонецПроцедуры 41 | 42 | Процедура ТестДолжен_ПолучитьПустуюСтруктуруВерсии() Экспорт 43 | 44 | Версия = РаботаСВерсиями.СоздатьВерсию(); 45 | 46 | Ожидаем.Что(Версия.Свойство("СтаршийНомер")).ЭтоИстина(); 47 | Ожидаем.Что(Версия.Свойство("МладшийНомер")).ЭтоИстина(); 48 | Ожидаем.Что(Версия.Свойство("Релиз")).ЭтоИстина(); 49 | Ожидаем.Что(Версия.Свойство("Ревизия")).ЭтоИстина(); 50 | 51 | КонецПроцедуры 52 | 53 | Процедура ТестДолжен_ЗаписатьВерсиюВСтроку() Экспорт 54 | 55 | Версия = РаботаСВерсиями.РазобратьВерсиюНаКомпоненты("1.0.7"); 56 | Ожидаем.Что(РаботаСВерсиями.ЗаписатьВерсиюВСтроку(Версия)).Равно("1.0.7"); 57 | 58 | Версия = РаботаСВерсиями.РазобратьВерсиюНаКомпоненты("1.0.7.5"); 59 | Ожидаем.Что(РаботаСВерсиями.ЗаписатьВерсиюВСтроку(Версия)).Равно("1.0.7.5"); 60 | 61 | Версия = РаботаСВерсиями.РазобратьВерсиюНаКомпоненты("1.0"); 62 | Ожидаем.Что(РаботаСВерсиями.ЗаписатьВерсиюВСтроку(Версия)).Равно("1.0"); 63 | 64 | Версия = РаботаСВерсиями.РазобратьВерсиюНаКомпоненты("1"); 65 | Ожидаем.Что(РаботаСВерсиями.ЗаписатьВерсиюВСтроку(Версия)).Равно("1.0"); 66 | 67 | КонецПроцедуры 68 | 69 | Процедура ТестДолжен_ПроверитьЧтоВерсияАБольшеВерсииБ() Экспорт 70 | 71 | ВерсияА = "1.2.2.7"; 72 | ВерсияБ = "1.1.10.4"; 73 | 74 | Ожидаем.Что(РаботаСВерсиями.СравнитьВерсии(ВерсияА, ВерсияБ)).Больше(0); 75 | 76 | КонецПроцедуры 77 | 78 | Процедура ТестДолжен_ПолучитьИмяИВерсиюПоИмениПакетаБезВерсии() Экспорт 79 | 80 | Пакет = РаботаСВерсиями.РазобратьИмяПакета("opm"); 81 | Ожидаем.Что(Пакет.ИмяПакета).Равно("opm"); 82 | Ожидаем.Что(Пакет.Версия).Равно(Неопределено); 83 | 84 | КонецПроцедуры 85 | 86 | Процедура ТестДолжен_ПолучитьИмяИВерсиюПоИмениПакетаСВерсией() Экспорт 87 | 88 | Пакет = РаботаСВерсиями.РазобратьИмяПакета("opm@1.1.1"); 89 | Ожидаем.Что(Пакет.ИмяПакета).Равно("opm"); 90 | Ожидаем.Что(Пакет.Версия).Равно("1.1.1"); 91 | 92 | КонецПроцедуры 93 | 94 | Процедура ТестДолжен_СравнитьЧетырехзначныеВерсии() Экспорт 95 | 96 | // Тестируем сравнение четырехзначных версий (не семвер) 97 | ВерсияА = "1.2.3.4"; 98 | ВерсияБ = "1.2.3.3"; 99 | 100 | // Проверяем что старый механизм может сравнивать 4-значные версии 101 | РезультатСравнения = РаботаСВерсиями.СравнитьВерсии(ВерсияА, ВерсияБ); 102 | Ожидаем.Что(РезультатСравнения).Больше(0); 103 | 104 | // Проверяем равенство 105 | РезультатСравнения = РаботаСВерсиями.СравнитьВерсии(ВерсияА, ВерсияА); 106 | Ожидаем.Что(РезультатСравнения).Равно(0); 107 | 108 | // Проверяем меньше 109 | РезультатСравнения = РаботаСВерсиями.СравнитьВерсии(ВерсияБ, ВерсияА); 110 | Ожидаем.Что(РезультатСравнения).Меньше(0); 111 | 112 | КонецПроцедуры 113 | --------------------------------------------------------------------------------