Re: [PATCH v3 2/2] completion: bash: check for alias loop
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Nov 12, 2020, 17:20 UTC
- Message-ID
- <xmqqsg9ejxu0.fsf@gitster.c.googlers.com>
- In-Reply-To
- <20201112100204.GC4270@szeder.dev>
SZEDER Gábor <szeder.dev@gmail.com> writes:
Show 16 quoted lines
>> while [[ -n "$cur" ]]; do >> + if [[ "$list" == *"$cur "* ]]; then > > I suspect the right hand side should be *" $cur "* ... > >> + # loop detected >> + return >> + fi >> + >> cmdline=$(__git config --get "alias.$cur") >> - last=$cur >> + list="$cur $list" > > ... and this should be list=" $cur $list", because otherwise a partial > match is possible and would be mistaken for a loop (though I didn't > actually test whether that's indeed the case).
Traditionist may use
list=
while :
do
cur=$(obtain cur somehow)
case " $list " in
*" $cur "*) : cur appears in list ;;
esac
list="$cur${list+ }$list"
doneto make the invariant "$list is a SP-separated tokens, no extra SP on either ends" and I think the same idea would work with [[ $a == $b ]], but "one SP on both ends, two SPs in between" like yours do is OK, too.
Not keeping excess SPs out of the list (unlike the above "no extra SP on ends") means how "finally, take the first token in the list, that's the answer" is coded, though. You'd need to split off the leading SP from it (below).
Show 15 quoted lines
>> cur=
>>
>> for word in $cmdline; do
>> @@ -1149,7 +1154,7 @@ __git_aliased_command ()
>> done
>> done
>>
>> - cur=$last
>> + cur="${list%% *}"
>> if [[ "$cur" != "$1" ]]; then
>> echo "$cur"
>> fi
>> --
>> 2.29.2
>>