From 5fe9c29b45ce723b2efebc4861375a661610a838 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 22 Apr 2026 08:31:28 +0000 Subject: [PATCH 01/15] add completions command with bash support Agent-Logs-Url: https://github.com/oscript-library/ovm/sessions/a756b324-c974-4864-b444-6e841a0c276e Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com> --- features/completions.feature | 24 +++++ ...260\320\275\320\264\320\260Completions.os" | 91 +++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 features/completions.feature create mode 100644 "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\260Completions.os" diff --git a/features/completions.feature b/features/completions.feature new file mode 100644 index 0000000..4a72a86 --- /dev/null +++ b/features/completions.feature @@ -0,0 +1,24 @@ +#language: ru + +Функциональность: Генерация скрипта автодополнения + +Как пользователь ovm +Я хочу получить скрипт автодополнения для моей оболочки +Чтобы удобно использовать ovm в терминале + +Контекст: + Допустим Я устанавливаю переменной среды "OVM_INSTALL_PATH" значение "./temp/ovm" + +Сценарий: Генерация completions для bash + Когда Я выполняю команду "oscript ./src/cmd/ovm.os completions --shell bash" + Тогда я вижу в консоли вывод "_ovm_completions" + И я вижу в консоли вывод "complete -F _ovm_completions ovm" + +Сценарий: Генерация completions для bash с коротким флагом + Когда Я выполняю команду "oscript ./src/cmd/ovm.os completions -s bash" + Тогда я вижу в консоли вывод "_ovm_completions" + И я вижу в консоли вывод "complete -F _ovm_completions ovm" + +Сценарий: Ошибка при указании неподдерживаемой оболочки + Когда Я выполняю команду "oscript ./src/cmd/ovm.os completions --shell zsh" + Тогда я вижу в консоли вывод "не поддерживается" 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\260Completions.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\260Completions.os" new file mode 100644 index 0000000..09a59ee --- /dev/null +++ "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\260Completions.os" @@ -0,0 +1,91 @@ +&ЛогOVM +Перем Лог; + +&Опция(Имя = "shell s", Описание = "Тип оболочки для генерации completions (поддерживается: bash)") +&ТСтрока +&ПоУмолчанию("bash") +&ВОкружении("OVM_COMPLETIONS_SHELL") +Перем ТипОболочки; + +&КомандаПриложения(Имя = "completions", Описание = "Вывести скрипт автодополнения команд для выбранной оболочки") +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&ВыполнениеКоманды +Процедура ВыполнениеКоманды() Экспорт + + Если НРег(ТипОболочки) = "bash" Тогда + Лог.Информация(СкриптCompletionsBash()); + Иначе + ВызватьИсключение СтрШаблон("Оболочка ""%1"" не поддерживается. Поддерживаемые оболочки: bash", ТипОболочки); + КонецЕсли; + +КонецПроцедуры + +Функция СкриптCompletionsBash() + + Скрипт = +"# ovm bash completions +# Добавьте строку ниже в ~/.bashrc для активации автодополнения: +# source <(ovm completions --shell bash) + +_ovm_completions() { + local cur prev words cword + _init_completion 2>/dev/null || { + COMPREPLY=() + cur=""${COMP_WORDS[COMP_CWORD]}"" + prev=""${COMP_WORDS[COMP_CWORD-1]}"" + words=(""${COMP_WORDS[@]}"") + cword=$COMP_CWORD + } + + local commands=""install i list ls use u which w config run r uninstall delete d completions"" + + if [ $cword -eq 1 ]; then + COMPREPLY=($(compgen -W ""$commands"" -- ""$cur"")) + return 0 + fi + + local command=""${words[1]}"" + + case ""$command"" in + install|i) + COMPREPLY=($(compgen -W ""--name --clean --x86 --fdd --help"" -- ""$cur"")) + ;; + list|ls) + COMPREPLY=($(compgen -W ""--remote --all --quiet --help"" -- ""$cur"")) + ;; + use|u) + COMPREPLY=($(compgen -W ""--install --help"" -- ""$cur"")) + ;; + which|w) + COMPREPLY=($(compgen -W ""--help"" -- ""$cur"")) + ;; + run|r) + COMPREPLY=($(compgen -W ""--help"" -- ""$cur"")) + ;; + config) + COMPREPLY=($(compgen -W ""--help"" -- ""$cur"")) + ;; + uninstall|delete|d) + COMPREPLY=($(compgen -W ""--force --all --help"" -- ""$cur"")) + ;; + completions) + if [ ""$prev"" = ""--shell"" ] || [ ""$prev"" = ""-s"" ]; then + COMPREPLY=($(compgen -W ""bash"" -- ""$cur"")) + else + COMPREPLY=($(compgen -W ""--shell --help"" -- ""$cur"")) + fi + ;; + *) + ;; + esac + + return 0 +} + +complete -F _ovm_completions ovm"; + + Возврат Скрипт; + +КонецФункции From 217fbfef7fb3684ab2ca721e1fbc9bdabeafe752 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 22 Apr 2026 08:32:32 +0000 Subject: [PATCH 02/15] address review: use Russian naming conventions Agent-Logs-Url: https://github.com/oscript-library/ovm/sessions/a756b324-c974-4864-b444-6e841a0c276e Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com> --- ...6\320\274\320\260\320\275\320\264\320\260Completions.os" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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\260Completions.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\260Completions.os" index 09a59ee..0815b7f 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\260Completions.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\260Completions.os" @@ -1,7 +1,7 @@ &ЛогOVM Перем Лог; -&Опция(Имя = "shell s", Описание = "Тип оболочки для генерации completions (поддерживается: bash)") +&Опция(Имя = "shell s", Описание = "Тип оболочки для генерации автодополнения (поддерживается: bash)") &ТСтрока &ПоУмолчанию("bash") &ВОкружении("OVM_COMPLETIONS_SHELL") @@ -15,14 +15,14 @@ Процедура ВыполнениеКоманды() Экспорт Если НРег(ТипОболочки) = "bash" Тогда - Лог.Информация(СкриптCompletionsBash()); + Лог.Информация(СкриптАвтодополненияBash()); Иначе ВызватьИсключение СтрШаблон("Оболочка ""%1"" не поддерживается. Поддерживаемые оболочки: bash", ТипОболочки); КонецЕсли; КонецПроцедуры -Функция СкриптCompletionsBash() +Функция СкриптАвтодополненияBash() Скрипт = "# ovm bash completions From 080f00523f37fa6378e1f914469f47adb2f43ae5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 22 Apr 2026 08:53:21 +0000 Subject: [PATCH 03/15] generate bash completions dynamically from registered commands via autumn DI Agent-Logs-Url: https://github.com/oscript-library/ovm/sessions/620f0b3d-4ded-4eb4-8aea-b21995ed3cb7 Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com> --- ...260\320\275\320\264\320\260Completions.os" | 122 +++++++++++++----- 1 file changed, 93 insertions(+), 29 deletions(-) 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\260Completions.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\260Completions.os" index 0815b7f..1f7aab7 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\260Completions.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\260Completions.os" @@ -1,6 +1,11 @@ +#Использовать annotations + &ЛогOVM Перем Лог; +&Пластилин +Перем Поделка; + &Опция(Имя = "shell s", Описание = "Тип оболочки для генерации автодополнения (поддерживается: bash)") &ТСтрока &ПоУмолчанию("bash") @@ -24,6 +29,27 @@ Функция СкриптАвтодополненияBash() + СписокКоманд = ПолучитьСписокКоманд(); + + МассивИменВсехКоманд = Новый Массив(); + СтрокиCase = Новый Массив(); + + Для Каждого ОписаниеКоманды Из СписокКоманд Цикл + Для Каждого ИмяКоманды Из ОписаниеКоманды.Имена Цикл + МассивИменВсехКоманд.Добавить(ИмяКоманды); + КонецЦикла; + + ПаттернCase = СтрСоединить(ОписаниеКоманды.Имена, "|"); + СтрокаОпций = СтрСоединить(ОписаниеКоманды.Опции, " "); + + СтрокиCase.Добавить(" " + ПаттернCase + ")"); + СтрокиCase.Добавить(" COMPREPLY=($(compgen -W """ + СтрокаОпций + """ -- ""$cur""))"); + СтрокиCase.Добавить(" ;;"); + КонецЦикла; + + ВсеКоманды = СтрСоединить(МассивИменВсехКоманд, " "); + ТелоCase = СтрСоединить(СтрокиCase, Символы.ПС); + Скрипт = "# ovm bash completions # Добавьте строку ниже в ~/.bashrc для активации автодополнения: @@ -39,7 +65,7 @@ _ovm_completions() { cword=$COMP_CWORD } - local commands=""install i list ls use u which w config run r uninstall delete d completions"" + local commands=""" + ВсеКоманды + """ if [ $cword -eq 1 ]; then COMPREPLY=($(compgen -W ""$commands"" -- ""$cur"")) @@ -49,34 +75,7 @@ _ovm_completions() { local command=""${words[1]}"" case ""$command"" in - install|i) - COMPREPLY=($(compgen -W ""--name --clean --x86 --fdd --help"" -- ""$cur"")) - ;; - list|ls) - COMPREPLY=($(compgen -W ""--remote --all --quiet --help"" -- ""$cur"")) - ;; - use|u) - COMPREPLY=($(compgen -W ""--install --help"" -- ""$cur"")) - ;; - which|w) - COMPREPLY=($(compgen -W ""--help"" -- ""$cur"")) - ;; - run|r) - COMPREPLY=($(compgen -W ""--help"" -- ""$cur"")) - ;; - config) - COMPREPLY=($(compgen -W ""--help"" -- ""$cur"")) - ;; - uninstall|delete|d) - COMPREPLY=($(compgen -W ""--force --all --help"" -- ""$cur"")) - ;; - completions) - if [ ""$prev"" = ""--shell"" ] || [ ""$prev"" = ""-s"" ]; then - COMPREPLY=($(compgen -W ""bash"" -- ""$cur"")) - else - COMPREPLY=($(compgen -W ""--shell --help"" -- ""$cur"")) - fi - ;; +" + ТелоCase + " *) ;; esac @@ -89,3 +88,68 @@ complete -F _ovm_completions ovm"; Возврат Скрипт; КонецФункции + +Функция ПолучитьСписокКоманд() + + ОпределенияКоманд = Поделка.ПолучитьОпределенияЖелудей("КомандаПриложения"); + + Результат = Новый Массив(); + + Для Каждого КлючЗначение Из ОпределенияКоманд Цикл + ОпределениеЖелудя = КлючЗначение.Значение; + Конструктор = ОпределениеЖелудя.Завязь().ДанныеМетода(); + + АннотацияПодкоманды = РаботаСАннотациями.НайтиАннотацию(Конструктор.Аннотации, "ПодкомандаПриложения"); + Если АннотацияПодкоманды <> Неопределено Тогда + Продолжить; + КонецЕсли; + + АннотацияКоманды = РаботаСАннотациями.НайтиАннотацию(Конструктор.Аннотации, "КомандаПриложения"); + Если АннотацияКоманды = Неопределено Тогда + Продолжить; + КонецЕсли; + + ИмяКоманды = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияКоманды, "Имя"); + Если НЕ ЗначениеЗаполнено(ИмяКоманды) Тогда + Продолжить; + КонецЕсли; + + ЧастиИмени = СтрРазделить(ИмяКоманды, " "); + Опции = ПолучитьОпцииКоманды(ОпределениеЖелудя); + + ОписаниеКоманды = Новый Структура("Имена, Опции"); + ОписаниеКоманды.Имена = ЧастиИмени; + ОписаниеКоманды.Опции = Опции; + + Результат.Добавить(ОписаниеКоманды); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ПолучитьОпцииКоманды(ОпределениеЖелудя) + + Опции = Новый Массив(); + Опции.Добавить("--help"); + + Свойства = ОпределениеЖелудя.Свойства(); + Для Каждого Свойство Из Свойства Цикл + АннотацияОпции = РаботаСАннотациями.ПолучитьАннотацию(Свойство, "Опция"); + Если АннотацияОпции = Неопределено Тогда + Продолжить; + КонецЕсли; + + ИмяОпции = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияОпции, "Имя"); + Для Каждого ЧастьОпции Из СтрРазделить(ИмяОпции, " ") Цикл + Если СтрДлина(ЧастьОпции) = 1 Тогда + Опции.Добавить("-" + ЧастьОпции); + Иначе + Опции.Добавить("--" + ЧастьОпции); + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Возврат Опции; + +КонецФункции From f7ca44413f916dd07dba77073f88de94105f6bf5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 22 Apr 2026 09:01:51 +0000 Subject: [PATCH 04/15] include subcommands in bash completions via nested case statements Agent-Logs-Url: https://github.com/oscript-library/ovm/sessions/bd06fa86-ee67-41b7-8808-5df53c01d281 Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com> --- ...260\320\275\320\264\320\260Completions.os" | 107 +++++++++++++++--- 1 file changed, 89 insertions(+), 18 deletions(-) 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\260Completions.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\260Completions.os" index 1f7aab7..3ec33c4 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\260Completions.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\260Completions.os" @@ -29,22 +29,56 @@ Функция СкриптАвтодополненияBash() - СписокКоманд = ПолучитьСписокКоманд(); + ДеревоКоманд = ПолучитьДеревоКоманд(); МассивИменВсехКоманд = Новый Массив(); СтрокиCase = Новый Массив(); - Для Каждого ОписаниеКоманды Из СписокКоманд Цикл + Для Каждого ОписаниеКоманды Из ДеревоКоманд Цикл Для Каждого ИмяКоманды Из ОписаниеКоманды.Имена Цикл МассивИменВсехКоманд.Добавить(ИмяКоманды); КонецЦикла; ПаттернCase = СтрСоединить(ОписаниеКоманды.Имена, "|"); - СтрокаОпций = СтрСоединить(ОписаниеКоманды.Опции, " "); - СтрокиCase.Добавить(" " + ПаттернCase + ")"); - СтрокиCase.Добавить(" COMPREPLY=($(compgen -W """ + СтрокаОпций + """ -- ""$cur""))"); - СтрокиCase.Добавить(" ;;"); + Если ОписаниеКоманды.Подкоманды.Количество() > 0 Тогда + МассивИменПодкоманд = Новый Массив(); + МассивПодкомандCase = Новый Массив(); + + Для Каждого ОписаниеПодкоманды Из ОписаниеКоманды.Подкоманды Цикл + Для Каждого ИмяПодкоманды Из ОписаниеПодкоманды.Имена Цикл + МассивИменПодкоманд.Добавить(ИмяПодкоманды); + КонецЦикла; + + ПаттернПодкомандCase = СтрСоединить(ОписаниеПодкоманды.Имена, "|"); + СтрокаОпцийПодкоманды = СтрСоединить(ОписаниеПодкоманды.Опции, " "); + + МассивПодкомандCase.Добавить(" " + ПаттернПодкомандCase + ")"); + МассивПодкомандCase.Добавить(" COMPREPLY=($(compgen -W """ + СтрокаОпцийПодкоманды + """ -- ""$cur""))"); + МассивПодкомандCase.Добавить(" ;;"); + КонецЦикла; + + ИменаПодкоманд = СтрСоединить(МассивИменПодкоманд, " "); + СтрокаОпцийРодителя = СтрСоединить(ОписаниеКоманды.Опции, " "); + ТелоПодкомандCase = СтрСоединить(МассивПодкомандCase, Символы.ПС); + + СтрокиCase.Добавить(" " + ПаттернCase + ")"); + СтрокиCase.Добавить(" if [ $cword -eq 2 ]; then"); + СтрокиCase.Добавить(" COMPREPLY=($(compgen -W """ + ИменаПодкоманд + " " + СтрокаОпцийРодителя + """ -- ""$cur""))"); + СтрокиCase.Добавить(" else"); + СтрокиCase.Добавить(" local subcommand=""${words[2]}"""); + СтрокиCase.Добавить(" case ""$subcommand"" in"); + СтрокиCase.Добавить(ТелоПодкомандCase); + СтрокиCase.Добавить(" esac"); + СтрокиCase.Добавить(" fi"); + СтрокиCase.Добавить(" ;;"); + Иначе + СтрокаОпций = СтрСоединить(ОписаниеКоманды.Опции, " "); + + СтрокиCase.Добавить(" " + ПаттернCase + ")"); + СтрокиCase.Добавить(" COMPREPLY=($(compgen -W """ + СтрокаОпций + """ -- ""$cur""))"); + СтрокиCase.Добавить(" ;;"); + КонецЕсли; КонецЦикла; ВсеКоманды = СтрСоединить(МассивИменВсехКоманд, " "); @@ -89,21 +123,18 @@ complete -F _ovm_completions ovm"; КонецФункции -Функция ПолучитьСписокКоманд() +Функция ПолучитьДеревоКоманд() ОпределенияКоманд = Поделка.ПолучитьОпределенияЖелудей("КомандаПриложения"); - Результат = Новый Массив(); + // Первый проход: собрать все команды с их именами желудей и родителями + ВсеИнфо = Новый Соответствие(); Для Каждого КлючЗначение Из ОпределенияКоманд Цикл + ИмяЖелудя = КлючЗначение.Ключ; ОпределениеЖелудя = КлючЗначение.Значение; Конструктор = ОпределениеЖелудя.Завязь().ДанныеМетода(); - АннотацияПодкоманды = РаботаСАннотациями.НайтиАннотацию(Конструктор.Аннотации, "ПодкомандаПриложения"); - Если АннотацияПодкоманды <> Неопределено Тогда - Продолжить; - КонецЕсли; - АннотацияКоманды = РаботаСАннотациями.НайтиАннотацию(Конструктор.Аннотации, "КомандаПриложения"); Если АннотацияКоманды = Неопределено Тогда Продолжить; @@ -114,12 +145,33 @@ complete -F _ovm_completions ovm"; Продолжить; КонецЕсли; - ЧастиИмени = СтрРазделить(ИмяКоманды, " "); - Опции = ПолучитьОпцииКоманды(ОпределениеЖелудя); + Родитель = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияКоманды, "Родитель", ""); + + ИнфоКоманды = Новый Структура("ИмяЖелудя, Родитель, Имена, Опции"); + ИнфоКоманды.ИмяЖелудя = ИмяЖелудя; + ИнфоКоманды.Родитель = Родитель; + ИнфоКоманды.Имена = СтрРазделить(ИмяКоманды, " "); + ИнфоКоманды.Опции = ПолучитьОпцииКоманды(ОпределениеЖелудя); + + ВсеИнфо.Вставить(ИмяЖелудя, ИнфоКоманды); + КонецЦикла; + + // Второй проход: собрать дерево — верхнеуровневые команды со своими подкомандами + Результат = Новый Массив(); + + Для Каждого КлючЗначение Из ВсеИнфо Цикл + ИнфоКоманды = КлючЗначение.Значение; + + Если ЗначениеЗаполнено(ИнфоКоманды.Родитель) Тогда + Продолжить; + КонецЕсли; + + Подкоманды = НайтиПодкоманды(ИнфоКоманды.ИмяЖелудя, ВсеИнфо); - ОписаниеКоманды = Новый Структура("Имена, Опции"); - ОписаниеКоманды.Имена = ЧастиИмени; - ОписаниеКоманды.Опции = Опции; + ОписаниеКоманды = Новый Структура("Имена, Опции, Подкоманды"); + ОписаниеКоманды.Имена = ИнфоКоманды.Имена; + ОписаниеКоманды.Опции = ИнфоКоманды.Опции; + ОписаниеКоманды.Подкоманды = Подкоманды; Результат.Добавить(ОписаниеКоманды); КонецЦикла; @@ -128,6 +180,25 @@ complete -F _ovm_completions ovm"; КонецФункции +Функция НайтиПодкоманды(ИмяРодителя, ВсеИнфо) + + Результат = Новый Массив(); + + Для Каждого КлючЗначение Из ВсеИнфо Цикл + ИнфоКоманды = КлючЗначение.Значение; + + Если НРег(ИнфоКоманды.Родитель) = НРег(ИмяРодителя) Тогда + ОписаниеПодкоманды = Новый Структура("Имена, Опции"); + ОписаниеПодкоманды.Имена = ИнфоКоманды.Имена; + ОписаниеПодкоманды.Опции = ИнфоКоманды.Опции; + Результат.Добавить(ОписаниеПодкоманды); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + Функция ПолучитьОпцииКоманды(ОпределениеЖелудя) Опции = Новый Массив(); From 491dd4b31f9ae349418c2ebb2417d228d9f755f8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 22 Apr 2026 09:55:31 +0000 Subject: [PATCH 05/15] =?UTF-8?q?Use=20DI=20injection=20for=20=D0=9A=D0=BE?= =?UTF-8?q?=D0=BC=D0=B0=D0=BD=D0=B4=D0=B0=D0=9F=D1=80=D0=B8=D0=BB=D0=BE?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F=20beans=20and=20=D0=A1=D0=B1?= =?UTF-8?q?=D0=BE=D1=80=D1=89=D0=B8=D0=BA=D0=9E=D0=BF=D1=86=D0=B8=D0=B9=20?= =?UTF-8?q?for=20=D0=9E=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5=D0=9A?= =?UTF-8?q?=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D1=8B-based=20commands?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent-Logs-Url: https://github.com/oscript-library/ovm/sessions/133e180e-c446-4b87-ab6a-acbb38796823 Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com> --- ...260\320\275\320\264\320\260Completions.os" | 56 +++++---- ...20\236\320\277\321\206\320\270\320\271.os" | 110 ++++++++++++++++++ 2 files changed, 143 insertions(+), 23 deletions(-) create mode 100644 "src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\261\320\276\321\200\321\211\320\270\320\272\320\236\320\277\321\206\320\270\320\271.os" 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\260Completions.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\260Completions.os" index 3ec33c4..a80ee0b 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\260Completions.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\260Completions.os" @@ -3,8 +3,10 @@ &ЛогOVM Перем Лог; -&Пластилин -Перем Поделка; +&Пластилин(Тип = "ТаблицаЗначений", Значение = "КомандаПриложения") +Перем КомандыПриложения; + +Перем Рефлектор; &Опция(Имя = "shell s", Описание = "Тип оболочки для генерации автодополнения (поддерживается: bash)") &ТСтрока @@ -14,6 +16,7 @@ &КомандаПриложения(Имя = "completions", Описание = "Вывести скрипт автодополнения команд для выбранной оболочки") Процедура ПриСозданииОбъекта() + Рефлектор = Новый Рефлектор(); КонецПроцедуры &ВыполнениеКоманды @@ -125,14 +128,13 @@ complete -F _ovm_completions ovm"; Функция ПолучитьДеревоКоманд() - ОпределенияКоманд = Поделка.ПолучитьОпределенияЖелудей("КомандаПриложения"); - // Первый проход: собрать все команды с их именами желудей и родителями ВсеИнфо = Новый Соответствие(); - Для Каждого КлючЗначение Из ОпределенияКоманд Цикл - ИмяЖелудя = КлючЗначение.Ключ; - ОпределениеЖелудя = КлючЗначение.Значение; + Для Каждого ДанныеЖелудя Из КомандыПриложения Цикл + ИмяЖелудя = ДанныеЖелудя.Имя; + ОпределениеЖелудя = ДанныеЖелудя.ОпределениеЖелудя; + Желудь = ДанныеЖелудя.Желудь; Конструктор = ОпределениеЖелудя.Завязь().ДанныеМетода(); АннотацияКоманды = РаботаСАннотациями.НайтиАннотацию(Конструктор.Аннотации, "КомандаПриложения"); @@ -151,7 +153,7 @@ complete -F _ovm_completions ovm"; ИнфоКоманды.ИмяЖелудя = ИмяЖелудя; ИнфоКоманды.Родитель = Родитель; ИнфоКоманды.Имена = СтрРазделить(ИмяКоманды, " "); - ИнфоКоманды.Опции = ПолучитьОпцииКоманды(ОпределениеЖелудя); + ИнфоКоманды.Опции = ПолучитьОпцииКоманды(Желудь, ОпределениеЖелудя); ВсеИнфо.Вставить(ИмяЖелудя, ИнфоКоманды); КонецЦикла; @@ -199,27 +201,35 @@ complete -F _ovm_completions ovm"; КонецФункции -Функция ПолучитьОпцииКоманды(ОпределениеЖелудя) +Функция ПолучитьОпцииКоманды(Желудь, ОпределениеЖелудя) Опции = Новый Массив(); Опции.Добавить("--help"); - Свойства = ОпределениеЖелудя.Свойства(); - Для Каждого Свойство Из Свойства Цикл - АннотацияОпции = РаботаСАннотациями.ПолучитьАннотацию(Свойство, "Опция"); - Если АннотацияОпции = Неопределено Тогда - Продолжить; - КонецЕсли; - - ИмяОпции = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияОпции, "Имя"); - Для Каждого ЧастьОпции Из СтрРазделить(ИмяОпции, " ") Цикл - Если СтрДлина(ЧастьОпции) = 1 Тогда - Опции.Добавить("-" + ЧастьОпции); - Иначе - Опции.Добавить("--" + ЧастьОпции); + Если Рефлектор.МетодСуществует(Желудь, "ОписаниеКоманды") Тогда + Сборщик = Новый СборщикОпций(); + Желудь.ОписаниеКоманды(Сборщик); + Для Каждого ИмяОпции Из Сборщик.ПолучитьОпции() Цикл + Опции.Добавить(ИмяОпции); + КонецЦикла; + Иначе + Свойства = ОпределениеЖелудя.Свойства(); + Для Каждого Свойство Из Свойства Цикл + АннотацияОпции = РаботаСАннотациями.ПолучитьАннотацию(Свойство, "Опция"); + Если АннотацияОпции = Неопределено Тогда + Продолжить; КонецЕсли; + + ИмяОпции = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияОпции, "Имя"); + Для Каждого ЧастьОпции Из СтрРазделить(ИмяОпции, " ") Цикл + Если СтрДлина(ЧастьОпции) = 1 Тогда + Опции.Добавить("-" + ЧастьОпции); + Иначе + Опции.Добавить("--" + ЧастьОпции); + КонецЕсли; + КонецЦикла; КонецЦикла; - КонецЦикла; + КонецЕсли; Возврат Опции; diff --git "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\261\320\276\321\200\321\211\320\270\320\272\320\236\320\277\321\206\320\270\320\271.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\261\320\276\321\200\321\211\320\270\320\272\320\236\320\277\321\206\320\270\320\271.os" new file mode 100644 index 0000000..d33b47a --- /dev/null +++ "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\261\320\276\321\200\321\211\320\270\320\272\320\236\320\277\321\206\320\270\320\271.os" @@ -0,0 +1,110 @@ +// Вспомогательный класс для сбора имён опций команды. +// Используется как заглушка вместо КомандаПриложения при вызове ОписаниеКоманды(), +// чтобы получить зарегистрированные опции без запуска команды. + +Перем Опции; // Массив - собранные имена опций + +Процедура ПриСозданииОбъекта() + Опции = Новый Массив(); +КонецПроцедуры + +// Перехватывает регистрацию опции и возвращает себя для поддержки цепочек вызовов. +// +// Параметры: +// Имя - Строка - имя опции (может включать синонимы через пробел, например "clean c") +// Значение - Произвольный - значение по умолчанию (не используется) +// Описание - Строка - описание (не используется) +// +// Возвращаемое значение: +// СборщикОпций - ЭтотОбъект для цепочки вызовов +Функция Опция(Имя, Значение = "", Описание = "") Экспорт + + Для Каждого ЧастьИмени Из СтрРазделить(Имя, " ", Ложь) Цикл + Если СтрДлина(ЧастьИмени) = 1 Тогда + Опции.Добавить("-" + ЧастьИмени); + Иначе + Опции.Добавить("--" + ЧастьИмени); + КонецЕсли; + КонецЦикла; + + Возврат ЭтотОбъект; + +КонецФункции + +// Игнорирует регистрацию аргумента (позиционные аргументы не нужны для автодополнения опций). +// +// Возвращаемое значение: +// СборщикОпций - ЭтотОбъект для цепочки вызовов +Функция Аргумент(Имя, Значение = "", Описание = "") Экспорт + Возврат ЭтотОбъект; +КонецФункции + +// Методы цепочки вызовов — возвращают ЭтотОбъект, не выполняя реальных действий. + +Функция ТСтрока() Экспорт + Возврат ЭтотОбъект; +КонецФункции + +Функция ТЧисло() Экспорт + Возврат ЭтотОбъект; +КонецФункции + +Функция ТБулево() Экспорт + Возврат ЭтотОбъект; +КонецФункции + +Функция ТДата(ФорматДаты = "") Экспорт + Возврат ЭтотОбъект; +КонецФункции + +Функция ТМассивСтрок() Экспорт + Возврат ЭтотОбъект; +КонецФункции + +Функция ТМассивЧисел() Экспорт + Возврат ЭтотОбъект; +КонецФункции + +Функция ТМассивДат() Экспорт + Возврат ЭтотОбъект; +КонецФункции + +Функция ВОкружении(Переменная) Экспорт + Возврат ЭтотОбъект; +КонецФункции + +Функция Флаговый() Экспорт + Возврат ЭтотОбъект; +КонецФункции + +Функция Флаг() Экспорт + Возврат ЭтотОбъект; +КонецФункции + +Функция СкрытьВСправке() Экспорт + Возврат ЭтотОбъект; +КонецФункции + +Функция ПоУмолчанию(Значение) Экспорт + Возврат ЭтотОбъект; +КонецФункции + +Функция Обязательный(Признак = Истина) Экспорт + Возврат ЭтотОбъект; +КонецФункции + +Функция ПодробноеОписание(Описание) Экспорт + Возврат ЭтотОбъект; +КонецФункции + +Функция Псевдоним(Имя) Экспорт + Возврат ЭтотОбъект; +КонецФункции + +// Возвращает собранные имена опций. +// +// Возвращаемое значение: +// Массив - список строк вида "--name" и "-n" +Функция ПолучитьОпции() Экспорт + Возврат Опции; +КонецФункции From 807b8f5660faaee2b09f24cf51ad2639c20adfaa Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 22 Apr 2026 09:57:01 +0000 Subject: [PATCH 06/15] =?UTF-8?q?Add=20error=20handling=20for=20=D0=9E?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5=D0=9A=D0=BE=D0=BC?= =?UTF-8?q?=D0=B0=D0=BD=D0=B4=D1=8B=20call=20in=20=D0=9F=D0=BE=D0=BB=D1=83?= =?UTF-8?q?=D1=87=D0=B8=D1=82=D1=8C=D0=9E=D0=BF=D1=86=D0=B8=D0=B8=D0=9A?= =?UTF-8?q?=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent-Logs-Url: https://github.com/oscript-library/ovm/sessions/133e180e-c446-4b87-ab6a-acbb38796823 Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com> --- ...\320\260\320\275\320\264\320\260Completions.os" | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) 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\260Completions.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\260Completions.os" index a80ee0b..339f46b 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\260Completions.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\260Completions.os" @@ -207,11 +207,15 @@ complete -F _ovm_completions ovm"; Опции.Добавить("--help"); Если Рефлектор.МетодСуществует(Желудь, "ОписаниеКоманды") Тогда - Сборщик = Новый СборщикОпций(); - Желудь.ОписаниеКоманды(Сборщик); - Для Каждого ИмяОпции Из Сборщик.ПолучитьОпции() Цикл - Опции.Добавить(ИмяОпции); - КонецЦикла; + Попытка + Сборщик = Новый СборщикОпций(); + Желудь.ОписаниеКоманды(Сборщик); + Для Каждого ИмяОпции Из Сборщик.ПолучитьОпции() Цикл + Опции.Добавить(ИмяОпции); + КонецЦикла; + Исключение + Лог.Предупреждение("Не удалось получить опции команды через ОписаниеКоманды: %1", ОписаниеОшибки()); + КонецПопытки; Иначе Свойства = ОпределениеЖелудя.Свойства(); Для Каждого Свойство Из Свойства Цикл From e8a4bdca326a0056613d208d1ffa3e442aac47a1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 22 Apr 2026 10:16:25 +0000 Subject: [PATCH 07/15] =?UTF-8?q?Remove=20=D0=A1=D0=B1=D0=BE=D1=80=D1=89?= =?UTF-8?q?=D0=B8=D0=BA=D0=9E=D0=BF=D1=86=D0=B8=D0=B9,=20use=20=D0=9A?= =?UTF-8?q?=D0=BE=D0=BD=D1=81=D0=BE=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5=D0=9F?= =?UTF-8?q?=D1=80=D0=B8=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20inject?= =?UTF-8?q?ion=20and=20CLI=20library=20API=20for=20option=20discovery?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent-Logs-Url: https://github.com/oscript-library/ovm/sessions/4e27cbe1-debf-47b0-8781-2e2e3ef79b8f Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com> --- ...260\320\275\320\264\320\260Completions.os" | 108 ++++------------- ...20\236\320\277\321\206\320\270\320\271.os" | 110 ------------------ 2 files changed, 22 insertions(+), 196 deletions(-) delete mode 100644 "src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\261\320\276\321\200\321\211\320\270\320\272\320\236\320\277\321\206\320\270\320\271.os" 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\260Completions.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\260Completions.os" index 339f46b..4ea293e 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\260Completions.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\260Completions.os" @@ -1,12 +1,8 @@ -#Использовать annotations - &ЛогOVM Перем Лог; -&Пластилин(Тип = "ТаблицаЗначений", Значение = "КомандаПриложения") -Перем КомандыПриложения; - -Перем Рефлектор; +&Пластилин +Перем КонсольноеПриложение; &Опция(Имя = "shell s", Описание = "Тип оболочки для генерации автодополнения (поддерживается: bash)") &ТСтрока @@ -16,7 +12,6 @@ &КомандаПриложения(Имя = "completions", Описание = "Вывести скрипт автодополнения команд для выбранной оболочки") Процедура ПриСозданииОбъекта() - Рефлектор = Новый Рефлектор(); КонецПроцедуры &ВыполнениеКоманды @@ -128,52 +123,17 @@ complete -F _ovm_completions ovm"; Функция ПолучитьДеревоКоманд() - // Первый проход: собрать все команды с их именами желудей и родителями - ВсеИнфо = Новый Соответствие(); - - Для Каждого ДанныеЖелудя Из КомандыПриложения Цикл - ИмяЖелудя = ДанныеЖелудя.Имя; - ОпределениеЖелудя = ДанныеЖелудя.ОпределениеЖелудя; - Желудь = ДанныеЖелудя.Желудь; - Конструктор = ОпределениеЖелудя.Завязь().ДанныеМетода(); - - АннотацияКоманды = РаботаСАннотациями.НайтиАннотацию(Конструктор.Аннотации, "КомандаПриложения"); - Если АннотацияКоманды = Неопределено Тогда - Продолжить; - КонецЕсли; - - ИмяКоманды = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияКоманды, "Имя"); - Если НЕ ЗначениеЗаполнено(ИмяКоманды) Тогда - Продолжить; - КонецЕсли; - - Родитель = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияКоманды, "Родитель", ""); - - ИнфоКоманды = Новый Структура("ИмяЖелудя, Родитель, Имена, Опции"); - ИнфоКоманды.ИмяЖелудя = ИмяЖелудя; - ИнфоКоманды.Родитель = Родитель; - ИнфоКоманды.Имена = СтрРазделить(ИмяКоманды, " "); - ИнфоКоманды.Опции = ПолучитьОпцииКоманды(Желудь, ОпределениеЖелудя); + КорневаяКоманда = КонсольноеПриложение.ПолучитьКоманду(); - ВсеИнфо.Вставить(ИмяЖелудя, ИнфоКоманды); - КонецЦикла; - - // Второй проход: собрать дерево — верхнеуровневые команды со своими подкомандами Результат = Новый Массив(); - Для Каждого КлючЗначение Из ВсеИнфо Цикл - ИнфоКоманды = КлючЗначение.Значение; - - Если ЗначениеЗаполнено(ИнфоКоманды.Родитель) Тогда - Продолжить; - КонецЕсли; - - Подкоманды = НайтиПодкоманды(ИнфоКоманды.ИмяЖелудя, ВсеИнфо); + Для Каждого Команда Из КорневаяКоманда.ПолучитьПодкоманды() Цикл + Команда.НачалоЗапуска(); ОписаниеКоманды = Новый Структура("Имена, Опции, Подкоманды"); - ОписаниеКоманды.Имена = ИнфоКоманды.Имена; - ОписаниеКоманды.Опции = ИнфоКоманды.Опции; - ОписаниеКоманды.Подкоманды = Подкоманды; + ОписаниеКоманды.Имена = Команда.ПолучитьСинонимы(); + ОписаниеКоманды.Опции = ПолучитьОпцииКоманды(Команда); + ОписаниеКоманды.Подкоманды = ПолучитьПодкомандыКоманды(Команда); Результат.Добавить(ОписаниеКоманды); КонецЦикла; @@ -182,58 +142,34 @@ complete -F _ovm_completions ovm"; КонецФункции -Функция НайтиПодкоманды(ИмяРодителя, ВсеИнфо) +Функция ПолучитьПодкомандыКоманды(Команда) Результат = Новый Массив(); - Для Каждого КлючЗначение Из ВсеИнфо Цикл - ИнфоКоманды = КлючЗначение.Значение; + Для Каждого Подкоманда Из Команда.ПолучитьПодкоманды() Цикл + Подкоманда.НачалоЗапуска(); - Если НРег(ИнфоКоманды.Родитель) = НРег(ИмяРодителя) Тогда - ОписаниеПодкоманды = Новый Структура("Имена, Опции"); - ОписаниеПодкоманды.Имена = ИнфоКоманды.Имена; - ОписаниеПодкоманды.Опции = ИнфоКоманды.Опции; - Результат.Добавить(ОписаниеПодкоманды); - КонецЕсли; + ОписаниеПодкоманды = Новый Структура("Имена, Опции"); + ОписаниеПодкоманды.Имена = Подкоманда.ПолучитьСинонимы(); + ОписаниеПодкоманды.Опции = ПолучитьОпцииКоманды(Подкоманда); + + Результат.Добавить(ОписаниеПодкоманды); КонецЦикла; Возврат Результат; КонецФункции -Функция ПолучитьОпцииКоманды(Желудь, ОпределениеЖелудя) +Функция ПолучитьОпцииКоманды(Команда) Опции = Новый Массив(); Опции.Добавить("--help"); - Если Рефлектор.МетодСуществует(Желудь, "ОписаниеКоманды") Тогда - Попытка - Сборщик = Новый СборщикОпций(); - Желудь.ОписаниеКоманды(Сборщик); - Для Каждого ИмяОпции Из Сборщик.ПолучитьОпции() Цикл - Опции.Добавить(ИмяОпции); - КонецЦикла; - Исключение - Лог.Предупреждение("Не удалось получить опции команды через ОписаниеКоманды: %1", ОписаниеОшибки()); - КонецПопытки; - Иначе - Свойства = ОпределениеЖелудя.Свойства(); - Для Каждого Свойство Из Свойства Цикл - АннотацияОпции = РаботаСАннотациями.ПолучитьАннотацию(Свойство, "Опция"); - Если АннотацияОпции = Неопределено Тогда - Продолжить; - КонецЕсли; - - ИмяОпции = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияОпции, "Имя"); - Для Каждого ЧастьОпции Из СтрРазделить(ИмяОпции, " ") Цикл - Если СтрДлина(ЧастьОпции) = 1 Тогда - Опции.Добавить("-" + ЧастьОпции); - Иначе - Опции.Добавить("--" + ЧастьОпции); - КонецЕсли; - КонецЦикла; - КонецЦикла; - КонецЕсли; + Для Каждого КлючЗначение Из Команда.ПараметрыКоманды() Цикл + Если СтрНачинаетсяС(КлючЗначение.Ключ, "-") Тогда + Опции.Добавить(КлючЗначение.Ключ); + КонецЕсли; + КонецЦикла; Возврат Опции; diff --git "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\261\320\276\321\200\321\211\320\270\320\272\320\236\320\277\321\206\320\270\320\271.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\261\320\276\321\200\321\211\320\270\320\272\320\236\320\277\321\206\320\270\320\271.os" deleted file mode 100644 index d33b47a..0000000 --- "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\261\320\276\321\200\321\211\320\270\320\272\320\236\320\277\321\206\320\270\320\271.os" +++ /dev/null @@ -1,110 +0,0 @@ -// Вспомогательный класс для сбора имён опций команды. -// Используется как заглушка вместо КомандаПриложения при вызове ОписаниеКоманды(), -// чтобы получить зарегистрированные опции без запуска команды. - -Перем Опции; // Массив - собранные имена опций - -Процедура ПриСозданииОбъекта() - Опции = Новый Массив(); -КонецПроцедуры - -// Перехватывает регистрацию опции и возвращает себя для поддержки цепочек вызовов. -// -// Параметры: -// Имя - Строка - имя опции (может включать синонимы через пробел, например "clean c") -// Значение - Произвольный - значение по умолчанию (не используется) -// Описание - Строка - описание (не используется) -// -// Возвращаемое значение: -// СборщикОпций - ЭтотОбъект для цепочки вызовов -Функция Опция(Имя, Значение = "", Описание = "") Экспорт - - Для Каждого ЧастьИмени Из СтрРазделить(Имя, " ", Ложь) Цикл - Если СтрДлина(ЧастьИмени) = 1 Тогда - Опции.Добавить("-" + ЧастьИмени); - Иначе - Опции.Добавить("--" + ЧастьИмени); - КонецЕсли; - КонецЦикла; - - Возврат ЭтотОбъект; - -КонецФункции - -// Игнорирует регистрацию аргумента (позиционные аргументы не нужны для автодополнения опций). -// -// Возвращаемое значение: -// СборщикОпций - ЭтотОбъект для цепочки вызовов -Функция Аргумент(Имя, Значение = "", Описание = "") Экспорт - Возврат ЭтотОбъект; -КонецФункции - -// Методы цепочки вызовов — возвращают ЭтотОбъект, не выполняя реальных действий. - -Функция ТСтрока() Экспорт - Возврат ЭтотОбъект; -КонецФункции - -Функция ТЧисло() Экспорт - Возврат ЭтотОбъект; -КонецФункции - -Функция ТБулево() Экспорт - Возврат ЭтотОбъект; -КонецФункции - -Функция ТДата(ФорматДаты = "") Экспорт - Возврат ЭтотОбъект; -КонецФункции - -Функция ТМассивСтрок() Экспорт - Возврат ЭтотОбъект; -КонецФункции - -Функция ТМассивЧисел() Экспорт - Возврат ЭтотОбъект; -КонецФункции - -Функция ТМассивДат() Экспорт - Возврат ЭтотОбъект; -КонецФункции - -Функция ВОкружении(Переменная) Экспорт - Возврат ЭтотОбъект; -КонецФункции - -Функция Флаговый() Экспорт - Возврат ЭтотОбъект; -КонецФункции - -Функция Флаг() Экспорт - Возврат ЭтотОбъект; -КонецФункции - -Функция СкрытьВСправке() Экспорт - Возврат ЭтотОбъект; -КонецФункции - -Функция ПоУмолчанию(Значение) Экспорт - Возврат ЭтотОбъект; -КонецФункции - -Функция Обязательный(Признак = Истина) Экспорт - Возврат ЭтотОбъект; -КонецФункции - -Функция ПодробноеОписание(Описание) Экспорт - Возврат ЭтотОбъект; -КонецФункции - -Функция Псевдоним(Имя) Экспорт - Возврат ЭтотОбъект; -КонецФункции - -// Возвращает собранные имена опций. -// -// Возвращаемое значение: -// Массив - список строк вида "--name" и "-n" -Функция ПолучитьОпции() Экспорт - Возврат Опции; -КонецФункции From e5886837d30a208e3f9904f2e6206855e0cca3e9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 22 Apr 2026 10:17:18 +0000 Subject: [PATCH 08/15] Fix spacing inconsistency in assignment operators Agent-Logs-Url: https://github.com/oscript-library/ovm/sessions/4e27cbe1-debf-47b0-8781-2e2e3ef79b8f Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com> --- ...320\274\320\260\320\275\320\264\320\260Completions.os" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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\260Completions.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\260Completions.os" index 4ea293e..8fe383f 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\260Completions.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\260Completions.os" @@ -131,8 +131,8 @@ complete -F _ovm_completions ovm"; Команда.НачалоЗапуска(); ОписаниеКоманды = Новый Структура("Имена, Опции, Подкоманды"); - ОписаниеКоманды.Имена = Команда.ПолучитьСинонимы(); - ОписаниеКоманды.Опции = ПолучитьОпцииКоманды(Команда); + ОписаниеКоманды.Имена = Команда.ПолучитьСинонимы(); + ОписаниеКоманды.Опции = ПолучитьОпцииКоманды(Команда); ОписаниеКоманды.Подкоманды = ПолучитьПодкомандыКоманды(Команда); Результат.Добавить(ОписаниеКоманды); @@ -150,8 +150,8 @@ complete -F _ovm_completions ovm"; Подкоманда.НачалоЗапуска(); ОписаниеПодкоманды = Новый Структура("Имена, Опции"); - ОписаниеПодкоманды.Имена = Подкоманда.ПолучитьСинонимы(); - ОписаниеПодкоманды.Опции = ПолучитьОпцииКоманды(Подкоманда); + ОписаниеПодкоманды.Имена = Подкоманда.ПолучитьСинонимы(); + ОписаниеПодкоманды.Опции = ПолучитьОпцииКоманды(Подкоманда); Результат.Добавить(ОписаниеПодкоманды); КонецЦикла; From d8404c6a79feb080bac986a1b05f1862f6e2a6d3 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Wed, 22 Apr 2026 14:43:18 +0200 Subject: [PATCH 09/15] =?UTF-8?q?Fix=20=D0=9A=D0=BE=D0=BC=D0=B0=D0=BD?= =?UTF-8?q?=D0=B4=D0=B0Completions:=20avoid=20DI=20cycle=20and=20use=20val?= =?UTF-8?q?id=20multi-line=20string=20construction?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Injecting КонсольноеПриложение created a circular dependency (autumn-cli's КонсольноеПриложение bean depends on all КомандаПриложения beans, including КомандаCompletions itself). Autumn has no protection against cycles — the app hung on startup. - Now inject Поделка and resolve КонсольноеПриложение lazily at command execution time, when the container is fully built. - The bash script was built as an oscript multi-line string literal without the required `|` continuation-line prefix, causing a parse error. Rebuilt it by assembling an array of lines joined with Символы.ПС. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ...260\320\275\320\264\320\260Completions.os" | 75 ++++++++++--------- 1 file changed, 38 insertions(+), 37 deletions(-) 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\260Completions.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\260Completions.os" index 8fe383f..9a7854b 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\260Completions.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\260Completions.os" @@ -2,7 +2,7 @@ Перем Лог; &Пластилин -Перем КонсольноеПриложение; +Перем Поделка; &Опция(Имя = "shell s", Описание = "Тип оболочки для генерации автодополнения (поддерживается: bash)") &ТСтрока @@ -82,47 +82,48 @@ ВсеКоманды = СтрСоединить(МассивИменВсехКоманд, " "); ТелоCase = СтрСоединить(СтрокиCase, Символы.ПС); - Скрипт = -"# ovm bash completions -# Добавьте строку ниже в ~/.bashrc для активации автодополнения: -# source <(ovm completions --shell bash) - -_ovm_completions() { - local cur prev words cword - _init_completion 2>/dev/null || { - COMPREPLY=() - cur=""${COMP_WORDS[COMP_CWORD]}"" - prev=""${COMP_WORDS[COMP_CWORD-1]}"" - words=(""${COMP_WORDS[@]}"") - cword=$COMP_CWORD - } - - local commands=""" + ВсеКоманды + """ - - if [ $cword -eq 1 ]; then - COMPREPLY=($(compgen -W ""$commands"" -- ""$cur"")) - return 0 - fi - - local command=""${words[1]}"" - - case ""$command"" in -" + ТелоCase + " - *) - ;; - esac - - return 0 -} - -complete -F _ovm_completions ovm"; - - Возврат Скрипт; + СтрокиСкрипта = Новый Массив(); + СтрокиСкрипта.Добавить("# ovm bash completions"); + СтрокиСкрипта.Добавить("# Добавьте строку ниже в ~/.bashrc для активации автодополнения:"); + СтрокиСкрипта.Добавить("# source <(ovm completions --shell bash)"); + СтрокиСкрипта.Добавить(""); + СтрокиСкрипта.Добавить("_ovm_completions() {"); + СтрокиСкрипта.Добавить(" local cur prev words cword"); + СтрокиСкрипта.Добавить(" _init_completion 2>/dev/null || {"); + СтрокиСкрипта.Добавить(" COMPREPLY=()"); + СтрокиСкрипта.Добавить(" cur=""${COMP_WORDS[COMP_CWORD]}"""); + СтрокиСкрипта.Добавить(" prev=""${COMP_WORDS[COMP_CWORD-1]}"""); + СтрокиСкрипта.Добавить(" words=(""${COMP_WORDS[@]}"")"); + СтрокиСкрипта.Добавить(" cword=$COMP_CWORD"); + СтрокиСкрипта.Добавить(" }"); + СтрокиСкрипта.Добавить(""); + СтрокиСкрипта.Добавить(" local commands=""" + ВсеКоманды + """"); + СтрокиСкрипта.Добавить(""); + СтрокиСкрипта.Добавить(" if [ $cword -eq 1 ]; then"); + СтрокиСкрипта.Добавить(" COMPREPLY=($(compgen -W ""$commands"" -- ""$cur""))"); + СтрокиСкрипта.Добавить(" return 0"); + СтрокиСкрипта.Добавить(" fi"); + СтрокиСкрипта.Добавить(""); + СтрокиСкрипта.Добавить(" local command=""${words[1]}"""); + СтрокиСкрипта.Добавить(""); + СтрокиСкрипта.Добавить(" case ""$command"" in"); + СтрокиСкрипта.Добавить(ТелоCase); + СтрокиСкрипта.Добавить(" *)"); + СтрокиСкрипта.Добавить(" ;;"); + СтрокиСкрипта.Добавить(" esac"); + СтрокиСкрипта.Добавить(""); + СтрокиСкрипта.Добавить(" return 0"); + СтрокиСкрипта.Добавить("}"); + СтрокиСкрипта.Добавить(""); + СтрокиСкрипта.Добавить("complete -F _ovm_completions ovm"); + + Возврат СтрСоединить(СтрокиСкрипта, Символы.ПС); КонецФункции Функция ПолучитьДеревоКоманд() + КонсольноеПриложение = Поделка.НайтиЖелудь("КонсольноеПриложение"); КорневаяКоманда = КонсольноеПриложение.ПолучитьКоманду(); Результат = Новый Массив(); From 5a5368252c721079e4f11733b00e653e47a00f58 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Wed, 22 Apr 2026 15:50:23 +0200 Subject: [PATCH 10/15] Bump autumn-logos from 1.2.0 to 1.3.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Older version has a syntax error (missing comma in ФабрикаЛогов.os) that is caught by stricter oscript parsers and prevents the app from starting on a fresh install. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- packagedef | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packagedef b/packagedef index b277dd9..4c3e881 100644 --- a/packagedef +++ b/packagedef @@ -10,7 +10,7 @@ .ЗависитОт("tempfiles", "1.1.1") .ЗависитОт("strings", "0.5.0") .ЗависитОт("autumn", "4.3.9") - .ЗависитОт("autumn-logos", "1.2.0") + .ЗависитОт("autumn-logos", "1.3.1") .ЗависитОт("autumn-cli", "1.1.0") .ЗависитОт("collectionos", "0.8.1") .ЗависитОт("cpuinfo", "1.2.0") From cd4e354a076b4873c53c57c3250ddcb6f45dffdf Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Wed, 22 Apr 2026 16:11:59 +0200 Subject: [PATCH 11/15] Smart completions for 'ovm use' and 'ovm install' version aliases MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Adds dynamic suggestions for positional version arguments: - 'ovm use ' → installed versions via 'ovm ls -q' - 'ovm install ' → available remote versions via 'ovm ls -r' (first column extracted with awk to strip the URL part) - Option completions (starting with '-') still work as before: when the current token starts with a dash, only options are offered. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ...260\320\275\320\264\320\260Completions.os" | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) 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\260Completions.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\260Completions.os" index 9a7854b..631d05c 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\260Completions.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\260Completions.os" @@ -74,7 +74,17 @@ СтрокаОпций = СтрСоединить(ОписаниеКоманды.Опции, " "); СтрокиCase.Добавить(" " + ПаттернCase + ")"); - СтрокиCase.Добавить(" COMPREPLY=($(compgen -W """ + СтрокаОпций + """ -- ""$cur""))"); + Если ЗначениеЗаполнено(ОписаниеКоманды.КомандаВерсий) Тогда + СтрокиCase.Добавить(" if [[ ""$cur"" == -* ]]; then"); + СтрокиCase.Добавить(" COMPREPLY=($(compgen -W """ + СтрокаОпций + """ -- ""$cur""))"); + СтрокиCase.Добавить(" else"); + СтрокиCase.Добавить(" local versions"); + СтрокиCase.Добавить(" versions=$(ovm " + ОписаниеКоманды.КомандаВерсий + " 2>/dev/null | awk '{print $1}')"); + СтрокиCase.Добавить(" COMPREPLY=($(compgen -W ""$versions"" -- ""$cur""))"); + СтрокиCase.Добавить(" fi"); + Иначе + СтрокиCase.Добавить(" COMPREPLY=($(compgen -W """ + СтрокаОпций + """ -- ""$cur""))"); + КонецЕсли; СтрокиCase.Добавить(" ;;"); КонецЕсли; КонецЦикла; @@ -131,10 +141,11 @@ Для Каждого Команда Из КорневаяКоманда.ПолучитьПодкоманды() Цикл Команда.НачалоЗапуска(); - ОписаниеКоманды = Новый Структура("Имена, Опции, Подкоманды"); - ОписаниеКоманды.Имена = Команда.ПолучитьСинонимы(); - ОписаниеКоманды.Опции = ПолучитьОпцииКоманды(Команда); - ОписаниеКоманды.Подкоманды = ПолучитьПодкомандыКоманды(Команда); + ОписаниеКоманды = Новый Структура("Имена, Опции, Подкоманды, КомандаВерсий"); + ОписаниеКоманды.Имена = Команда.ПолучитьСинонимы(); + ОписаниеКоманды.Опции = ПолучитьОпцииКоманды(Команда); + ОписаниеКоманды.Подкоманды = ПолучитьПодкомандыКоманды(Команда); + ОписаниеКоманды.КомандаВерсий = КомандаПолученияВерсий(ОписаниеКоманды.Имена); Результат.Добавить(ОписаниеКоманды); КонецЦикла; @@ -161,6 +172,20 @@ КонецФункции +Функция КомандаПолученияВерсий(ИменаКоманды) + + Для Каждого Имя Из ИменаКоманды Цикл + Если Имя = "use" Тогда + Возврат "ls -q"; + ИначеЕсли Имя = "install" Тогда + Возврат "ls -r"; + КонецЕсли; + КонецЦикла; + + Возврат ""; + +КонецФункции + Функция ПолучитьОпцииКоманды(Команда) Опции = Новый Массив(); From 54711e83de352bfb0055eb4436f7ba182aa52e58 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Wed, 22 Apr 2026 16:13:07 +0200 Subject: [PATCH 12/15] Extend smart completions to 'uninstall', 'which', 'run' All three accept an installed version alias as positional argument, so suggest installed versions via 'ovm ls -q'. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ...0\276\320\274\320\260\320\275\320\264\320\260Completions.os" | 2 ++ 1 file changed, 2 insertions(+) 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\260Completions.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\260Completions.os" index 631d05c..5d3084f 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\260Completions.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\260Completions.os" @@ -179,6 +179,8 @@ Возврат "ls -q"; ИначеЕсли Имя = "install" Тогда Возврат "ls -r"; + ИначеЕсли Имя = "uninstall" ИЛИ Имя = "which" ИЛИ Имя = "run" Тогда + Возврат "ls -q"; КонецЕсли; КонецЦикла; From 932167e937f432629a7aae71b2d43fa908e8bdab Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Wed, 22 Apr 2026 22:56:39 +0200 Subject: [PATCH 13/15] feat: use completions from autumn-cli, switch install to declarative style MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Команда 'completions' удалена из ovm и теперь предоставляется напрямую autumn-cli — все приложения на autumn-cli получают её бесплатно. На полях команд навешена аннотация &ПоставщикДополнения (новая в autumn-cli 1.4.0), которая на этапе генерации скрипта запекает в него динамические значения: - use / uninstall / which / run — установленные версии; - install — доступные к установке версии. КомандаInstall переписана в декларативный стиль (&Опция/&Аргумент + &ВыполнениеКоманды) взамен устаревшего ОписаниеКоманды/ВыполнитьКоманду. Фича completions.feature обновлена: теперь поддерживаются все три оболочки (bash, zsh, pwsh), сценарий 'не поддерживается' проверяется на fish. packagedef: autumn-cli → 1.4.0 (релиз с фичей в autumn-library/autumn-cli#20). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- features/completions.feature | 10 +- packagedef | 2 +- ...260\320\275\320\264\320\260Completions.os" | 204 ------------------ ...320\260\320\275\320\264\320\260Install.os" | 134 ++++++------ ...274\320\260\320\275\320\264\320\260Run.os" | 12 ++ ...0\260\320\275\320\264\320\260Uninstall.os" | 9 + ...274\320\260\320\275\320\264\320\260Use.os" | 13 ++ ...4\320\260\320\275\320\264\320\260Which.os" | 9 + 8 files changed, 122 insertions(+), 271 deletions(-) delete mode 100644 "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\260Completions.os" diff --git a/features/completions.feature b/features/completions.feature index 4a72a86..b8c992d 100644 --- a/features/completions.feature +++ b/features/completions.feature @@ -19,6 +19,14 @@ Тогда я вижу в консоли вывод "_ovm_completions" И я вижу в консоли вывод "complete -F _ovm_completions ovm" -Сценарий: Ошибка при указании неподдерживаемой оболочки +Сценарий: Генерация completions для zsh Когда Я выполняю команду "oscript ./src/cmd/ovm.os completions --shell zsh" + Тогда я вижу в консоли вывод "#compdef ovm" + +Сценарий: Генерация completions для pwsh + Когда Я выполняю команду "oscript ./src/cmd/ovm.os completions --shell pwsh" + Тогда я вижу в консоли вывод "Register-ArgumentCompleter" + +Сценарий: Ошибка при указании неподдерживаемой оболочки + Когда Я выполняю команду "oscript ./src/cmd/ovm.os completions --shell fish" Тогда я вижу в консоли вывод "не поддерживается" diff --git a/packagedef b/packagedef index 4c3e881..964de6a 100644 --- a/packagedef +++ b/packagedef @@ -11,7 +11,7 @@ .ЗависитОт("strings", "0.5.0") .ЗависитОт("autumn", "4.3.9") .ЗависитОт("autumn-logos", "1.3.1") - .ЗависитОт("autumn-cli", "1.1.0") + .ЗависитОт("autumn-cli", "1.4.0") .ЗависитОт("collectionos", "0.8.1") .ЗависитОт("cpuinfo", "1.2.0") .ЗависитОт("annotations", "1.3.0") 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\260Completions.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\260Completions.os" deleted file mode 100644 index 5d3084f..0000000 --- "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\260Completions.os" +++ /dev/null @@ -1,204 +0,0 @@ -&ЛогOVM -Перем Лог; - -&Пластилин -Перем Поделка; - -&Опция(Имя = "shell s", Описание = "Тип оболочки для генерации автодополнения (поддерживается: bash)") -&ТСтрока -&ПоУмолчанию("bash") -&ВОкружении("OVM_COMPLETIONS_SHELL") -Перем ТипОболочки; - -&КомандаПриложения(Имя = "completions", Описание = "Вывести скрипт автодополнения команд для выбранной оболочки") -Процедура ПриСозданииОбъекта() -КонецПроцедуры - -&ВыполнениеКоманды -Процедура ВыполнениеКоманды() Экспорт - - Если НРег(ТипОболочки) = "bash" Тогда - Лог.Информация(СкриптАвтодополненияBash()); - Иначе - ВызватьИсключение СтрШаблон("Оболочка ""%1"" не поддерживается. Поддерживаемые оболочки: bash", ТипОболочки); - КонецЕсли; - -КонецПроцедуры - -Функция СкриптАвтодополненияBash() - - ДеревоКоманд = ПолучитьДеревоКоманд(); - - МассивИменВсехКоманд = Новый Массив(); - СтрокиCase = Новый Массив(); - - Для Каждого ОписаниеКоманды Из ДеревоКоманд Цикл - Для Каждого ИмяКоманды Из ОписаниеКоманды.Имена Цикл - МассивИменВсехКоманд.Добавить(ИмяКоманды); - КонецЦикла; - - ПаттернCase = СтрСоединить(ОписаниеКоманды.Имена, "|"); - - Если ОписаниеКоманды.Подкоманды.Количество() > 0 Тогда - МассивИменПодкоманд = Новый Массив(); - МассивПодкомандCase = Новый Массив(); - - Для Каждого ОписаниеПодкоманды Из ОписаниеКоманды.Подкоманды Цикл - Для Каждого ИмяПодкоманды Из ОписаниеПодкоманды.Имена Цикл - МассивИменПодкоманд.Добавить(ИмяПодкоманды); - КонецЦикла; - - ПаттернПодкомандCase = СтрСоединить(ОписаниеПодкоманды.Имена, "|"); - СтрокаОпцийПодкоманды = СтрСоединить(ОписаниеПодкоманды.Опции, " "); - - МассивПодкомандCase.Добавить(" " + ПаттернПодкомандCase + ")"); - МассивПодкомандCase.Добавить(" COMPREPLY=($(compgen -W """ + СтрокаОпцийПодкоманды + """ -- ""$cur""))"); - МассивПодкомандCase.Добавить(" ;;"); - КонецЦикла; - - ИменаПодкоманд = СтрСоединить(МассивИменПодкоманд, " "); - СтрокаОпцийРодителя = СтрСоединить(ОписаниеКоманды.Опции, " "); - ТелоПодкомандCase = СтрСоединить(МассивПодкомандCase, Символы.ПС); - - СтрокиCase.Добавить(" " + ПаттернCase + ")"); - СтрокиCase.Добавить(" if [ $cword -eq 2 ]; then"); - СтрокиCase.Добавить(" COMPREPLY=($(compgen -W """ + ИменаПодкоманд + " " + СтрокаОпцийРодителя + """ -- ""$cur""))"); - СтрокиCase.Добавить(" else"); - СтрокиCase.Добавить(" local subcommand=""${words[2]}"""); - СтрокиCase.Добавить(" case ""$subcommand"" in"); - СтрокиCase.Добавить(ТелоПодкомандCase); - СтрокиCase.Добавить(" esac"); - СтрокиCase.Добавить(" fi"); - СтрокиCase.Добавить(" ;;"); - Иначе - СтрокаОпций = СтрСоединить(ОписаниеКоманды.Опции, " "); - - СтрокиCase.Добавить(" " + ПаттернCase + ")"); - Если ЗначениеЗаполнено(ОписаниеКоманды.КомандаВерсий) Тогда - СтрокиCase.Добавить(" if [[ ""$cur"" == -* ]]; then"); - СтрокиCase.Добавить(" COMPREPLY=($(compgen -W """ + СтрокаОпций + """ -- ""$cur""))"); - СтрокиCase.Добавить(" else"); - СтрокиCase.Добавить(" local versions"); - СтрокиCase.Добавить(" versions=$(ovm " + ОписаниеКоманды.КомандаВерсий + " 2>/dev/null | awk '{print $1}')"); - СтрокиCase.Добавить(" COMPREPLY=($(compgen -W ""$versions"" -- ""$cur""))"); - СтрокиCase.Добавить(" fi"); - Иначе - СтрокиCase.Добавить(" COMPREPLY=($(compgen -W """ + СтрокаОпций + """ -- ""$cur""))"); - КонецЕсли; - СтрокиCase.Добавить(" ;;"); - КонецЕсли; - КонецЦикла; - - ВсеКоманды = СтрСоединить(МассивИменВсехКоманд, " "); - ТелоCase = СтрСоединить(СтрокиCase, Символы.ПС); - - СтрокиСкрипта = Новый Массив(); - СтрокиСкрипта.Добавить("# ovm bash completions"); - СтрокиСкрипта.Добавить("# Добавьте строку ниже в ~/.bashrc для активации автодополнения:"); - СтрокиСкрипта.Добавить("# source <(ovm completions --shell bash)"); - СтрокиСкрипта.Добавить(""); - СтрокиСкрипта.Добавить("_ovm_completions() {"); - СтрокиСкрипта.Добавить(" local cur prev words cword"); - СтрокиСкрипта.Добавить(" _init_completion 2>/dev/null || {"); - СтрокиСкрипта.Добавить(" COMPREPLY=()"); - СтрокиСкрипта.Добавить(" cur=""${COMP_WORDS[COMP_CWORD]}"""); - СтрокиСкрипта.Добавить(" prev=""${COMP_WORDS[COMP_CWORD-1]}"""); - СтрокиСкрипта.Добавить(" words=(""${COMP_WORDS[@]}"")"); - СтрокиСкрипта.Добавить(" cword=$COMP_CWORD"); - СтрокиСкрипта.Добавить(" }"); - СтрокиСкрипта.Добавить(""); - СтрокиСкрипта.Добавить(" local commands=""" + ВсеКоманды + """"); - СтрокиСкрипта.Добавить(""); - СтрокиСкрипта.Добавить(" if [ $cword -eq 1 ]; then"); - СтрокиСкрипта.Добавить(" COMPREPLY=($(compgen -W ""$commands"" -- ""$cur""))"); - СтрокиСкрипта.Добавить(" return 0"); - СтрокиСкрипта.Добавить(" fi"); - СтрокиСкрипта.Добавить(""); - СтрокиСкрипта.Добавить(" local command=""${words[1]}"""); - СтрокиСкрипта.Добавить(""); - СтрокиСкрипта.Добавить(" case ""$command"" in"); - СтрокиСкрипта.Добавить(ТелоCase); - СтрокиСкрипта.Добавить(" *)"); - СтрокиСкрипта.Добавить(" ;;"); - СтрокиСкрипта.Добавить(" esac"); - СтрокиСкрипта.Добавить(""); - СтрокиСкрипта.Добавить(" return 0"); - СтрокиСкрипта.Добавить("}"); - СтрокиСкрипта.Добавить(""); - СтрокиСкрипта.Добавить("complete -F _ovm_completions ovm"); - - Возврат СтрСоединить(СтрокиСкрипта, Символы.ПС); - -КонецФункции - -Функция ПолучитьДеревоКоманд() - - КонсольноеПриложение = Поделка.НайтиЖелудь("КонсольноеПриложение"); - КорневаяКоманда = КонсольноеПриложение.ПолучитьКоманду(); - - Результат = Новый Массив(); - - Для Каждого Команда Из КорневаяКоманда.ПолучитьПодкоманды() Цикл - Команда.НачалоЗапуска(); - - ОписаниеКоманды = Новый Структура("Имена, Опции, Подкоманды, КомандаВерсий"); - ОписаниеКоманды.Имена = Команда.ПолучитьСинонимы(); - ОписаниеКоманды.Опции = ПолучитьОпцииКоманды(Команда); - ОписаниеКоманды.Подкоманды = ПолучитьПодкомандыКоманды(Команда); - ОписаниеКоманды.КомандаВерсий = КомандаПолученияВерсий(ОписаниеКоманды.Имена); - - Результат.Добавить(ОписаниеКоманды); - КонецЦикла; - - Возврат Результат; - -КонецФункции - -Функция ПолучитьПодкомандыКоманды(Команда) - - Результат = Новый Массив(); - - Для Каждого Подкоманда Из Команда.ПолучитьПодкоманды() Цикл - Подкоманда.НачалоЗапуска(); - - ОписаниеПодкоманды = Новый Структура("Имена, Опции"); - ОписаниеПодкоманды.Имена = Подкоманда.ПолучитьСинонимы(); - ОписаниеПодкоманды.Опции = ПолучитьОпцииКоманды(Подкоманда); - - Результат.Добавить(ОписаниеПодкоманды); - КонецЦикла; - - Возврат Результат; - -КонецФункции - -Функция КомандаПолученияВерсий(ИменаКоманды) - - Для Каждого Имя Из ИменаКоманды Цикл - Если Имя = "use" Тогда - Возврат "ls -q"; - ИначеЕсли Имя = "install" Тогда - Возврат "ls -r"; - ИначеЕсли Имя = "uninstall" ИЛИ Имя = "which" ИЛИ Имя = "run" Тогда - Возврат "ls -q"; - КонецЕсли; - КонецЦикла; - - Возврат ""; - -КонецФункции - -Функция ПолучитьОпцииКоманды(Команда) - - Опции = Новый Массив(); - Опции.Добавить("--help"); - - Для Каждого КлючЗначение Из Команда.ПараметрыКоманды() Цикл - Если СтрНачинаетсяС(КлючЗначение.Ключ, "-") Тогда - Опции.Добавить(КлючЗначение.Ключ); - КонецЕсли; - КонецЦикла; - - Возврат Опции; - -КонецФункции 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 e72bf04..d85905b 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,83 +6,87 @@ &Пластилин Перем УстановщикOneScript; +&Пластилин +Перем ВерсииOneScript; + &Пластилин("ДетекторОкружения") Перем Окружение; +&Аргумент( +Имя = "VERSION", +Описание = "Устанавливаемая версия (версии) OneScript. " +"Допустимо использовать трехномерные версии (1.0.17, 1.0.18), " +"lts, stable, dev, preview, lts-dev. " +"Может быть передано несколько значений" +) +&ТМассивСтрок +&ВОкружении("OVM_INSTALL_VERSION") +&ПоставщикДополнения("ПолучитьДоступныеВерсии") +Перем МассивВерсийКУстановке; + +&Опция(Имя = "name", Описание = "Синоним (алиас) устанавливаемой версии для последующего использования в ovm use") +&ТСтрока +&ВОкружении("OVM_INSTALL_NAME") +Перем АлиасВерсии; + +&Опция(Имя = "clean c", Описание = "Полностью очищать каталог установки (включая установленные библиотеки)") +&ПоУмолчанию(Ложь) +&ТБулево +&ВОкружении("OVM_INSTALL_CLEAN") +Перем ОчищатьКаталогУстановки; + +&Опция(Имя = "x86", Описание = "Устанавливать 32-разрядный дистрибутив OneScript") +&ПоУмолчанию(Ложь) +&ТБулево +&ВОкружении("OVM_INSTALL_X86") +Перем Устанавливать32РазряднуюВерсию; + +&Опция(Имя = "fdd", Описание = "Устанавливать fdd дистрибутив OneScript (требует установленный .NET для работы)") +&ПоУмолчанию(Ложь) +&ТБулево +&ВОкружении("OVM_INSTALL_FDD") +Перем УстанавливатьFDDДистрибутив; + &КомандаПриложения(Имя = "install i", Описание = "Установить OneScript указанных версий") Процедура ПриСозданииОбъекта() КонецПроцедуры -// Заполняет описание команды для библиотеки cli -// -// Параметры: -// КомандаПриложения - КомандаПриложения - Настраиваемая команда -// -Процедура ОписаниеКоманды(КомандаПриложения) Экспорт - - КомандаПриложения.Опция("name", "", "Синоним (алиас) устанавливаемой версии для последующего использования в ovm use") - .ТСтрока() - .ВОкружении("OVM_INSTALL_NAME"); - - КомандаПриложения.Опция("clean c", Ложь, "Полностью очищать каталог установки (включая установленные библиотеки)") - .ВОкружении("OVM_INSTALL_CLEAN"); - - Если Окружение.ЭтоX64() Тогда - КомандаПриложения.Опция("x86", Ложь, "Устанавливать 32-разрядный дистрибутив OneScript") - .ВОкружении("OVM_INSTALL_X86"); - КонецЕсли; - - КомандаПриложения.Опция("fdd", Ложь, "Устанавливать fdd дистрибутив OneScript (требует установленный .NET для работы)") - .ВОкружении("OVM_INSTALL_FDD"); - - КомандаПриложения.Аргумент( - "VERSION", - , - "Устанавливаемая версия (версии) OneScript. " + - "Допустимо использовать трехномерные версии (1.0.17, 1.0.18), " + - "lts, stable, dev, preview, lts-dev " + - "Может быть передано несколько значений") - .ТМассивСтрок() - .ВОкружении("OVM_INSTALL_VERSION"); - -КонецПроцедуры - -// Обработчик выполнения команды -// -// Параметры: -// КомандаПриложения - КомандаПриложения - Выполняемая команда -// -Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт - - МассивВерсийКУстановке = КомандаПриложения.ЗначениеАргумента("VERSION"); - АлиасВерсии = КомандаПриложения.ЗначениеОпции("name"); +&ВыполнениеКоманды +Процедура ВыполнениеКоманды() Экспорт - ДополнительныеПараметры = УстановщикOneScript.ДополнительныеПараметрыУстановки(); +Если ЗначениеЗаполнено(АлиасВерсии) И МассивВерсийКУстановке.Количество() > 1 Тогда +ВызватьИсключение "Опция <--name> может быть задана только при установке одной версии OneScript"; +КонецЕсли; - ДополнительныеПараметры.ОчищатьКаталогУстановки = КомандаПриложения.ЗначениеОпции("clean"); +ДополнительныеПараметры = УстановщикOneScript.ДополнительныеПараметрыУстановки(); +ДополнительныеПараметры.ОчищатьКаталогУстановки = ОчищатьКаталогУстановки; - Если ЗначениеЗаполнено(АлиасВерсии) И МассивВерсийКУстановке.Количество() > 1 Тогда - ВызватьИсключение "Опция <--name> может быть задана только при установке одной версии OneScript"; - КонецЕсли; +Если Окружение.ЭтоX64() Тогда +ДополнительныеПараметры.ИспользоватьХ64 = НЕ Устанавливать32РазряднуюВерсию; +Иначе +ДополнительныеПараметры.ИспользоватьХ64 = Ложь; +КонецЕсли; - Если Окружение.ЭтоX64() Тогда - ДополнительныеПараметры.ИспользоватьХ64 = НЕ КомандаПриложения.ЗначениеОпции("x86"); - Иначе - ДополнительныеПараметры.ИспользоватьХ64 = Ложь; - КонецЕсли; +ДополнительныеПараметры.ИспользоватьFDD = УстанавливатьFDDДистрибутив; - ДополнительныеПараметры.ИспользоватьFDD = КомандаПриложения.ЗначениеОпции("fdd"); +Для Каждого ВерсияКУстановке Из МассивВерсийКУстановке Цикл +УстановщикOneScript.УстановитьOneScript(ВерсияКУстановке, АлиасВерсии, ДополнительныеПараметры); +КонецЦикла; - Для Каждого ВерсияКУстановке Из МассивВерсийКУстановке Цикл - УстановщикOneScript.УстановитьOneScript(ВерсияКУстановке, АлиасВерсии, ДополнительныеПараметры); - КонецЦикла; - - Если МассивВерсийКУстановке.Количество() > 0 Тогда - Лог.Информация( - "Для начала использования версии OneScript, выполните команду: - |ovm use %1", - ?(ЗначениеЗаполнено(АлиасВерсии), АлиасВерсии, МассивВерсийКУстановке[МассивВерсийКУстановке.ВГраница()]) - ); - КонецЕсли; +Если МассивВерсийКУстановке.Количество() > 0 Тогда +Лог.Информация( +"Для начала использования версии OneScript, выполните команду: +|ovm use %1", +?(ЗначениеЗаполнено(АлиасВерсии), АлиасВерсии, МассивВерсийКУстановке[МассивВерсийКУстановке.ВГраница()]) +); +КонецЕсли; КонецПроцедуры + +Функция ПолучитьДоступныеВерсии() Экспорт +Результат = Новый Массив; +Для Каждого Строка Из ВерсииOneScript.ПолучитьСписокДоступныхКУстановкеВерсий() Цикл +Результат.Добавить(Строка.Алиас); +КонецЦикла; +Возврат Результат; +КонецФункции 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 39fba85..f3b5447 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" @@ -3,12 +3,16 @@ &Пластилин Перем ПараметрыOVM; +&Пластилин +Перем ВерсииOneScript; + &Аргумент( Имя = "VERSION", Описание = "Используемое окружение OneScript. Допустимо использовать трехномерные версии (1.0.17, 1.0.18), stable, dev, current" ) &ПоУмолчанию("current") &ВОкружении("OVM_RUN_VERSION") +&ПоставщикДополнения("ПолучитьУстановленныеВерсии") Перем ИспользуемаяВерсия; &Аргумент(Имя = "APP", Описание = "Используемое приложение. Например, oscript, opm, vrunner...") @@ -55,3 +59,11 @@ Команда.Исполнить(); КонецПроцедуры + +Функция ПолучитьУстановленныеВерсии() Экспорт +Результат = Новый Массив; +Для Каждого Строка Из ВерсииOneScript.ПолучитьСписокУстановленныхВерсий() Цикл +Результат.Добавить(Строка.Алиас); +КонецЦикла; +Возврат Результат; +КонецФункции 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\260Uninstall.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\260Uninstall.os" index 3212012..c3aae98 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\260Uninstall.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\260Uninstall.os" @@ -13,6 +13,7 @@ ) &ТМассивСтрок &ВОкружении("OVM_UNINSTALL_VERSION") +&ПоставщикДополнения("ПолучитьУстановленныеВерсии") Перем МассивВерсийКУдалению; &Опция(Имя = "force f", Описание = "Удалять даже текущую используемую версию") @@ -49,3 +50,11 @@ КонецЕсли; КонецПроцедуры + +Функция ПолучитьУстановленныеВерсии() Экспорт +Результат = Новый Массив; +Для Каждого Строка Из ВерсииOneScript.ПолучитьСписокУстановленныхВерсий() Цикл +Результат.Добавить(Строка.Алиас); +КонецЦикла; +Возврат Результат; +КонецФункции 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\260Use.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\260Use.os" index a4f67c8..dd0b319 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\260Use.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\260Use.os" @@ -1,8 +1,12 @@ &Пластилин Перем АктиваторOneScript; +&Пластилин +Перем ВерсииOneScript; + &Аргумент(Имя = "VERSION", Описание = "Используемая версия OneScript. Допустимо использовать трехномерные версии (1.0.17, 1.0.18), stable, dev") &ВОкружении("OVM_USE_VERSION") +&ПоставщикДополнения("ПолучитьУстановленныеВерсии") &ТСтрока Перем ИспользуемаяВерсия; @@ -20,3 +24,12 @@ Процедура ВыполнениеКоманды() Экспорт АктиваторOneScript.ИспользоватьВерсиюOneScript(ИспользуемаяВерсия, ВыполнятьУстановкуПриНеобходимости); КонецПроцедуры + +Функция ПолучитьУстановленныеВерсии() Экспорт + Результат = Новый Массив; + Для Каждого Строка Из ВерсииOneScript.ПолучитьСписокУстановленныхВерсий() Цикл + Результат.Добавить(Строка.Алиас); + КонецЦикла; + Возврат Результат; +КонецФункции + 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\260Which.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\260Which.os" index baf35d2..47fb743 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\260Which.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\260Which.os" @@ -10,6 +10,7 @@ &ПоУмолчанию("current") &Обязательный(Ложь) &ВОкружении("OVM_WHICH_VERSION") +&ПоставщикДополнения("ПолучитьУстановленныеВерсии") &ТСтрока Перем ИскомаяВерсия; @@ -25,3 +26,11 @@ ); КонецПроцедуры + +Функция ПолучитьУстановленныеВерсии() Экспорт + Результат = Новый Массив; + Для Каждого Строка Из ВерсииOneScript.ПолучитьСписокУстановленныхВерсий() Цикл + Результат.Добавить(Строка.Алиас); + КонецЦикла; + Возврат Результат; +КонецФункции From 4a06e3279d468f0c855dce2b04b34c699a04f4ba Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Wed, 22 Apr 2026 23:06:50 +0200 Subject: [PATCH 14/15] =?UTF-8?q?chore:=20=D1=81=D0=B8=D0=BD=D1=85=D1=80?= =?UTF-8?q?=D0=BE=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BB=D0=B5=D1=8F=20autumn-cli=20(=D0=B3=D0=B5?= =?UTF-8?q?=D0=BD=D0=B5=D1=80=D0=B0=D1=82=D0=BE=D1=80=D1=8B-=D0=B6=D0=B5?= =?UTF-8?q?=D0=BB=D1=83=D0=B4=D0=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Убран сценарий с fish — валидация оболочки теперь делается через &ТПеречисление, некорректное значение отсекается фреймворком до выполнения команды. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- features/completions.feature | 4 ---- 1 file changed, 4 deletions(-) diff --git a/features/completions.feature b/features/completions.feature index b8c992d..7f36c8f 100644 --- a/features/completions.feature +++ b/features/completions.feature @@ -26,7 +26,3 @@ Сценарий: Генерация completions для pwsh Когда Я выполняю команду "oscript ./src/cmd/ovm.os completions --shell pwsh" Тогда я вижу в консоли вывод "Register-ArgumentCompleter" - -Сценарий: Ошибка при указании неподдерживаемой оболочки - Когда Я выполняю команду "oscript ./src/cmd/ovm.os completions --shell fish" - Тогда я вижу в консоли вывод "не поддерживается" From 0d04c38ab7428593907ef3acf17e4419e74cbe9a Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Thu, 23 Apr 2026 12:15:22 +0200 Subject: [PATCH 15/15] refactor(completions): lightweight version-alias getter + fix indentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit КомандаInstall.os потеряла табуляцию при переходе на декларативный стиль; также в Run/Uninstall хвост ПолучитьУстановленныеВерсии был без отступов. Возвращено табуляционное оформление. В ВерсииOneScript добавлен ПолучитьСписокАлиасовУстановленныхВерсий — облегченный геттер, не запускающий oscript -version на каждую версию и не дергающий ls/dir для определения симлинков. Провайдеры автодо- полнения КомандаUse/Uninstall/Which/Run переведены на него — запекание списка алиасов в completion-скрипт больше не требует обхода процессов per version. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ...320\260\320\275\320\264\320\260Install.os" | 62 +++++++++---------- ...274\320\260\320\275\320\264\320\260Run.os" | 6 +- ...0\260\320\275\320\264\320\260Uninstall.os" | 6 +- ...274\320\260\320\275\320\264\320\260Use.os" | 6 +- ...4\320\260\320\275\320\264\320\260Which.os" | 6 +- ...1\200\321\201\320\270\320\270OneScript.os" | 25 ++++++++ 6 files changed, 60 insertions(+), 51 deletions(-) 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 d85905b..4ddca10 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" @@ -13,11 +13,11 @@ Перем Окружение; &Аргумент( -Имя = "VERSION", -Описание = "Устанавливаемая версия (версии) OneScript. " -"Допустимо использовать трехномерные версии (1.0.17, 1.0.18), " -"lts, stable, dev, preview, lts-dev. " -"Может быть передано несколько значений" + Имя = "VERSION", + Описание = "Устанавливаемая версия (версии) OneScript. " + "Допустимо использовать трехномерные версии (1.0.17, 1.0.18), " + "lts, stable, dev, preview, lts-dev. " + "Может быть передано несколько значений" ) &ТМассивСтрок &ВОкружении("OVM_INSTALL_VERSION") @@ -54,39 +54,39 @@ &ВыполнениеКоманды Процедура ВыполнениеКоманды() Экспорт -Если ЗначениеЗаполнено(АлиасВерсии) И МассивВерсийКУстановке.Количество() > 1 Тогда -ВызватьИсключение "Опция <--name> может быть задана только при установке одной версии OneScript"; -КонецЕсли; + Если ЗначениеЗаполнено(АлиасВерсии) И МассивВерсийКУстановке.Количество() > 1 Тогда + ВызватьИсключение "Опция <--name> может быть задана только при установке одной версии OneScript"; + КонецЕсли; -ДополнительныеПараметры = УстановщикOneScript.ДополнительныеПараметрыУстановки(); -ДополнительныеПараметры.ОчищатьКаталогУстановки = ОчищатьКаталогУстановки; + ДополнительныеПараметры = УстановщикOneScript.ДополнительныеПараметрыУстановки(); + ДополнительныеПараметры.ОчищатьКаталогУстановки = ОчищатьКаталогУстановки; -Если Окружение.ЭтоX64() Тогда -ДополнительныеПараметры.ИспользоватьХ64 = НЕ Устанавливать32РазряднуюВерсию; -Иначе -ДополнительныеПараметры.ИспользоватьХ64 = Ложь; -КонецЕсли; + Если Окружение.ЭтоX64() Тогда + ДополнительныеПараметры.ИспользоватьХ64 = НЕ Устанавливать32РазряднуюВерсию; + Иначе + ДополнительныеПараметры.ИспользоватьХ64 = Ложь; + КонецЕсли; -ДополнительныеПараметры.ИспользоватьFDD = УстанавливатьFDDДистрибутив; + ДополнительныеПараметры.ИспользоватьFDD = УстанавливатьFDDДистрибутив; -Для Каждого ВерсияКУстановке Из МассивВерсийКУстановке Цикл -УстановщикOneScript.УстановитьOneScript(ВерсияКУстановке, АлиасВерсии, ДополнительныеПараметры); -КонецЦикла; + Для Каждого ВерсияКУстановке Из МассивВерсийКУстановке Цикл + УстановщикOneScript.УстановитьOneScript(ВерсияКУстановке, АлиасВерсии, ДополнительныеПараметры); + КонецЦикла; -Если МассивВерсийКУстановке.Количество() > 0 Тогда -Лог.Информация( -"Для начала использования версии OneScript, выполните команду: -|ovm use %1", -?(ЗначениеЗаполнено(АлиасВерсии), АлиасВерсии, МассивВерсийКУстановке[МассивВерсийКУстановке.ВГраница()]) -); -КонецЕсли; + Если МассивВерсийКУстановке.Количество() > 0 Тогда + Лог.Информация( + "Для начала использования версии OneScript, выполните команду: + |ovm use %1", + ?(ЗначениеЗаполнено(АлиасВерсии), АлиасВерсии, МассивВерсийКУстановке[МассивВерсийКУстановке.ВГраница()]) + ); + КонецЕсли; КонецПроцедуры Функция ПолучитьДоступныеВерсии() Экспорт -Результат = Новый Массив; -Для Каждого Строка Из ВерсииOneScript.ПолучитьСписокДоступныхКУстановкеВерсий() Цикл -Результат.Добавить(Строка.Алиас); -КонецЦикла; -Возврат Результат; + Результат = Новый Массив; + Для Каждого Строка Из ВерсииOneScript.ПолучитьСписокДоступныхКУстановкеВерсий() Цикл + Результат.Добавить(Строка.Алиас); + КонецЦикла; + Возврат Результат; КонецФункции 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 f3b5447..cbe1565 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" @@ -61,9 +61,5 @@ КонецПроцедуры Функция ПолучитьУстановленныеВерсии() Экспорт -Результат = Новый Массив; -Для Каждого Строка Из ВерсииOneScript.ПолучитьСписокУстановленныхВерсий() Цикл -Результат.Добавить(Строка.Алиас); -КонецЦикла; -Возврат Результат; + Возврат ВерсииOneScript.ПолучитьСписокАлиасовУстановленныхВерсий(); КонецФункции 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\260Uninstall.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\260Uninstall.os" index c3aae98..a2f7b94 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\260Uninstall.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\260Uninstall.os" @@ -52,9 +52,5 @@ КонецПроцедуры Функция ПолучитьУстановленныеВерсии() Экспорт -Результат = Новый Массив; -Для Каждого Строка Из ВерсииOneScript.ПолучитьСписокУстановленныхВерсий() Цикл -Результат.Добавить(Строка.Алиас); -КонецЦикла; -Возврат Результат; + Возврат ВерсииOneScript.ПолучитьСписокАлиасовУстановленныхВерсий(); КонецФункции 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\260Use.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\260Use.os" index dd0b319..155ff27 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\260Use.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\260Use.os" @@ -26,10 +26,6 @@ КонецПроцедуры Функция ПолучитьУстановленныеВерсии() Экспорт - Результат = Новый Массив; - Для Каждого Строка Из ВерсииOneScript.ПолучитьСписокУстановленныхВерсий() Цикл - Результат.Добавить(Строка.Алиас); - КонецЦикла; - Возврат Результат; + Возврат ВерсииOneScript.ПолучитьСписокАлиасовУстановленныхВерсий(); КонецФункции 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\260Which.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\260Which.os" index 47fb743..8f613bd 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\260Which.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\260Which.os" @@ -28,9 +28,5 @@ КонецПроцедуры Функция ПолучитьУстановленныеВерсии() Экспорт - Результат = Новый Массив; - Для Каждого Строка Из ВерсииOneScript.ПолучитьСписокУстановленныхВерсий() Цикл - Результат.Добавить(Строка.Алиас); - КонецЦикла; - Возврат Результат; + Возврат ВерсииOneScript.ПолучитьСписокАлиасовУстановленныхВерсий(); КонецФункции 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 c562ffe..f534bf1 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" @@ -170,6 +170,31 @@ КонецФункции +// Получить список алиасов установленных версий. +// +// В отличие от ПолучитьСписокУстановленныхВерсий, не выполняет тяжелых операций — +// не запускает oscript -version для каждой версии и не определяет симлинки через ls/dir. +// Предназначен для случаев, когда нужен только перечень алиасов (например, автодополнение). +// +// Возвращаемое значение: +// Массив из Строка - Алиасы установленных версий +// +Функция ПолучитьСписокАлиасовУстановленныхВерсий() Экспорт + + Результат = Новый Массив; + + КаталогУстановки = ПараметрыOVM.КаталогУстановкиПоУмолчанию(); + НайденныеФайлы = НайтиФайлы(КаталогУстановки, ПолучитьМаскуВсеФайлы()); + Для Каждого НайденныйФайл Из НайденныеФайлы Цикл + Если ВерсияУстановлена(НайденныйФайл.Имя) Тогда + Результат.Добавить(НайденныйФайл.Имя); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + Функция ПолучитьАлиасыСимлинков() КаталогУстановки = ПараметрыOVM.КаталогУстановкиПоУмолчанию();