Skip to content

Commit d8404c6

Browse files
nixel2007Copilot
andcommitted
Fix КомандаCompletions: avoid DI cycle and use valid multi-line string construction
- 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>
1 parent e588683 commit d8404c6

1 file changed

Lines changed: 38 additions & 37 deletions

File tree

src/cmd/Классы/КомандаCompletions.os

Lines changed: 38 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
Перем Лог;
33

44
&Пластилин
5-
Перем КонсольноеПриложение;
5+
Перем Поделка;
66

77
&Опция(Имя = "shell s", Описание = "Тип оболочки для генерации автодополнения (поддерживается: bash)")
88
&ТСтрока
@@ -82,47 +82,48 @@
8282
ВсеКоманды = СтрСоединить(МассивИменВсехКоманд, " ");
8383
ТелоCase = СтрСоединить(СтрокиCase, Символы.ПС);
8484

85-
Скрипт =
86-
"# ovm bash completions
87-
# Добавьте строку ниже в ~/.bashrc для активации автодополнения:
88-
# source <(ovm completions --shell bash)
89-
90-
_ovm_completions() {
91-
local cur prev words cword
92-
_init_completion 2>/dev/null || {
93-
COMPREPLY=()
94-
cur=""${COMP_WORDS[COMP_CWORD]}""
95-
prev=""${COMP_WORDS[COMP_CWORD-1]}""
96-
words=(""${COMP_WORDS[@]}"")
97-
cword=$COMP_CWORD
98-
}
99-
100-
local commands=""" + ВсеКоманды + """
101-
102-
if [ $cword -eq 1 ]; then
103-
COMPREPLY=($(compgen -W ""$commands"" -- ""$cur""))
104-
return 0
105-
fi
106-
107-
local command=""${words[1]}""
108-
109-
case ""$command"" in
110-
" + ТелоCase + "
111-
*)
112-
;;
113-
esac
114-
115-
return 0
116-
}
117-
118-
complete -F _ovm_completions ovm";
119-
120-
Возврат Скрипт;
85+
СтрокиСкрипта = Новый Массив();
86+
СтрокиСкрипта.Добавить("# ovm bash completions");
87+
СтрокиСкрипта.Добавить("# Добавьте строку ниже в ~/.bashrc для активации автодополнения:");
88+
СтрокиСкрипта.Добавить("# source <(ovm completions --shell bash)");
89+
СтрокиСкрипта.Добавить("");
90+
СтрокиСкрипта.Добавить("_ovm_completions() {");
91+
СтрокиСкрипта.Добавить(" local cur prev words cword");
92+
СтрокиСкрипта.Добавить(" _init_completion 2>/dev/null || {");
93+
СтрокиСкрипта.Добавить(" COMPREPLY=()");
94+
СтрокиСкрипта.Добавить(" cur=""${COMP_WORDS[COMP_CWORD]}""");
95+
СтрокиСкрипта.Добавить(" prev=""${COMP_WORDS[COMP_CWORD-1]}""");
96+
СтрокиСкрипта.Добавить(" words=(""${COMP_WORDS[@]}"")");
97+
СтрокиСкрипта.Добавить(" cword=$COMP_CWORD");
98+
СтрокиСкрипта.Добавить(" }");
99+
СтрокиСкрипта.Добавить("");
100+
СтрокиСкрипта.Добавить(" local commands=""" + ВсеКоманды + """");
101+
СтрокиСкрипта.Добавить("");
102+
СтрокиСкрипта.Добавить(" if [ $cword -eq 1 ]; then");
103+
СтрокиСкрипта.Добавить(" COMPREPLY=($(compgen -W ""$commands"" -- ""$cur""))");
104+
СтрокиСкрипта.Добавить(" return 0");
105+
СтрокиСкрипта.Добавить(" fi");
106+
СтрокиСкрипта.Добавить("");
107+
СтрокиСкрипта.Добавить(" local command=""${words[1]}""");
108+
СтрокиСкрипта.Добавить("");
109+
СтрокиСкрипта.Добавить(" case ""$command"" in");
110+
СтрокиСкрипта.Добавить(ТелоCase);
111+
СтрокиСкрипта.Добавить(" *)");
112+
СтрокиСкрипта.Добавить(" ;;");
113+
СтрокиСкрипта.Добавить(" esac");
114+
СтрокиСкрипта.Добавить("");
115+
СтрокиСкрипта.Добавить(" return 0");
116+
СтрокиСкрипта.Добавить("}");
117+
СтрокиСкрипта.Добавить("");
118+
СтрокиСкрипта.Добавить("complete -F _ovm_completions ovm");
119+
120+
Возврат СтрСоединить(СтрокиСкрипта, Символы.ПС);
121121

122122
КонецФункции
123123

124124
Функция ПолучитьДеревоКоманд()
125125

126+
КонсольноеПриложение = Поделка.НайтиЖелудь("КонсольноеПриложение");
126127
КорневаяКоманда = КонсольноеПриложение.ПолучитьКоманду();
127128

128129
Результат = Новый Массив();

0 commit comments

Comments
 (0)