diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml new file mode 100644 index 0000000..8e49149 --- /dev/null +++ b/.github/workflows/testing.yml @@ -0,0 +1,22 @@ +name: Тестирование + +on: + push: + pull_request: + workflow_dispatch: + +jobs: + test: + strategy: + fail-fast: false + matrix: + oscript_version: ['default', 'stable', 'dev'] + test_engine: ['1testrunner'] + include: + - oscript_version: 'dev' + test_engine: 'oneunit' + + uses: autumn-library/workflows/.github/workflows/test.yml@oneunit + with: + oscript_version: ${{ matrix.oscript_version }} + test_engine: ${{ matrix.test_engine }} diff --git a/features/install-with-alias.feature b/features/install-with-alias.feature index 60a8f8a..ecd3c42 100644 --- a/features/install-with-alias.feature +++ b/features/install-with-alias.feature @@ -11,14 +11,14 @@ Сценарий: Установка версии с алиасом Допустим Я удаляю каталог "./temp/ovm" - Когда Я выполняю команду "ovm install --name test_stable stable" + Когда Я выполняю команду "oscript ./src/cmd/ovm.os install --name test_stable stable" И я вижу в консоли вывод "Установка OneScript stable завершена" И я вижу в консоли вывод "ovm use test_stable" - Когда Я выполняю команду "ovm ls" + Когда Я выполняю команду "oscript ./src/cmd/ovm.os ls" Тогда я вижу в консоли строку подобно "^test_stable -> .*" И я не вижу в консоли строку подобно "^stable -> .*" Сценарий: Использование версии - Когда Я выполняю команду "ovm use test_stable" + Когда Я выполняю команду "oscript ./src/cmd/ovm.os use test_stable" Тогда я вижу в консоли вывод "OneScript test_stable активирован" diff --git a/features/install-with-clean.feature b/features/install-with-clean.feature index 09ca0a1..88626c4 100644 --- a/features/install-with-clean.feature +++ b/features/install-with-clean.feature @@ -12,14 +12,14 @@ Сценарий: Установка движка с сохранением библиотек Допустим Я удаляю каталог "./temp/ovm" - И Я выполняю команду "ovm install stable" + И Я выполняю команду "oscript ./src/cmd/ovm.os install stable" И Я создаю каталог "my_lib" в подкаталоге "temp/ovm/stable/lib" рабочего каталога - Когда Я выполняю команду "ovm install stable" + Когда Я выполняю команду "oscript ./src/cmd/ovm.os install stable" Тогда В подкаталоге "temp/ovm/stable/lib" рабочего каталога существует каталог "my_lib" Сценарий: Установка движка с удалением библиотек Допустим Я удаляю каталог "./temp/ovm" - И Я выполняю команду "ovm install stable" + И Я выполняю команду "oscript ./src/cmd/ovm.os install stable" И Я создаю каталог "my_lib" в подкаталоге "temp/ovm/stable/lib" рабочего каталога - Когда Я выполняю команду "ovm install --clean stable" + Когда Я выполняю команду "oscript ./src/cmd/ovm.os install --clean stable" Тогда Каталог "./temp/ovm/stable/lib/my_lib" не существует diff --git a/features/integration.feature b/features/integration.feature index 1f93ada..8f6c5a4 100644 --- a/features/integration.feature +++ b/features/integration.feature @@ -10,41 +10,42 @@ Допустим Я устанавливаю переменной среды "OVM_INSTALL_PATH" значение "./temp/ovm" Сценарий: Вывод справки - Когда Я выполняю команду "ovm" + Когда Я выполняю команду "oscript ./src/cmd/ovm.os" Тогда я вижу в консоли вывод "OneScript Version Manager" И я вижу в консоли вывод "Строка запуска: ovm [ОПЦИИ] КОМАНДА [аргументы...]" Сценарий: Вывод версии - Когда Я выполняю команду "ovm -v" + Когда Я выполняю команду "oscript ./src/cmd/ovm.os -v" Тогда я вижу в консоли строку подобно "\d+\.\d+\.\d+" Сценарий: Установка версии - Когда Я выполняю команду "ovm install stable" + Когда Я выполняю команду "oscript ./src/cmd/ovm.os install stable" Тогда я вижу в консоли вывод "Установка OneScript stable..." И я вижу в консоли вывод "Установка OneScript stable завершена" И я вижу в консоли вывод "ovm use stable" - Когда Я выполняю команду "ovm ls" + Когда Я выполняю команду "oscript ./src/cmd/ovm.os ls" Тогда я вижу в консоли строку подобно "stable -> .*" Сценарий: Использование версии - Допустим Я выполняю команду "ovm install stable" - И Я выполняю команду "ovm use stable" + Допустим Я выполняю команду "oscript ./src/cmd/ovm.os install stable" + И Я выполняю команду "oscript ./src/cmd/ovm.os use stable" Тогда я вижу в консоли вывод "OneScript stable активирован" Сценарий: Удаление версии тождественной текущей - Когда Я выполняю команду "ovm install --name latest stable" + Когда Я выполняю команду "oscript ./src/cmd/ovm.os install --name latest stable" Тогда я вижу в консоли вывод "Установка OneScript stable..." И я вижу в консоли вывод "Установка OneScript stable завершена" И я вижу в консоли вывод "ovm use latest" - Когда Я выполняю команду "ovm delete latest" + Когда Я выполняю команду "oscript ./src/cmd/ovm.os delete latest" Тогда Я Показываю вывод команды И я не вижу в консоли вывод "Версия не удалена, т.к. является текущей." И я вижу в консоли вывод "Версия latest удалена" -Сценарий: Проверка использования версии - Когда Я выполняю команду "ovm ls" +Сценарий: Проверка использования версии Linux + Допустим Я пропускаю этот сценарий в Windows + Когда Я выполняю команду "oscript ./src/cmd/ovm.os ls" И Я Показываю вывод команды Тогда я вижу в консоли строку подобно "current -> .*" И Я выполняю команду "which oscript" @@ -52,11 +53,21 @@ И Я выполняю команду "which opm" И я вижу в консоли строку подобно ".*opm$" +Сценарий: Проверка использования версии Windows + Допустим Я пропускаю этот сценарий в Linux + Когда Я выполняю команду "oscript ./src/cmd/ovm.os ls" + И Я Показываю вывод команды + Тогда я вижу в консоли строку подобно "current -> .*" + И Я выполняю команду "where oscript" + И я вижу в консоли строку подобно ".*oscript.exe$" + И Я выполняю команду "where opm" + И я вижу в консоли строку подобно ".*opm.bat$" + Сценарий: Проверка установки x64 и опции --x86 - Когда Я выполняю команду "ovm install stable" + Когда Я выполняю команду "oscript ./src/cmd/ovm.os install stable" Тогда я вижу в консоли вывод "Скачиваю установщик версии stable-x64..." И я вижу в консоли вывод "Установка OneScript stable завершена" - Когда Я выполняю команду "ovm install --x86 stable" + Когда Я выполняю команду "oscript ./src/cmd/ovm.os install --x86 stable" Тогда я вижу в консоли вывод "Скачиваю установщик версии stable..." И я вижу в консоли вывод "Установка OneScript stable завершена" diff --git a/features/list.feature b/features/list.feature index d962c20..735870f 100644 --- a/features/list.feature +++ b/features/list.feature @@ -10,7 +10,7 @@ Допустим Я устанавливаю переменной среды "OVM_INSTALL_PATH" значение "./temp/ovm" Сценарий: Использование версии - Когда Я выполняю команду "ovm ls -r" + Когда Я выполняю команду "oscript ./src/cmd/ovm.os ls -r" Тогда я вижу в консоли строку подобно "^\d+\.\d+\.\d+\s\(http.*\)" И я вижу в консоли строку подобно "^dev\s\(http.*\)" И я вижу в консоли строку подобно "^stable\s\(http.*\)" diff --git a/packagedef b/packagedef index 2885239..65c1083 100644 --- a/packagedef +++ b/packagedef @@ -4,17 +4,18 @@ .АдресАвтора("nixel2007@gmail.com") .Описание("OneScript Version Manager") .ВерсияСреды("1.9.2") - .ЗависитОт("json") - .ЗависитОт("1commands", "1.3.2") + .ЗависитОт("1commands", "1.5.0") .ЗависитОт("fluent", "0.6.1") - .ЗависитОт("fs") - .ЗависитОт("tempfiles") - .ЗависитОт("strings") - .ЗависитОт("autumn", "3.2.0") - .ЗависитОт("autumn-logos", "1.1.1") - .ЗависитОт("autumn-cli", "1.0.5") - .ЗависитОт("collectionos", "0.3.0") - .ЗависитОт("cpuinfo", "1.1.0") - .РазработкаЗависитОт("1bdd", "1.13.0") + .ЗависитОт("fs", "1.2.0") + .ЗависитОт("tempfiles", "1.1.1") + .ЗависитОт("strings", "0.5.0") + .ЗависитОт("autumn", "4.3.9") + .ЗависитОт("autumn-logos", "1.2.0") + .ЗависитОт("autumn-cli", "1.1.0") + .ЗависитОт("collectionos", "0.8.1") + .ЗависитОт("cpuinfo", "1.2.0") + .ЗависитОт("annotations", "1.3.0") + .РазработкаЗависитОт("1bdd", "1.15.1") + .РазработкаЗависитОт("moskito", "0.4.1") .ИсполняемыйФайл("src/cmd/ovm.os", "ovm") ; diff --git a/src/cmd/ovm.os b/src/cmd/ovm.os index 7e3b8ed..6c10faf 100644 --- a/src/cmd/ovm.os +++ b/src/cmd/ovm.os @@ -36,32 +36,4 @@ СоветДругогоМастера.ЗначенияДеталек(НастройкиЛогоса()); Поделка = Новый Поделка(СоветДругогоМастера); - -УпакованВИсполняемыйФайл = СтрНайти(ТекущийСценарий().Источник, "oscript://") <> 0; - -Если УпакованВИсполняемыйФайл Тогда - Поделка - .ДобавитьЗаготовку(Тип("ИнициализацияИнтефейсаКоманднойСтроки")) - .ДобавитьЗаготовку(Тип("ИнициализацияФабрикиЛогов")); -КонецЕсли; - -Поделка - .ДобавитьАннотацию(Тип("АннотацияЛогOVM")) - .ДобавитьЖелудь(Тип("ФайлНастроек")) - .ДобавитьЖелудь(Тип("УстановщикOneScript")) - .ДобавитьЖелудь(Тип("РаскладкаЛогOVM")) - .ДобавитьЖелудь(Тип("ПараметрыOVM")) - .ДобавитьЖелудь(Тип("ПараметрыПриложения")) - .ДобавитьЖелудь(Тип("ДеинсталляторOneScript")) - .ДобавитьЖелудь(Тип("ВерсииOneScript")) - .ДобавитьЖелудь(Тип("АппендерЛогOVM")) - .ДобавитьЖелудь(Тип("АктиваторOneScript")) - .ДобавитьЖелудь(Тип("КомандаConfig")) - .ДобавитьЖелудь(Тип("КомандаInstall")) - .ДобавитьЖелудь(Тип("КомандаList")) - .ДобавитьЖелудь(Тип("КомандаRun")) - .ДобавитьЖелудь(Тип("КомандаUninstall")) - .ДобавитьЖелудь(Тип("КомандаUse")) - .ДобавитьЖелудь(Тип("КомандаWhich")); - Поделка.ЗапуститьПриложение(); diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\320\270OneScript.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\320\270OneScript.os" index 4ab5bd3..66eec04 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\320\270OneScript.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\320\270OneScript.os" @@ -9,6 +9,9 @@ &Пластилин Перем ПараметрыOVM; +&Пластилин +Перем ПровайдерДистрибутивовВерсии; + Перем ЭтоWindows; Перем ДопустимыеАлиасы; // Кеш коллекции допустимых алиасов @@ -215,17 +218,17 @@ // Функция ПолучитьСписокДоступныхКУстановкеВерсий() Экспорт - Таймаут = 10; - Соединение = Новый HTTPСоединение( - ПараметрыOVM.АдресСайтаОСкрипт(), - , - , - , - , - Таймаут - ); - - Возврат ПолучитьВерсииПоAPI(Соединение); + // Запрашиваем сайт + ДоступныеВерсии = ПровайдерДистрибутивовВерсии.ПолучитьСписокДоступныхКУстановкеВерсий(); + + // Дополняем таблицу нашими алиасами + Итератор = ДопустимыеАлиасы().Ключи().Итератор(); + + Пока Итератор.ЕстьСледующий() Цикл + ОбеспечитьСтрокуВерсииПоАлиасу(ДоступныеВерсии, Итератор.Следующий(), "Путь"); + КонецЦикла; + + Возврат ДоступныеВерсии; КонецФункции @@ -245,73 +248,7 @@ // https://oscript.io/api/archive/<токен версии> - данная таблица // Функция ПолучитьДоступныеВидыДистрибутивовВерсии(Знач НомерВерсии) Экспорт - Таймаут = 10; - Соединение = Новый HTTPСоединение( - ПараметрыOVM.АдресСайтаОСкрипт(), - , - , - , - , - Таймаут - ); - - Запрос = Новый HTTPЗапрос("api/archive?all=true"); - Ответ = Соединение.Получить(Запрос); - HTTP_OK = 200; - Если Ответ.КодСостояния <> HTTP_OK Тогда - ВызватьИсключение СтрШаблон("Не удалось найти версию %1 на сайте: Статус: %2, Ответ: %3", - НомерВерсии, - Ответ.КодСостояния, - Ответ.ПолучитьТелоКакСтроку() - ); - КонецЕсли; - - ЧтениеJSON = Новый ЧтениеJSON(); - ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку()); - - МассивВерсий = ПрочитатьJSON(ЧтениеJSON, Ложь); - ИскомыйТокенВерсии = Неопределено; - Для Каждого ОписаниеВерсии Из МассивВерсий Цикл - Если НомерВерсии = ОписаниеВерсии.presentation Тогда - ИскомыйТокенВерсии = ОписаниеВерсии.token; - КонецЕсли; - КонецЦикла; - - Если ИскомыйТокенВерсии = Неопределено Тогда - ВызватьИсключение СтрШаблон("Не удалось найти версию %1 на сайте.", НомерВерсии); - КонецЕсли; - - Запрос = Новый HTTPЗапрос("api/archive/" + ИскомыйТокенВерсии); - Ответ = Соединение.Получить(Запрос); - HTTP_OK = 200; - Если Ответ.КодСостояния <> HTTP_OK Тогда - ВызватьИсключение СтрШаблон("Не удалось найти файлы версии %1 на сайте: Статус: %2, Ответ: %3", - НомерВерсии, - Ответ.КодСостояния, - Ответ.ПолучитьТелоКакСтроку() - ); - КонецЕсли; - - ТаблицаРезультата = Новый ТаблицаЗначений(); - ТаблицаРезультата.Колонки.Добавить("Вид"); - ТаблицаРезультата.Колонки.Добавить("ИмяФайла"); - ТаблицаРезультата.Колонки.Добавить("Архитектура"); - ТаблицаРезультата.Колонки.Добавить("Ссылка"); - - ЧтениеJSON = Новый ЧтениеJSON(); - ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку()); - - МассивФайлов = ПрочитатьJSON(ЧтениеJSON, Ложь); - Для Каждого ОписаниеФайла Из МассивФайлов Цикл - СтрокаТаблицы = ТаблицаРезультата.Добавить(); - СтрокаТаблицы.Вид = ОписаниеФайла.id; - СтрокаТаблицы.ИмяФайла = ОписаниеФайла.filename; - СтрокаТаблицы.Архитектура = ОписаниеФайла.arch; - СтрокаТаблицы.Ссылка = ОписаниеФайла.link; - КонецЦикла; - - Возврат ТаблицаРезультата; - + Возврат ПровайдерДистрибутивовВерсии.ПолучитьДоступныеВидыДистрибутивовВерсии(НомерВерсии); КонецФункции // <Описание функции> @@ -399,36 +336,19 @@ КонецФункции -Функция ПолучитьВерсииПоAPI(Знач Соединение) - Запрос = Новый HTTPЗапрос("api/archive"); - Ответ = Соединение.Получить(Запрос); - HTTP_OK = 200; - Если Ответ.КодСостояния <> HTTP_OK Тогда - ВызватьИсключение СтрШаблон("Не удалось получить список версий с сайта. Код ошибки: %1", Ответ.КодСостояния); - КонецЕсли; - - ЧтениеJSON = Новый ЧтениеJSON(); - ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку()); +// Регулярное выражение версии по semver +// +// Возвращаемое значение: +// Строка - Регулярное выражение +// +Функция МаскаНомераВерсииSemver() Экспорт + // https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string + // https://regex101.com/r/vkijKf/1/ + + // BSLLS:LineLength-off + Возврат "^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$"; + // BSLLS:LineLength-on - ДоступныеВерсии = Новый ТаблицаЗначений; - ДоступныеВерсии.Колонки.Добавить("Алиас"); - ДоступныеВерсии.Колонки.Добавить("Путь"); - - АдресСайтаОСкрипт = ПараметрыOVM.АдресСайтаОСкрипт(); - МассивВерсий = ПрочитатьJSON(ЧтениеJSON, Ложь); - Для Каждого ОписаниеВерсии Из МассивВерсий Цикл - ДоступнаяВерсия = ДоступныеВерсии.Добавить(); - ДоступнаяВерсия.Алиас = ОписаниеВерсии.presentation; - ДоступнаяВерсия.Путь = АдресСайтаОСкрипт + ОписаниеВерсии.link; - КонецЦикла; - - Итератор = ДопустимыеАлиасы().Ключи().Итератор(); - - Пока Итератор.ЕстьСледующий() Цикл - ОбеспечитьСтрокуВерсииПоАлиасу(ДоступныеВерсии, Итератор.Следующий(), "Путь"); - КонецЦикла; - - Возврат ДоступныеВерсии; КонецФункции Процедура ОбеспечитьСтрокуВерсииПоАлиасу(ТаблицаВерсий, Алиас, ИмяРеквизитаПуть = "ПутьСервер") diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\202\320\265\320\272\321\202\320\276\321\200\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\202\320\265\320\272\321\202\320\276\321\200\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217.os" new file mode 100644 index 0000000..c5e963a --- /dev/null +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\202\320\265\320\272\321\202\320\276\321\200\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217.os" @@ -0,0 +1,20 @@ +#Использовать cpuinfo + +Перем СистемнаяИнформация; + +&Табакерка +&Пластилин("Процессор") +Перем ПровайдерИнформацииОПроцессоре; + +&Желудь +Процедура ПриСозданииОбъекта() + СистемнаяИнформация = Новый СистемнаяИнформация(); +КонецПроцедуры + +Функция ТипПлатформы() Экспорт + Возврат СистемнаяИнформация.ТипПлатформы; +КонецФункции + +Функция АрхитектураПроцессора() Экспорт + Возврат ПровайдерИнформацииОПроцессоре.Достать().Архитектура; +КонецФункции diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\321\203\320\261\320\241\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\276\320\274.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\321\203\320\261\320\241\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\276\320\274.os" new file mode 100644 index 0000000..3e7869a --- /dev/null +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\321\203\320\261\320\241\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\276\320\274.os" @@ -0,0 +1,11 @@ +#Использовать cpuinfo + +&Дуб +Процедура ПриСозданииОбъекта() + // Дуб выращивает процессоры для помещения в табакерку желудя ДетекторОкружения. И нет, я не сошел с ума. +КонецПроцедуры + +&Завязь(Тип = "ИнформацияОПроцессоре") +Функция Процессор() Экспорт + Возврат Новый ИнформацияОПроцессоре(); +КонецФункции \ No newline at end of file diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\270\321\202\320\265\320\273\321\214\320\224\320\270\321\201\321\202\321\200\320\270\320\261\321\203\321\202\320\270\320\262\320\260.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\270\321\202\320\265\320\273\321\214\320\224\320\270\321\201\321\202\321\200\320\270\320\261\321\203\321\202\320\270\320\262\320\260.os" new file mode 100644 index 0000000..1671b68 --- /dev/null +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\270\321\202\320\265\320\273\321\214\320\224\320\270\321\201\321\202\321\200\320\270\320\261\321\203\321\202\320\270\320\262\320\260.os" @@ -0,0 +1,119 @@ +#Использовать cpuinfo + +Перем ДетекторОкружения; + +Перем ИспользоватьFDD; +Перем ИспользоватьХ64; +Перем ЭтоДистрибутивНеткор; + +&Желудь +&Характер("Компанейский") +Процедура ПриСозданииОбъекта(&Пластилин("ДетекторОкружения") Знач Детектор) + ДетекторОкружения = Детектор; + ИспользоватьFDD = Ложь; + ИспользоватьХ64 = Ложь; + ЭтоДистрибутивНеткор = Неопределено; +КонецПроцедуры + +Функция ИспользоватьFDD(Знач Использовать) Экспорт + ИспользоватьFDD = Использовать; + Возврат ЭтотОбъект; +КонецФункции + +Функция ИспользоватьХ64(Знач Использовать) Экспорт + ИспользоватьХ64 = Использовать; + Возврат ЭтотОбъект; +КонецФункции + +Функция ЭтоДистрибутивНеткор(Знач Да) Экспорт + ЭтоДистрибутивНеткор = Да; + Возврат ЭтотОбъект; +КонецФункции + +Функция Выбрать(Знач ПереченьФайлов) Экспорт + + Если ЭтоДистрибутивНеткор = Истина Тогда + ВидДистрибутива = ?(ИспользоватьFDD, "fdd", ТипДистрибутиваТекущейПлатформы()); + ИначеЕсли ЭтоДистрибутивНеткор = Ложь Тогда + ВидДистрибутива = "zip"; + ИначеЕсли ИспользоватьFDD Тогда + ЭтоДистрибутивНеткор = Истина; + ВидДистрибутива = "fdd"; + Иначе + // Это установка по алиасу и мы не знаем, версия 2 это или нет. + // Определим это с двух попыток ниже. + ВидДистрибутива = Неопределено; + КонецЕсли; + + Возврат НайтиПодходящийДистрибутив(ПереченьФайлов, ВидДистрибутива, ИспользоватьХ64); + +КонецФункции + +Функция ПризнакАрхитектуры(Знач ИспользоватьХ64) + Возврат ?(ИспользоватьХ64, "x64", "x86"); +КонецФункции + +Функция НайтиПодходящийДистрибутив(Знач ПереченьФайлов, Знач ВидДистрибутива, Знач ИспользоватьХ64) + КритерийПоиска = Новый Структура; + КритерийПоиска.Вставить("Вид"); + КритерийПоиска.Вставить("Архитектура"); + + РежимАлиаса = (ВидДистрибутива = Неопределено); + + Если РежимАлиаса Тогда + КритерийПоиска.Вид = ТипДистрибутиваТекущейПлатформы(); + Иначе + КритерийПоиска.Вид = ВидДистрибутива; + КонецЕсли; + + КритерийПоиска.Архитектура = ПризнакАрхитектуры(ИспользоватьХ64); + + НайденныеСтроки = ПереченьФайлов.НайтиСтроки(КритерийПоиска); + Если НайденныеСтроки.Количество() <> 1 Тогда + // Это может быть установка по алиасу и тогда есть шанс у дистрибутива zip для версии 1 + Если РежимАлиаса Тогда + КритерийПоиска.Вид = "zip"; + КонецЕсли; + + НайденныеСтроки = ПереченьФайлов.НайтиСтроки(КритерийПоиска); + Если НайденныеСтроки.Количество() <> 1 Тогда + ТекстОшибки = СтрШаблон( + "Не найден дистрибутив для критериев: Вид=%1, Архитектура=%2. Найдено файлов: %3", + КритерийПоиска.Вид, + ?(КритерийПоиска.Свойство("Архитектура"), КритерийПоиска.Архитектура, "<любая>"), + НайденныеСтроки.Количество() + ); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + КонецЕсли; + + Возврат НайденныеСтроки[0].Ссылка; +КонецФункции + +Функция ТипДистрибутиваТекущейПлатформы() + + ТекущаяПлатформа = ДетекторОкружения.ТипПлатформы(); + + Если ТекущаяПлатформа = ТипПлатформы.Windows_x86_64 + Или ТекущаяПлатформа = ТипПлатформы.Windows_x86 Тогда + Возврат "scd-win"; + ИначеЕсли ТекущаяПлатформа = ТипПлатформы.Linux_x86_64 + Или ТекущаяПлатформа = ТипПлатформы.Linux_x86 Тогда + Возврат "scd-lin"; + ИначеЕсли ТекущаяПлатформа = ТипПлатформы.MacOS_x86_64 + Или ТекущаяПлатформа = ТипПлатформы.MacOS_x86 Тогда + + АрхитектураПроцессора = ДетекторОкружения.АрхитектураПроцессора(); + + Если АрхитектураПроцессора = АрхитектурыПроцессоров.ARM + Или АрхитектураПроцессора = АрхитектурыПроцессоров.ARM64 Тогда + Возврат "osx-arm64"; + Иначе + Возврат "osx-x64"; + КонецЕсли; + + Иначе + ВызватьИсключение "Не удалось определить текущую операционную систему"; + КонецЕсли; + +КонецФункции diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213OVM.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213OVM.os" index 4367ff4..fa5e47d 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213OVM.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213OVM.os" @@ -5,8 +5,9 @@ &Деталька(Значение = "oscript.server", ЗначениеПоУмолчанию = "https://oscript.io") Перем АдресСайтаОСкрипт; -&Желудь +&Дуб Процедура ПриСозданииОбъекта() + СистемнаяИнформация = Новый СистемнаяИнформация; КонецПроцедуры // Путь к каталогу установки версий OneScript по умолчанию @@ -14,6 +15,7 @@ // Возвращаемое значение: // Строка - Путь к каталогу установки по умолчанию // +&Завязь(Тип = "Строка") Функция КаталогУстановкиПоУмолчанию() Экспорт КаталогУстановкиПоУмолчанию = ПолучитьПеременнуюСреды("OVM_INSTALL_PATH"); @@ -33,6 +35,7 @@ // Возвращаемое значение: // Строка - Адрес сайта OneScript // +&Завязь(Тип = "Строка") Функция АдресСайтаОСкрипт() Экспорт Возврат АдресСайтаОСкрипт; КонецФункции @@ -42,6 +45,7 @@ // Возвращаемое значение: // Строка - Полный адрес к каталогу дистрибутивов OneScript // +&Завязь(Тип = "Строка") Функция ПолныйАдресККаталогуДистрибутивов() Экспорт Возврат АдресСайтаОСкрипт() + "/downloads"; КонецФункции @@ -50,23 +54,7 @@ // // Возвращаемое значение: // Булево - это 64 битная операционна система +&Завязь(Тип = "Булево") Функция Это64БитнаяОперационнаяСистема() Экспорт Возврат СистемнаяИнформация.Это64БитнаяОперационнаяСистема; КонецФункции - -// Регулярное выражение версии по semver -// -// Возвращаемое значение: -// Строка - Регулярное выражение -// -Функция МаскаНомераВерсииSemver() Экспорт - // https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string - // https://regex101.com/r/vkijKf/1/ - - // BSLLS:LineLength-off - Возврат "^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$"; - // BSLLS:LineLength-on - -КонецФункции - -СистемнаяИнформация = Новый СистемнаяИнформация; diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\224\320\270\321\201\321\202\321\200\320\270\320\261\321\203\321\202\320\270\320\262\320\276\320\262\320\222\320\265\321\200\321\201\320\270\320\270.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\224\320\270\321\201\321\202\321\200\320\270\320\261\321\203\321\202\320\270\320\262\320\276\320\262\320\222\320\265\321\200\321\201\320\270\320\270.os" new file mode 100644 index 0000000..0d8c105 --- /dev/null +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\224\320\270\321\201\321\202\321\200\320\270\320\261\321\203\321\202\320\270\320\262\320\276\320\262\320\222\320\265\321\200\321\201\320\270\320\270.os" @@ -0,0 +1,122 @@ +&Пластилин +Перем ФабрикаИнтернетСоединения; + +&Пластилин +Перем АдресСайтаОСкрипт; + +&Желудь +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +// Получить информацию о версиях, доступных к установке +// +// Возвращаемое значение: +// ТаблицаЗначений - Информация об установленных версиях: +// * Алиас - Строка - Алиас версии (имя каталога) +// * Путь - Строка - Полный путь к каталогу версии +// +Функция ПолучитьСписокДоступныхКУстановкеВерсий() Экспорт + + Соединение = ФабрикаИнтернетСоединения.Создать(); + + Запрос = Новый HTTPЗапрос("api/archive"); + Ответ = Соединение.Получить(Запрос); + HTTP_OK = 200; + Если Ответ.КодСостояния <> HTTP_OK Тогда + ВызватьИсключение СтрШаблон("Не удалось получить список версий с сайта. Код ошибки: %1", Ответ.КодСостояния); + КонецЕсли; + + ЧтениеJSON = Новый ЧтениеJSON(); + ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку()); + + ДоступныеВерсии = Новый ТаблицаЗначений; + ДоступныеВерсии.Колонки.Добавить("Алиас"); + ДоступныеВерсии.Колонки.Добавить("Путь"); + + МассивВерсий = ПрочитатьJSON(ЧтениеJSON, Ложь); + Для Каждого ОписаниеВерсии Из МассивВерсий Цикл + ДоступнаяВерсия = ДоступныеВерсии.Добавить(); + ДоступнаяВерсия.Алиас = ОписаниеВерсии.presentation; + ДоступнаяВерсия.Путь = АдресСайтаОСкрипт + ОписаниеВерсии.link; + КонецЦикла; + + Возврат ДоступныеВерсии; + +КонецФункции + +// Возвращает таблицу файлов конкретной версии +// +// Параметры: +// НомерВерсии - Строка - версия для которой получаем файлы. +// +// Возвращаемое значение: +// ТаблицаЗначений - Вид,ИмяФайла,Архитектура,Ссылка +// Вид: vsix,exe,zip,fdd,scd-win,scd-lin,osx-x64,osx-arm64 +// ИмяФайла: имя файла +// Архитектура: x64,x86 +// Ссылка: прямая ссылка на данный файл +// См. также: +// https://oscript.io/api/archive/ - список всех токенов +// https://oscript.io/api/archive/<токен версии> - данная таблица +// +Функция ПолучитьДоступныеВидыДистрибутивовВерсии(Знач НомерВерсии) Экспорт + Соединение = ФабрикаИнтернетСоединения.Создать(); + + Запрос = Новый HTTPЗапрос("api/archive?all=true"); + Ответ = Соединение.Получить(Запрос); + HTTP_OK = 200; + Если Ответ.КодСостояния <> HTTP_OK Тогда + ВызватьИсключение СтрШаблон("Не удалось найти версию %1 на сайте: Статус: %2, Ответ: %3", + НомерВерсии, + Ответ.КодСостояния, + Ответ.ПолучитьТелоКакСтроку() + ); + КонецЕсли; + + ЧтениеJSON = Новый ЧтениеJSON(); + ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку()); + + МассивВерсий = ПрочитатьJSON(ЧтениеJSON, Ложь); + ИскомыйТокенВерсии = Неопределено; + Для Каждого ОписаниеВерсии Из МассивВерсий Цикл + Если НомерВерсии = ОписаниеВерсии.presentation Тогда + ИскомыйТокенВерсии = ОписаниеВерсии.token; + КонецЕсли; + КонецЦикла; + + Если ИскомыйТокенВерсии = Неопределено Тогда + ВызватьИсключение СтрШаблон("Не удалось найти версию %1 на сайте.", НомерВерсии); + КонецЕсли; + + Запрос = Новый HTTPЗапрос("api/archive/" + ИскомыйТокенВерсии); + Ответ = Соединение.Получить(Запрос); + HTTP_OK = 200; + Если Ответ.КодСостояния <> HTTP_OK Тогда + ВызватьИсключение СтрШаблон("Не удалось найти файлы версии %1 на сайте: Статус: %2, Ответ: %3", + НомерВерсии, + Ответ.КодСостояния, + Ответ.ПолучитьТелоКакСтроку() + ); + КонецЕсли; + + ТаблицаРезультата = Новый ТаблицаЗначений(); + ТаблицаРезультата.Колонки.Добавить("Вид"); + ТаблицаРезультата.Колонки.Добавить("ИмяФайла"); + ТаблицаРезультата.Колонки.Добавить("Архитектура"); + ТаблицаРезультата.Колонки.Добавить("Ссылка"); + + ЧтениеJSON = Новый ЧтениеJSON(); + ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку()); + + МассивФайлов = ПрочитатьJSON(ЧтениеJSON, Ложь); + Для Каждого ОписаниеФайла Из МассивФайлов Цикл + СтрокаТаблицы = ТаблицаРезультата.Добавить(); + СтрокаТаблицы.Вид = ОписаниеФайла.id; + СтрокаТаблицы.ИмяФайла = ОписаниеФайла.filename; + СтрокаТаблицы.Архитектура = ОписаниеФайла.arch; + СтрокаТаблицы.Ссылка = ОписаниеФайла.link; + КонецЦикла; + + Возврат ТаблицаРезультата; + +КонецФункции diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\321\211\320\270\320\272OneScript.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\321\211\320\270\320\272OneScript.os" index 199f7e3..b1aadf3 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\321\211\320\270\320\272OneScript.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\321\211\320\270\320\272OneScript.os" @@ -2,7 +2,6 @@ #Использовать fs #Использовать tempfiles #Использовать strings -#Использовать cpuinfo Перем ЭтоWindows; @@ -15,23 +14,12 @@ &Пластилин Перем ВерсииOneScript; -&Деталька("proxy.use") -Перем ИспользоватьПрокси; - -&Деталька("proxy.server") -Перем ПроксиСервер; - -&Деталька("proxy.port") -Перем ПроксиПорт; - -&Деталька("proxy.user") -Перем ПроксиПользователь; - -&Деталька("proxy.password") -Перем ПроксиПароль; +&Пластилин +Перем ФабрикаИнтернетСоединения; -&Деталька("proxy.osAuthentication") -Перем ПроксиАвторизацияОС; +&Табакерка +&Пластилин("ОпределительДистрибутива") +Перем КоробочкаСОпределителями; &Желудь Процедура ПриСозданииОбъекта() @@ -125,51 +113,7 @@ ПутьКСохраняемомуФайлу = ВременныеФайлы.НовоеИмяФайла("zip"); - АдресСайтаОСкрипт = ПараметрыOVM.АдресСайтаОСкрипт(); - - Если ИспользоватьПрокси = "true" Тогда - - Если Не ЗначениеЗаполнено(ПроксиСервер) Тогда - - Лог.Отладка("Использую системный прокси"); - Прокси = Новый ИнтернетПрокси(Истина); - - ИначеЕсли ЗначениеЗаполнено(ПроксиСервер) Тогда - - Лог.Отладка("Использую прокси %1", ПроксиСервер); - Прокси = Новый ИнтернетПрокси(); - - Прокси.Установить("http", - ПроксиСервер, - ПроксиПорт, - ПроксиПользователь, - ПроксиПароль, - ПроксиАвторизацияОС - ); - - Прокси.Установить("https", - ПроксиСервер, - ПроксиПорт, - ПроксиПользователь, - ПроксиПароль, - ПроксиАвторизацияОС - ); - - КонецЕсли; - Иначе - Лог.Отладка("Прокси не используется"); - Прокси = Неопределено; - КонецЕсли; - - Таймаут = 10; - Соединение = Новый HTTPСоединение( - АдресСайтаОСкрипт, - , - , - , - Прокси, - Таймаут - ); + Соединение = ФабрикаИнтернетСоединения.Создать(); Ресурс = ПолучитьПутьКСкачиваниюФайла(ВерсияКУстановке, ИспользоватьХ64, ИспользоватьFDD); Запрос = Новый HTTPЗапрос(Ресурс); @@ -305,7 +249,7 @@ КонецПроцедуры Функция ЭтоДопустимыйНомерВерсии(ВерсияКУстановке) - РВ = Новый РегулярноеВыражение(ПараметрыOVM.МаскаНомераВерсииSemver()); + РВ = Новый РегулярноеВыражение(ВерсииOneScript.МаскаНомераВерсииSemver()); РВ.ИгнорироватьРегистр = Ложь; РВ.МногоСтрочный = Ложь; Возврат РВ.Совпадает(ВерсияКУстановке); @@ -323,10 +267,14 @@ Функция ПолучитьПутьКСкачиваниюФайла(Знач ВерсияКУстановке, Знач ИспользоватьХ64, Знач ИспользоватьFDD) + ОпределительДистрибутива = КоробочкаСОпределителями.Достать() + .ИспользоватьХ64(ИспользоватьХ64) + .ИспользоватьFDD(ИспользоватьFDD); + Если ЭтоДопустимыйНомерВерсии(ВерсияКУстановке) Тогда ИскомаяВерсия = ВерсияКУстановке; - ЭтоВерсия2 = СтроковыеФункции.СравнитьВерсии(ВерсияКУстановке, "2.0") >= 0; + ОпределительДистрибутива.ЭтоДистрибутивНеткор(СтроковыеФункции.СравнитьВерсии(ВерсияКУстановке, "2.0") >= 0); Иначе @@ -335,91 +283,12 @@ .ИначеВызватьИсключение("Ошибка получения пути к файлу по версии"); ИскомаяВерсия = ДанныеВерсии.Метка; - // Когда v2 выйдет из preview мы не будем знать к какой версии относится алиас stable. - ЭтоВерсия2 = Неопределено; КонецЕсли; - Если ЭтоВерсия2 = Истина Тогда - ВидДистрибутива = ?(ИспользоватьFDD, "fdd", ТипДистрибутиваТекущейПлатформы()); - ИначеЕсли ЭтоВерсия2 = Ложь Тогда - ВидДистрибутива = "zip"; - ИначеЕсли ИспользоватьFDD Тогда - ЭтоВерсия2 = Истина; - ВидДистрибутива = "fdd"; - Иначе - // Это установка по алиасу и мы не знаем, версия 2 это или нет. - // Определим это с двух попыток ниже. - ВидДистрибутива = ТипДистрибутиваТекущейПлатформы(); - КонецЕсли; - ПереченьФайлов = ВерсииOneScript.ПолучитьДоступныеВидыДистрибутивовВерсии(ИскомаяВерсия); - Возврат НайтиПодходящийДистрибутив(ПереченьФайлов, ВидДистрибутива, ИспользоватьХ64, ЭтоВерсия2 = Неопределено); - -КонецФункции - -Функция НайтиПодходящийДистрибутив(Знач ПереченьФайлов, Знач ВидДистрибутива, Знач ИспользоватьХ64, Знач РежимАлиаса) - КритерийПоиска = Новый Структура; - КритерийПоиска.Вставить("Вид", ВидДистрибутива); - - Если ВидДистрибутива = "scd-win" или ВидДистрибутива = "fdd" или ВидДистрибутива = "zip" Тогда - Если ИспользоватьХ64 Тогда - КритерийПоиска.Вставить("Архитектура", "x64"); - Иначе - КритерийПоиска.Вставить("Архитектура", "x86"); - КонецЕсли; - КонецЕсли; - - НайденныеСтроки = ПереченьФайлов.НайтиСтроки(КритерийПоиска); - Если НайденныеСтроки.Количество() <> 1 Тогда - // Это может быть установка по алиасу и тогда есть шанс у дистрибутива zip для версии 1 - Если РежимАлиаса Тогда - КритерийПоиска.Вид = "zip"; - КонецЕсли; - - НайденныеСтроки = ПереченьФайлов.НайтиСтроки(КритерийПоиска); - Если НайденныеСтроки.Количество() <> 1 Тогда - ТекстОшибки = СтрШаблон( - "Не найден дистрибутив для критериев: Вид=%1, Архитектура=%2. Найдено файлов: %3", - КритерийПоиска.Вид, - ?(КритерийПоиска.Свойство("Архитектура"), КритерийПоиска.Архитектура, "<любая>"), - НайденныеСтроки.Количество() - ); - ВызватьИсключение ТекстОшибки; - КонецЕсли; - КонецЕсли; - - Возврат НайденныеСтроки[0].Ссылка; -КонецФункции - -Функция ТипДистрибутиваТекущейПлатформы() - - СистемнаяИнформация = Новый СистемнаяИнформация; - ТекущаяПлатформа = СистемнаяИнформация.ТипПлатформы; - - Если ТекущаяПлатформа = ТипПлатформы.Windows_x86_64 - Или ТекущаяПлатформа = ТипПлатформы.Windows_x86 Тогда - Возврат "scd-win"; - ИначеЕсли ТекущаяПлатформа = ТипПлатформы.Linux_x86_64 - Или ТекущаяПлатформа = ТипПлатформы.Linux_x86 Тогда - Возврат "scd-lin"; - ИначеЕсли ТекущаяПлатформа = ТипПлатформы.MacOS_x86_64 - Или ТекущаяПлатформа = ТипПлатформы.MacOS_x86 Тогда - - ИнформацияОПроцессоре = Новый ИнформацияОПроцессоре; - АрхитектураПроцессора = ИнформацияОПроцессоре.Архитектура; - - Если АрхитектураПроцессора = АрхитектурыПроцессоров.ARM - Или АрхитектураПроцессора = АрхитектурыПроцессоров.ARM64 Тогда - Возврат "osx-arm64"; - Иначе - Возврат "osx-x64"; - КонецЕсли; - - Иначе - ВызватьИсключение "Не удалось определить текущую операционную систему"; - КонецЕсли; + Возврат ОпределительДистрибутива.Выбрать(ПереченьФайлов); КонецФункции diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\230\320\275\321\202\320\265\321\200\320\275\320\265\321\202\320\241\320\276\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\230\320\275\321\202\320\265\321\200\320\275\320\265\321\202\320\241\320\276\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217.os" new file mode 100644 index 0000000..6733265 --- /dev/null +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\230\320\275\321\202\320\265\321\200\320\275\320\265\321\202\320\241\320\276\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217.os" @@ -0,0 +1,75 @@ +&Деталька("proxy.use") +Перем ИспользоватьПрокси; + +&Деталька("proxy.server") +Перем ПроксиСервер; + +&Деталька("proxy.port") +Перем ПроксиПорт; + +&Деталька("proxy.user") +Перем ПроксиПользователь; + +&Деталька("proxy.password") +Перем ПроксиПароль; + +&Деталька("proxy.osAuthentication") +Перем ПроксиАвторизацияОС; + +&Пластилин +Перем АдресСайтаОСкрипт; + +&ЛогOVM +Перем Лог; + +&Желудь +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +Функция Создать() Экспорт + Если ИспользоватьПрокси = "true" Тогда + + Если Не ЗначениеЗаполнено(ПроксиСервер) Тогда + + Лог.Отладка("Использую системный прокси"); + Прокси = Новый ИнтернетПрокси(Истина); + + ИначеЕсли ЗначениеЗаполнено(ПроксиСервер) Тогда + + Лог.Отладка("Использую прокси %1", ПроксиСервер); + Прокси = Новый ИнтернетПрокси(); + + Прокси.Установить("http", + ПроксиСервер, + ПроксиПорт, + ПроксиПользователь, + ПроксиПароль, + ПроксиАвторизацияОС + ); + + Прокси.Установить("https", + ПроксиСервер, + ПроксиПорт, + ПроксиПользователь, + ПроксиПароль, + ПроксиАвторизацияОС + ); + + КонецЕсли; + Иначе + Лог.Отладка("Прокси не используется"); + Прокси = Неопределено; + КонецЕсли; + + Таймаут = 10; + Соединение = Новый HTTPСоединение( + АдресСайтаОСкрипт, + , + , + , + Прокси, + Таймаут + ); + + Возврат Соединение; +КонецФункции diff --git a/tasks/coverage.os b/tasks/coverage.os index 66f574e..539b6c6 100644 --- a/tasks/coverage.os +++ b/tasks/coverage.os @@ -1,7 +1,6 @@ #Использовать 1commands #Использовать asserts #Использовать fs -#Использовать json СистемнаяИнформация = Новый СистемнаяИнформация; ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; @@ -23,13 +22,10 @@ Файл_Стат = Новый Файл(ПутьКСтат); Ожидаем.Что(Файл_Стат.Существует(), СтрШаблон("Файл <%1> с результатами покрытия не существует!", Файл_Стат.ПолноеИмя)).ЭтоИстина(); -ЧтениеТекста = Новый ЧтениеТекста(ПутьКСтат, КодировкаТекста.UTF8); - -СтрокаJSON = ЧтениеТекста.Прочитать(); -ЧтениеТекста.Закрыть(); - -Парсер = Новый ПарсерJSON(); -ДанныеПокрытия = Парсер.ПрочитатьJSON(СтрокаJSON); +ЧтениеJSON = Новый ЧтениеJSON(); +ЧтениеJSON.ОткрытьФайл(ПутьКСтат); +ДанныеПокрытия = ПрочитатьJSON(ЧтениеJSON, Истина); +ЧтениеJSON.Закрыть(); ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.ОткрытьФайл("coverage/genericCoverage.xml"); diff --git a/tests/distrSelectorTests.os b/tests/distrSelectorTests.os new file mode 100644 index 0000000..00b285f --- /dev/null +++ b/tests/distrSelectorTests.os @@ -0,0 +1,304 @@ +///////////////////////////////////////////////////// +// Тесты выбора дистрибутива в перечне файлов +///////////////////////////////////////////////////// + +#Использовать "../src/cmd" +#Использовать "../src/core" +#Использовать moskito +#Использовать cpuinfo + +Перем Арх32; +Перем Арх64; + +// BSLLS:DuplicateStringLiteral-off + +#Область ПоискПоАлиасу + +&ПараметризованныйТест +&ИсточникЗначение("Windows_x86_64", Неопределено) +&ИсточникЗначение("Windows_x86", Неопределено) +&ИсточникЗначение("Linux_x86", Неопределено) +&ИсточникЗначение("Linux_x86_64", Неопределено) +&ИсточникЗначение("MacOS_x86_64", "X64") +&ИсточникЗначение("MacOS_x86_64", "ARM64") +Процедура ДляФайловВерсии1СФлагомFDDИАлиасомНеНаходитДистрибутив(Знач ОС, Знач Архитектура) Экспорт + + УниверсальныйТестВерсии( + ПереченьФайловВерсии1(), + Истина, + СтрЗаканчиваетсяНа(ОС, "_x86_64"), + Неопределено, + ТипПлатформы[ОС], + "zip", + "Вид=fdd", + Архитектура + ); + +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникЗначение("Windows_x86_64", Неопределено) +&ИсточникЗначение("Windows_x86", Неопределено) +&ИсточникЗначение("Linux_x86", Неопределено) +&ИсточникЗначение("Linux_x86_64", Неопределено) +&ИсточникЗначение("MacOS_x86_64", "X64") +&ИсточникЗначение("MacOS_x86_64", "ARM64") +Процедура ДляФайловВерсии1БезФлагаFDDИАлиасомНаходитДистрибутив(Знач ОС, Знач Архитектура) Экспорт + + УниверсальныйТестВерсии( + ПереченьФайловВерсии1(), + Ложь, + СтрЗаканчиваетсяНа(ОС, "_x86_64"), + Неопределено, + ТипПлатформы[ОС], + "zip", + Неопределено, + Архитектура + ); + +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникЗначение("Windows_x86_64", Неопределено) +&ИсточникЗначение("Windows_x86", Неопределено) +&ИсточникЗначение("Linux_x86", Неопределено) +&ИсточникЗначение("Linux_x86_64", Неопределено) +&ИсточникЗначение("MacOS_x86_64", "X64") +&ИсточникЗначение("MacOS_x86_64", "ARM64") +Процедура ДляФайловВерсии2СФлагомFDDИАлиасомНаходитДистрибутив(Знач ОС, Знач Архитектура) Экспорт + + УниверсальныйТестВерсии( + ПереченьФайловВерсии2(), + Истина, + СтрЗаканчиваетсяНа(ОС, "_x86_64"), + Неопределено, + ТипПлатформы[ОС], + "fdd", + Неопределено, + Архитектура + ); + +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникЗначение("Windows_x86_64", Неопределено, "scd-win") +&ИсточникЗначение("Windows_x86", Неопределено, "scd-win") +&ИсточникЗначение("Linux_x86", Неопределено, "scd-lin") +&ИсточникЗначение("Linux_x86_64", Неопределено, "scd-lin") +&ИсточникЗначение("MacOS_x86_64", "X64", "osx-x64") +&ИсточникЗначение("MacOS_x86_64", "ARM64", "osx-arm64") +Процедура ДляФайловВерсии2БезФлагаFDDИАлиасомНаходитДистрибутив(Знач ОС, Знач Архитектура, Знач Дистр) Экспорт + + УниверсальныйТестВерсии( + ПереченьФайловВерсии2(), + Истина, + СтрЗаканчиваетсяНа(ОС, "_x86_64"), + Неопределено, + ТипПлатформы[ОС], + Дистр, + Неопределено, + Архитектура + ); + +КонецПроцедуры + +#КонецОбласти + +#Область ПоискПоНомеруВерсии + +&ПараметризованныйТест +&ИсточникЗначение("Windows_x86_64", Неопределено) +&ИсточникЗначение("Windows_x86", Неопределено) +&ИсточникЗначение("Linux_x86", Неопределено) +&ИсточникЗначение("Linux_x86_64", Неопределено) +&ИсточникЗначение("MacOS_x86_64", "X64") +&ИсточникЗначение("MacOS_x86_64", "ARM64") +Процедура ДляФайловВерсии1СФлагомFDDИНомеромНаходитДистрибутив(Знач ОС, Знач Архитектура) Экспорт + + УниверсальныйТестВерсии( + ПереченьФайловВерсии1(), + Истина, + СтрЗаканчиваетсяНа(ОС, "_x86_64"), + Ложь, + ТипПлатформы[ОС], + "zip", + Неопределено, + Архитектура + ); + +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникЗначение("Windows_x86_64", Неопределено) +&ИсточникЗначение("Windows_x86", Неопределено) +&ИсточникЗначение("Linux_x86", Неопределено) +&ИсточникЗначение("Linux_x86_64", Неопределено) +&ИсточникЗначение("MacOS_x86_64", "X64") +&ИсточникЗначение("MacOS_x86_64", "ARM64") +Процедура ДляФайловВерсии1БезФлагаFDDИНомеромНаходитДистрибутив(Знач ОС, Знач Архитектура) Экспорт + + УниверсальныйТестВерсии( + ПереченьФайловВерсии1(), + Ложь, + СтрЗаканчиваетсяНа(ОС, "_x86_64"), + Ложь, + ТипПлатформы[ОС], + "zip", + Неопределено, + Архитектура + ); + +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникЗначение("Windows_x86_64", Неопределено) +&ИсточникЗначение("Windows_x86", Неопределено) +&ИсточникЗначение("Linux_x86", Неопределено) +&ИсточникЗначение("Linux_x86_64", Неопределено) +&ИсточникЗначение("MacOS_x86_64", "X64") +&ИсточникЗначение("MacOS_x86_64", "ARM64") +Процедура ДляФайловВерсии2СФлагомFDDИНомеромНаходитДистрибутив(Знач ОС, Знач Архитектура) Экспорт + + УниверсальныйТестВерсии( + ПереченьФайловВерсии2(), + Истина, + СтрЗаканчиваетсяНа(ОС, "_x86_64"), + Истина, + ТипПлатформы[ОС], + "fdd", + Неопределено, + Архитектура + ); + +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникЗначение("Windows_x86_64", Неопределено, "scd-win") +&ИсточникЗначение("Windows_x86", Неопределено, "scd-win") +&ИсточникЗначение("Linux_x86", Неопределено, "scd-lin") +&ИсточникЗначение("Linux_x86_64", Неопределено, "scd-lin") +&ИсточникЗначение("MacOS_x86_64", "X64", "osx-x64") +&ИсточникЗначение("MacOS_x86_64", "ARM64", "osx-arm64") +Процедура ДляФайловВерсии2БезФлагаFDDИНомеромНаходитДистрибутив(Знач ОС, Знач Архитектура, Знач Дистр) Экспорт + + УниверсальныйТестВерсии( + ПереченьФайловВерсии2(), + Истина, + СтрЗаканчиваетсяНа(ОС, "_x86_64"), + Истина, + ТипПлатформы[ОС], + Дистр, + Неопределено, + Архитектура + ); + +КонецПроцедуры + +#КонецОбласти + +// BSLLS:NumberOfParams-off +Процедура УниверсальныйТестВерсии( + ПереченьФайлов, + ИспользоватьFDD, + ИспользоватьХ64, + ЭтоВерсия2, + Платформа, + ОжидаемыйДистрибутив, + ТекстИсключения = Неопределено, + Архитектура = Неопределено) + + СисИнфо = МокОкружения(Платформа, Архитектура); + Определитель = Новый ОпределительДистрибутива(СисИнфо); + + Определитель + .ИспользоватьFDD(ИспользоватьFDD) + .ИспользоватьХ64(ИспользоватьХ64) + .ЭтоДистрибутивНеткор(ЭтоВерсия2); + + Вид = ?(ИспользоватьFDD, "fdd", ОжидаемыйДистрибутив); + Арх = ?(ИспользоватьХ64, Арх64, Арх32); + + Если ИспользоватьFDD и ОжидаемыйДистрибутив = "zip" Тогда + // Для версии 1 ключ fdd не должен влиять на результат + // т.к. все версии 1 являются "fdd" (framework dependent) + Вид = "zip"; + КонецЕсли; + + Если ЗначениеЗаполнено(ТекстИсключения) Тогда + ПараметрыДействия = Новый Массив; + ПараметрыДействия.Добавить(ПереченьФайлов); + Ожидаем.Что(Определитель).Метод("Выбрать", ПараметрыДействия) + .ВыбрасываетИсключение("Не найден дистрибутив для критериев: " + ТекстИсключения); + Иначе + Ссылка = Определитель.Выбрать(ПереченьФайлов); + Ожидаем.Что(Ссылка).Равно(Вид + "/" + Арх); + КонецЕсли; + +КонецПроцедуры + +Функция ПереченьФайловВерсии1() + + Таблица = ТаблицаФайловДистрибутивов(); + ЗаписьДистрибутива(Таблица, "vsix", Арх32); + ЗаписьДистрибутива(Таблица, "exe", Арх32); + ЗаписьДистрибутива(Таблица, "exe", Арх64); + ЗаписьДистрибутива(Таблица, "zip", Арх32); + ЗаписьДистрибутива(Таблица, "zip", Арх64); + ЗаписьДистрибутива(Таблица, "rpm", Арх64); + ЗаписьДистрибутива(Таблица, "deb", Арх64); + + Возврат Таблица; + +КонецФункции + +Функция ПереченьФайловВерсии2() + + Таблица = ТаблицаФайловДистрибутивов(); + ЗаписьДистрибутива(Таблица, "vsix", Арх32); + ЗаписьДистрибутива(Таблица, "fdd", Арх32); + ЗаписьДистрибутива(Таблица, "fdd", Арх64); + ЗаписьДистрибутива(Таблица, "scd-win", Арх32); + ЗаписьДистрибутива(Таблица, "scd-win", Арх64); + ЗаписьДистрибутива(Таблица, "scd-lin", Арх64); + ЗаписьДистрибутива(Таблица, "osx-x64", Арх64); + ЗаписьДистрибутива(Таблица, "osx-arm64", Арх64); + + Возврат Таблица; + +КонецФункции + +Функция МокОкружения(Знач ВидПлатформы, Знач Архитектура) + Если Архитектура = Неопределено Тогда + Архитектура = АрхитектурыПроцессоров.X64; + КонецЕсли; + + МокСИ = Мок.Получить(Новый ДетекторОкружения); + МокСИ.Когда().ТипПлатформы().ТогдаВозвращает(ВидПлатформы); + МокСИ.Когда().АрхитектураПроцессора().ТогдаВозвращает(Архитектура); + + Возврат МокСИ; + +КонецФункции + +Процедура ЗаписьДистрибутива(Знач Таблица, Знач Вид, Знач Архитектура) + + Стр = Таблица.Добавить(); + Стр.Вид = Вид; + Стр.Архитектура = Архитектура; + Стр.Ссылка = Вид + "/" + Архитектура; + +КонецПроцедуры + +Функция ТаблицаФайловДистрибутивов() + ТаблицаРезультата = Новый ТаблицаЗначений(); + ТаблицаРезультата.Колонки.Добавить("Вид"); + ТаблицаРезультата.Колонки.Добавить("ИмяФайла"); + ТаблицаРезультата.Колонки.Добавить("Архитектура"); + ТаблицаРезультата.Колонки.Добавить("Ссылка"); + + Возврат ТаблицаРезультата; +КонецФункции + +/////////////////////////// +Арх32 = "x86"; +Арх64 = "x64"; diff --git a/tests/oscript.cfg b/tests/oscript.cfg new file mode 100644 index 0000000..874f3d2 --- /dev/null +++ b/tests/oscript.cfg @@ -0,0 +1 @@ +lib.system=../oscript_modules