Re: [PATCH 5/7] completion: fix expansion issues in __gitcomp_nl()
- From
Felipe Contreras <felipe.contreras@gmail.com>
- Date
- Nov 17, 2012, 19:28 UTC
- Message-ID
- <CAMP44s1zaxey7TQxGaLtaMUwPTVTmRBn1w6=Zqefy7FJzEepBw@mail.gmail.com>
- In-Reply-To
- <CAMP44s2YOshWkM9n2XxxLw79=-VF8U3Q4ta1D1zgHqWH30zOmw@mail.gmail.com>
On Sat, Nov 17, 2012 at 8:08 PM, Felipe Contreras <felipe.contreras@gmail.com> wrote:
Show 47 quoted lines
> On Sat, Nov 17, 2012 at 3:14 PM, SZEDER Gábor <szeder@ira.uka.de> wrote:
>> On Sat, Nov 17, 2012 at 12:50:39PM +0100, Felipe Contreras wrote:
>>> On Sat, Nov 17, 2012 at 12:05 PM, SZEDER Gábor <szeder@ira.uka.de> wrote:
>>>
>>> > __gitcomp_nl ()
>>> > {
>>> > local IFS=$'\n'
>>> > - COMPREPLY=($(compgen -P "${2-}" -S "${4- }" -W "$1" -- "${3-$cur}"))
>>> > + COMPREPLY=($(awk -v pfx="${2-}" -v sfx="${4- }" -v cur="${3-$cur}" '
>>> > + BEGIN {
>>> > + FS="\n";
>>> > + len=length(cur);
>>> > + }
>>> > + {
>>> > + if (cur == substr($1, 1, len))
>>> > + print pfx$1sfx;
>>> > + }' <<< "$1" ))
>>> > }
>>>
>>> Does this really perform better than my alternative?
>>>
>>> + for x in $1; do
>>> + if [[ "$x" = "$3"* ]]; then
>>> + COMPREPLY+=("$2$x$4")
>>> + fi
>>> + done
>>
>> It does:
>>
>> My version:
>>
>> $ refs="$(for i in {0..9999} ; do echo branch$i ; done)"
>> $ time __gitcomp_nl "$refs"
>>
>> real 0m0.109s
>> user 0m0.096s
>> sys 0m0.012s
>>
>> Yours:
>>
>> $ time __gitcomp_nl "$refs"
>>
>> real 0m0.321s
>> user 0m0.312s
>> sys 0m0.008s
>
> Yeah, for 10000 refs, which is not the common case:And this beats both in every case:
while read -r x; do
if [[ "$x" == "$3"* ]]; then
COMPREPLY+=("$2$x$4")
fi
done <<< $1== 1 == one: real 0m0.004s user 0m0.003s sys 0m0.000s two: real 0m0.000s user 0m0.000s sys 0m0.000s == 10 == one: real 0m0.005s user 0m0.002s sys 0m0.002s two: real 0m0.000s user 0m0.000s sys 0m0.000s == 100 == one: real 0m0.005s user 0m0.004s sys 0m0.000s two: real 0m0.001s user 0m0.000s sys 0m0.000s == 1000 == one: real 0m0.010s user 0m0.008s sys 0m0.001s two: real 0m0.004s user 0m0.004s sys 0m0.000s == 10000 == one: real 0m0.061s user 0m0.057s sys 0m0.005s two: real 0m0.045s user 0m0.044s sys 0m0.000s == 100000 == one: real 0m0.582s user 0m0.575s sys 0m0.022s two: real 0m0.487s user 0m0.482s sys 0m0.004s == 1000000 == one: real 0m6.305s user 0m6.284s sys 0m0.216s two: real 0m5.268s user 0m5.194s sys 0m0.065s
-- Felipe Contreras