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 2a57397..6d71edf 100644 --- a/packagedef +++ b/packagedef @@ -1,20 +1,21 @@ Описание.Имя("ovm") - .Версия("1.6.0") + .Версия("1.6.1") .Автор("Nikita Fedkin") .АдресАвтора("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/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Install.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Install.os" index 6ca9914..e72bf04 100644 --- "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Install.os" +++ "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Install.os" @@ -6,8 +6,8 @@ &Пластилин Перем УстановщикOneScript; -&Пластилин -Перем ПараметрыOVM; +&Пластилин("ДетекторОкружения") +Перем Окружение; &КомандаПриложения(Имя = "install i", Описание = "Установить OneScript указанных версий") Процедура ПриСозданииОбъекта() @@ -27,7 +27,7 @@ КомандаПриложения.Опция("clean c", Ложь, "Полностью очищать каталог установки (включая установленные библиотеки)") .ВОкружении("OVM_INSTALL_CLEAN"); - Если ПараметрыOVM.Это64БитнаяОперационнаяСистема() Тогда + Если Окружение.ЭтоX64() Тогда КомандаПриложения.Опция("x86", Ложь, "Устанавливать 32-разрядный дистрибутив OneScript") .ВОкружении("OVM_INSTALL_X86"); КонецЕсли; @@ -65,7 +65,7 @@ ВызватьИсключение "Опция <--name> может быть задана только при установке одной версии OneScript"; КонецЕсли; - Если ПараметрыOVM.Это64БитнаяОперационнаяСистема() Тогда + Если Окружение.ЭтоX64() Тогда ДополнительныеПараметры.ИспользоватьХ64 = НЕ КомандаПриложения.ЗначениеОпции("x86"); Иначе ДополнительныеПараметры.ИспользоватьХ64 = Ложь; diff --git "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Run.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Run.os" index dee13d3..39fba85 100644 --- "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Run.os" +++ "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Run.os" @@ -1,7 +1,5 @@ #Использовать "../../core" -Перем ЭтоWindows; - &Пластилин Перем ПараметрыOVM; @@ -25,6 +23,9 @@ &ВОкружении("OVM_RUN_ARGS") Перем Аргументы; +&Пластилин("ДетекторОкружения") +Перем Окружение; + &КомандаПриложения(Имя = "run r", Описание = "Запустить исполняемый файл в окружении указанной версии OneScript") Процедура ПриСозданииОбъекта() КонецПроцедуры @@ -37,7 +38,7 @@ КаталогBin = ОбъединитьПути(КаталогУстановкиВерсии, "bin"); ПеременнаяPATH = ПолучитьПеременнуюСреды("PATH"); - Если ЭтоWindows Тогда + Если Окружение.ЭтоWindows() Тогда ПеременнаяPATH = КаталогBin + ";" + ПеременнаяPATH; Иначе ПеременнаяPATH = КаталогBin + ":" + ПеременнаяPATH; @@ -54,6 +55,3 @@ Команда.Исполнить(); КонецПроцедуры - -СистемнаяИнформация = Новый СистемнаяИнформация; -ЭтоWindows = Найти(ВРег(СистемнаяИнформация.ВерсияОС), "WINDOWS") > 0; diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\272\321\202\320\270\320\262\320\260\321\202\320\276\321\200OneScript.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\272\321\202\320\270\320\262\320\260\321\202\320\276\321\200OneScript.os" index d663696..a6bb2aa 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\272\321\202\320\270\320\262\320\260\321\202\320\276\321\200OneScript.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\272\321\202\320\270\320\262\320\260\321\202\320\276\321\200OneScript.os" @@ -1,9 +1,6 @@ #Использовать 1commands #Использовать fs -Перем СистемнаяИнформация; -Перем ЭтоWindows; - &ЛогOVM Перем Лог; @@ -16,6 +13,9 @@ &Пластилин Перем УстановщикOneScript; +&Пластилин("ДетекторОкружения") +Перем Окружение; + &Желудь Процедура ПриСозданииОбъекта() КонецПроцедуры @@ -63,7 +63,7 @@ Лог.Отладка("Удаляю старую символическую ссылку"); - Если ЭтоWindows Тогда + Если Окружение.ЭтоWindows() Тогда УдалитьФайлы(ПутьКСсылке); Иначе Команда = Новый Команда; @@ -78,7 +78,7 @@ Лог.Отладка("Выполняю создание символической ссылки"); - Если ЭтоWindows Тогда + Если Окружение.ЭтоWindows() Тогда Команда = Новый Команда; Команда.УстановитьКоманду("mklink"); Команда.ДобавитьПараметр("/J"); @@ -107,7 +107,7 @@ Лог.Отладка("Добавляю каталог %1 в PATH", ПутьККаталогуBin); - Если ЭтоWindows Тогда + Если Окружение.ЭтоWindows() Тогда ПеременнаяPATH = ПолучитьПеременнуюСредыИзРеестра("PATH", РасположениеПеременнойСреды.Пользователь); ИскомоеЗначение = "%OVM_OSCRIPTBIN%"; Иначе @@ -119,7 +119,7 @@ ИскомоеЗначение = ПутьККаталогуBin; КонецЕсли; - Если ЭтоWindows Тогда + Если Окружение.ЭтоWindows() Тогда СоздатьПереопределенияPATHДляКомандногоПроцессора_Windows(); КонецЕсли; @@ -128,7 +128,7 @@ Возврат; КонецЕсли; - Если ЭтоWindows Тогда + Если Окружение.ЭтоWindows() Тогда Лог.Отладка("Установка переменных среды на уровне пользователя"); ЗначениеПеременнойСреды = "%OVM_OSCRIPTBIN%;" + ПеременнаяPATH; УстановитьПеременнуюСредыВРеестре("PATH", "REG_EXPAND_SZ", ЗначениеПеременнойСреды, @@ -143,7 +143,7 @@ Процедура ДобавитьТекстВНовыйИлиИмеющийсяФайл(Знач ДобавляемыйТекст, Знач ПутьКФайлу) - Если ЭтоWindows Тогда + Если Окружение.ЭтоWindows() Тогда РазделительСтрок = Символы.ВК + Символы.ПС; Иначе РазделительСтрок = Символы.ПС; @@ -220,11 +220,11 @@ Лог.Отладка("Добавление ovm в автозапуск powershell"); ПутьКФайлу = ОбъединитьПути( - СистемнаяИнформация.ПолучитьПутьПапки(СпециальнаяПапка.ПрофильПользователя), - "Documents", - "WindowsPowerShell", - "profile.ps1" - ); + Окружение.ПутьКПрофилюПользователя(), + "Documents", + "WindowsPowerShell", + "profile.ps1" + ); ТекстВычислениеPATH = "set PATH=$OVM_OSCRIPTBIN;$PATH"; ДобавитьТекстВНовыйИлиИмеющийсяФайл(ТекстВычислениеPATH, ПутьКФайлу); @@ -243,7 +243,7 @@ ИменаДляОбработки.Добавить(".zprofile"); ИменаДляОбработки.Добавить(".zshrc"); - КаталогПрофиля = СистемнаяИнформация.ПолучитьПутьПапки(СпециальнаяПапка.ПрофильПользователя); + КаталогПрофиля = Окружение.ПутьКПрофилюПользователя(); Для Каждого ИмяФайла Из ИменаДляОбработки Цикл ПутьКФайлу = ОбъединитьПути(КаталогПрофиля, ИмяФайла); @@ -261,7 +261,7 @@ Если ВыполнятьУстановкуПриНеобходимости Тогда ДополнительныеПараметры = УстановщикOneScript.ДополнительныеПараметрыУстановки(); - ДополнительныеПараметры.ИспользоватьХ64 = СистемнаяИнформация.Это64БитнаяОперационнаяСистема; + ДополнительныеПараметры.ИспользоватьХ64 = Окружение.ЭтоX64(); УстановщикOneScript.УстановитьOneScript(ИспользуемаяВерсия, , ДополнительныеПараметры); Иначе @@ -427,6 +427,3 @@ Возврат Результат; КонецФункции - -СистемнаяИнформация = Новый СистемнаяИнформация; -ЭтоWindows = Найти(ВРег(СистемнаяИнформация.ВерсияОС), "WINDOWS") > 0; 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..c562ffe 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,9 +9,14 @@ &Пластилин Перем ПараметрыOVM; -Перем ЭтоWindows; +&Пластилин +Перем ПровайдерДистрибутивовВерсии; + Перем ДопустимыеАлиасы; // Кеш коллекции допустимых алиасов +&Пластилин("ДетекторОкружения") +Перем Окружение; + &Желудь Процедура ПриСозданииОбъекта() КонецПроцедуры @@ -114,9 +119,9 @@ ПутьКИсполняемомуФайлу = ОбъединитьПути(КаталогУстановкиВерсии, "bin", "oscript"); - Если ЭтоWindows И ФС.ФайлСуществует(ПутьКИсполняемомуФайлу + ".exe") Тогда + Если Окружение.ЭтоWindows() И ФС.ФайлСуществует(ПутьКИсполняемомуФайлу + ".exe") Тогда ПутьКИсполняемомуФайлу = ПутьКИсполняемомуФайлу + ".exe"; - ИначеЕсли ЭтоWindows Тогда + ИначеЕсли Окружение.ЭтоWindows() Тогда ПутьКИсполняемомуФайлу = ПутьКИсполняемомуФайлу + ".bat"; ИначеЕсли ФС.ФайлСуществует(ПутьКИсполняемомуФайлу + ".sh") И Не ФС.ФайлСуществует(ПутьКИсполняемомуФайлу) Тогда @@ -171,7 +176,7 @@ Команда = Новый Команда(); - Если ЭтоWindows Тогда + Если Окружение.ЭтоWindows() Тогда Команда.УстановитьКоманду("dir"); Иначе Команда.УстановитьКоманду("ls"); @@ -183,7 +188,7 @@ ВыводКоманды = Команда.ПолучитьВывод(); - Если ЭтоWindows Тогда + Если Окружение.ЭтоWindows() Тогда Выражение = "(|)\s*(.+?)\s*\[(.+)\]"; Иначе Выражение = "l.+?(\d\d:\d\d)\s*(.+?)\s*->\s*(.+)"; @@ -215,17 +220,17 @@ // Функция ПолучитьСписокДоступныхКУстановкеВерсий() Экспорт - Таймаут = 10; - Соединение = Новый HTTPСоединение( - ПараметрыOVM.АдресСайтаОСкрипт(), - , - , - , - , - Таймаут - ); - - Возврат ПолучитьВерсииПоAPI(Соединение); + // Запрашиваем сайт + ДоступныеВерсии = ПровайдерДистрибутивовВерсии.ПолучитьСписокДоступныхКУстановкеВерсий(); + + // Дополняем таблицу нашими алиасами + Итератор = ДопустимыеАлиасы().Ключи().Итератор(); + + Пока Итератор.ЕстьСледующий() Цикл + ОбеспечитьСтрокуВерсииПоАлиасу(ДоступныеВерсии, Итератор.Следующий(), "Путь"); + КонецЦикла; + + Возврат ДоступныеВерсии; КонецФункции @@ -245,73 +250,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 +338,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; - КонецЦикла; - - Итератор = ДопустимыеАлиасы().Ключи().Итератор(); - - Пока Итератор.ЕстьСледующий() Цикл - ОбеспечитьСтрокуВерсииПоАлиасу(ДоступныеВерсии, Итератор.Следующий(), "Путь"); - КонецЦикла; - - Возврат ДоступныеВерсии; КонецФункции Процедура ОбеспечитьСтрокуВерсииПоАлиасу(ТаблицаВерсий, Алиас, ИмяРеквизитаПуть = "ПутьСервер") @@ -473,5 +395,3 @@ КонецФункции -СистемнаяИнформация = Новый СистемнаяИнформация; -ЭтоWindows = Найти(ВРег(СистемнаяИнформация.ВерсияОС), "WINDOWS") > 0; 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..ade90dc --- /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,62 @@ +#Использовать cpuinfo + +Перем СистемнаяИнформация; +Перем ТекущаяПлатформа; + +&Табакерка +&Пластилин("Процессор") +Перем ПровайдерИнформацииОПроцессоре; + +&Желудь +Процедура ПриСозданииОбъекта() + СистемнаяИнформация = Новый СистемнаяИнформация(); + ТекущаяПлатформа = СистемнаяИнформация.ТипПлатформы; +КонецПроцедуры + +Функция ЭтоWindows() Экспорт + + Возврат ТекущаяПлатформа = ТипПлатформы.Windows_x86_64 + Или ТекущаяПлатформа = ТипПлатформы.Windows_x86; + +КонецФункции + +Функция ЭтоLinux() Экспорт + + Возврат ТекущаяПлатформа = ТипПлатформы.Linux_x86_64 + Или ТекущаяПлатформа = ТипПлатформы.Linux_x86; + +КонецФункции + +Функция ЭтоMacOS() Экспорт + + Возврат ТекущаяПлатформа = ТипПлатформы.MacOS_x86_64 + Или ТекущаяПлатформа = ТипПлатформы.MacOS_x86; + +КонецФункции + +Функция ЭтоMacOSARM() Экспорт + + Если Не ЭтоMacOS() Тогда + Возврат Ложь; + КонецЕсли; + + АрхитектураПроцессора = ПровайдерИнформацииОПроцессоре + .Достать() + .Архитектура; + + Возврат АрхитектураПроцессора = АрхитектурыПроцессоров.ARM + Или АрхитектураПроцессора = АрхитектурыПроцессоров.ARM64; + +КонецФункции + +Функция ПутьКПрофилюПользователя() Экспорт + Возврат СистемнаяИнформация.ПолучитьПутьПапки(СпециальнаяПапка.ПрофильПользователя); +КонецФункции + +Функция ПутьКЛокальнымДаннымПриложений() Экспорт + Возврат СистемнаяИнформация.ПолучитьПутьПапки(СпециальнаяПапка.ЛокальныйКаталогДанныхПриложений); +КонецФункции + +Функция ЭтоX64() Экспорт + Возврат СистемнаяИнформация.Это64БитнаяОперационнаяСистема; +КонецФункции 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..f35ba37 --- /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,107 @@ +#Использовать 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() Тогда + Возврат "scd-win"; + ИначеЕсли ДетекторОкружения.ЭтоLinux() Тогда + Возврат "scd-lin"; + ИначеЕсли ДетекторОкружения.ЭтоMacOSARM() Тогда + Возврат "osx-arm64"; + ИначеЕсли ДетекторОкружения.ЭтоMacOS() Тогда + Возврат "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..878f2cd 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" @@ -1,11 +1,12 @@ #Использовать logos -Перем СистемнаяИнформация; - &Деталька(Значение = "oscript.server", ЗначениеПоУмолчанию = "https://oscript.io") Перем АдресСайтаОСкрипт; -&Желудь +&Пластилин("ДетекторОкружения") +Перем Окружение; + +&Дуб Процедура ПриСозданииОбъекта() КонецПроцедуры @@ -14,12 +15,13 @@ // Возвращаемое значение: // Строка - Путь к каталогу установки по умолчанию // +&Завязь(Тип = "Строка") Функция КаталогУстановкиПоУмолчанию() Экспорт КаталогУстановкиПоУмолчанию = ПолучитьПеременнуюСреды("OVM_INSTALL_PATH"); Если НЕ ЗначениеЗаполнено(КаталогУстановкиПоУмолчанию) Тогда КаталогУстановкиПоУмолчанию = ОбъединитьПути( - СистемнаяИнформация.ПолучитьПутьПапки(СпециальнаяПапка.ЛокальныйКаталогДанныхПриложений), + Окружение.ПутьКЛокальнымДаннымПриложений(), "ovm" ); КонецЕсли; @@ -33,6 +35,7 @@ // Возвращаемое значение: // Строка - Адрес сайта OneScript // +&Завязь(Тип = "Строка") Функция АдресСайтаОСкрипт() Экспорт Возврат АдресСайтаОСкрипт; КонецФункции @@ -42,31 +45,7 @@ // Возвращаемое значение: // Строка - Полный адрес к каталогу дистрибутивов OneScript // +&Завязь(Тип = "Строка") Функция ПолныйАдресККаталогуДистрибутивов() Экспорт Возврат АдресСайтаОСкрипт() + "/downloads"; КонецФункции - -// Разрядность текущей операционной системы -// -// Возвращаемое значение: -// Булево - это 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\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\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\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" index bd7336e..fe32fa0 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\213\320\237\321\200\320\270\320\273\320\276\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\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" @@ -12,5 +12,5 @@ КонецФункции Функция ВерсияПриложения() Экспорт - Возврат "1.6.0"; + Возврат "1.6.1"; КонецФункции 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..73a9999 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,9 +2,6 @@ #Использовать fs #Использовать tempfiles #Использовать strings -#Использовать cpuinfo - -Перем ЭтоWindows; &ЛогOVM Перем Лог; @@ -15,23 +12,15 @@ &Пластилин Перем ВерсииOneScript; -&Деталька("proxy.use") -Перем ИспользоватьПрокси; - -&Деталька("proxy.server") -Перем ПроксиСервер; - -&Деталька("proxy.port") -Перем ПроксиПорт; - -&Деталька("proxy.user") -Перем ПроксиПользователь; +&Пластилин +Перем ФабрикаИнтернетСоединения; -&Деталька("proxy.password") -Перем ПроксиПароль; +&Табакерка +&Пластилин("ОпределительДистрибутива") +Перем КоробочкаСОпределителями; -&Деталька("proxy.osAuthentication") -Перем ПроксиАвторизацияОС; +&Пластилин("ДетекторОкружения") +Перем Окружение; &Желудь Процедура ПриСозданииОбъекта() @@ -109,6 +98,8 @@ УстановитьOneScriptИзZipАрхива(ФайлУстановщика, КаталогУстановкиВерсии); ДобавитьSHСкриптыПриНеобходимости(КаталогУстановкиВерсии); УстановитьРазрешениеДляSHСкриптовПриНеобходимости(КаталогУстановкиВерсии); + ПодписатьOneScriptДляMacOS(КаталогУстановкиВерсии); + Исключение УдалитьФайлы(КаталогУстановкиВерсии); ВызватьИсключение ОписаниеОшибки(); @@ -125,51 +116,7 @@ ПутьКСохраняемомуФайлу = ВременныеФайлы.НовоеИмяФайла("zip"); - АдресСайтаОСкрипт = ПараметрыOVM.АдресСайтаОСкрипт(); - - Если ИспользоватьПрокси = "true" Тогда - - Если Не ЗначениеЗаполнено(ПроксиСервер) Тогда - - Лог.Отладка("Использую системный прокси"); - Прокси = Новый ИнтернетПрокси(Истина); - - ИначеЕсли ЗначениеЗаполнено(ПроксиСервер) Тогда - - Лог.Отладка("Использую прокси %1", ПроксиСервер); - Прокси = Новый ИнтернетПрокси(); - - Прокси.Установить("http", - ПроксиСервер, - ПроксиПорт, - ПроксиПользователь, - ПроксиПароль, - ПроксиАвторизацияОС - ); - - Прокси.Установить("https", - ПроксиСервер, - ПроксиПорт, - ПроксиПользователь, - ПроксиПароль, - ПроксиАвторизацияОС - ); - - КонецЕсли; - Иначе - Лог.Отладка("Прокси не используется"); - Прокси = Неопределено; - КонецЕсли; - - Таймаут = 10; - Соединение = Новый HTTPСоединение( - АдресСайтаОСкрипт, - , - , - , - Прокси, - Таймаут - ); + Соединение = ФабрикаИнтернетСоединения.Создать(); Ресурс = ПолучитьПутьКСкачиваниюФайла(ВерсияКУстановке, ИспользоватьХ64, ИспользоватьFDD); Запрос = Новый HTTPЗапрос(Ресурс); @@ -209,7 +156,7 @@ Процедура ДобавитьSHСкриптыПриНеобходимости(Знач КаталогУстановкиВерсии) - Если ЭтоWindows Тогда + Если Окружение.ЭтоWindows() Тогда Возврат; КонецЕсли; @@ -271,7 +218,7 @@ Процедура УстановитьРазрешениеДляSHСкриптовПриНеобходимости(КаталогУстановкиВерсии) - Если ЭтоWindows Тогда + Если Окружение.ЭтоWindows() Тогда Возврат; КонецЕсли; @@ -305,7 +252,7 @@ КонецПроцедуры Функция ЭтоДопустимыйНомерВерсии(ВерсияКУстановке) - РВ = Новый РегулярноеВыражение(ПараметрыOVM.МаскаНомераВерсииSemver()); + РВ = Новый РегулярноеВыражение(ВерсииOneScript.МаскаНомераВерсииSemver()); РВ.ИгнорироватьРегистр = Ложь; РВ.МногоСтрочный = Ложь; Возврат РВ.Совпадает(ВерсияКУстановке); @@ -323,10 +270,14 @@ Функция ПолучитьПутьКСкачиваниюФайла(Знач ВерсияКУстановке, Знач ИспользоватьХ64, Знач ИспользоватьFDD) + ОпределительДистрибутива = КоробочкаСОпределителями.Достать() + .ИспользоватьХ64(ИспользоватьХ64) + .ИспользоватьFDD(ИспользоватьFDD); + Если ЭтоДопустимыйНомерВерсии(ВерсияКУстановке) Тогда ИскомаяВерсия = ВерсияКУстановке; - ЭтоВерсия2 = СтроковыеФункции.СравнитьВерсии(ВерсияКУстановке, "2.0") >= 0; + ОпределительДистрибутива.ЭтоДистрибутивНеткор(СтроковыеФункции.СравнитьВерсии(ВерсияКУстановке, "2.0") >= 0); Иначе @@ -335,100 +286,40 @@ .ИначеВызватьИсключение("Ошибка получения пути к файлу по версии"); ИскомаяВерсия = ДанныеВерсии.Метка; - // Когда 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", - КритерийПоиска.Вид, - ?(КритерийПоиска.Свойство("Архитектура"), КритерийПоиска.Архитектура, "<любая>"), - НайденныеСтроки.Количество() - ); - ВызватьИсключение ТекстОшибки; - КонецЕсли; - КонецЕсли; +Функция ПроверитьВозможностьУстановкиX64(ВерсияКУстановке) + + Возврат ВерсииOneScript.ДопустимыеАлиасы().СодержитКлюч(ВерсияКУстановке) + Или СтроковыеФункции.СравнитьВерсии(ВерсияКУстановке, "1.2.0") >= 0; - Возврат НайденныеСтроки[0].Ссылка; КонецФункции -Функция ТипДистрибутиваТекущейПлатформы() - - СистемнаяИнформация = Новый СистемнаяИнформация; - ТекущаяПлатформа = СистемнаяИнформация.ТипПлатформы; - - Если ТекущаяПлатформа = ТипПлатформы.Windows_x86_64 - Или ТекущаяПлатформа = ТипПлатформы.Windows_x86 Тогда - Возврат "scd-win"; - ИначеЕсли ТекущаяПлатформа = ТипПлатформы.Linux_x86_64 - Или ТекущаяПлатформа = ТипПлатформы.Linux_x86 Тогда - Возврат "scd-lin"; - ИначеЕсли ТекущаяПлатформа = ТипПлатформы.MacOS_x86_64 - Или ТекущаяПлатформа = ТипПлатформы.MacOS_x86 Тогда +Процедура ПодписатьOneScriptДляMacOS(КаталогУстановкиВерсии) - ИнформацияОПроцессоре = Новый ИнформацияОПроцессоре; - АрхитектураПроцессора = ИнформацияОПроцессоре.Архитектура; + Если Не Окружение.ЭтоMacOS() Тогда + Возврат; + КонецЕсли; - Если АрхитектураПроцессора = АрхитектурыПроцессоров.ARM - Или АрхитектураПроцессора = АрхитектурыПроцессоров.ARM64 Тогда - Возврат "osx-arm64"; - Иначе - Возврат "osx-x64"; - КонецЕсли; + Команда = Новый Команда; - Иначе - ВызватьИсключение "Не удалось определить текущую операционную систему"; - КонецЕсли; + Команда.УстановитьКоманду("codesign"); + Команда.ДобавитьПараметр("-f"); + Команда.ДобавитьПараметр("-s"); + Команда.ДобавитьПараметр("-"); + Команда.ДобавитьПараметр(ВерсииOneScript.ПутьКИсполняемомуФайлу(КаталогУстановкиВерсии)); -КонецФункции + Команда.УстановитьПравильныйКодВозврата(0); -Функция ПроверитьВозможностьУстановкиX64(ВерсияКУстановке) - - Возврат ВерсииOneScript.ДопустимыеАлиасы().СодержитКлюч(ВерсияКУстановке) - Или СтроковыеФункции.СравнитьВерсии(ВерсияКУстановке, "1.2.0") >= 0; + Команда.Исполнить(); -КонецФункции + Лог.Отладка(Команда.ПолучитьВывод()); -СистемнаяИнформация = Новый СистемнаяИнформация; -ЭтоWindows = Найти(ВРег(СистемнаяИнформация.ВерсияОС), "WINDOWS") > 0; +КонецПроцедуры 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..d2a629f --- /dev/null +++ b/tests/distrSelectorTests.os @@ -0,0 +1,311 @@ +///////////////////////////////////////////////////// +// Тесты выбора дистрибутива в перечне файлов +///////////////////////////////////////////////////// + +#Использовать "../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; + КонецЕсли; + + МокСИ = Мок.Получить(Новый ДетекторОкружения); + + МокСИ.Когда().ЭтоWindows().ТогдаВозвращает(СтрНачинаетсяС(ВидПлатформы, "Windows")); + МокСИ.Когда().ЭтоLinux().ТогдаВозвращает(СтрНачинаетсяС(ВидПлатформы, "Linux")); + МокСИ.Когда().ЭтоMacOS().ТогдаВозвращает(СтрНачинаетсяС(ВидПлатформы, "MacOS")); + + МокСИ.Когда().ЭтоMacOSARM().ТогдаВозвращает( + СтрНачинаетсяС(ВидПлатформы, "MacOS") + И Архитектура = АрхитектурыПроцессоров.ARM64 Или Архитектура = АрхитектурыПроцессоров.ARM + ); + + Возврат МокСИ; + +КонецФункции + +Процедура ЗаписьДистрибутива(Знач Таблица, Знач Вид, Знач Архитектура) + + Стр = Таблица.Добавить(); + Стр.Вид = Вид; + Стр.Архитектура = Архитектура; + Стр.Ссылка = Вид + "/" + Архитектура; + +КонецПроцедуры + +Функция ТаблицаФайловДистрибутивов() + ТаблицаРезультата = Новый ТаблицаЗначений(); + ТаблицаРезультата.Колонки.Добавить("Вид"); + ТаблицаРезультата.Колонки.Добавить("ИмяФайла"); + ТаблицаРезультата.Колонки.Добавить("Архитектура"); + ТаблицаРезультата.Колонки.Добавить("Ссылка"); + + Возврат ТаблицаРезультата; +КонецФункции + +/////////////////////////// +Арх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