abbr: Ensure we don't split on "=" if the given separator is " "

This fails on e.g. an abbr that uses `env a=b`, like the included test demonstrates.

Unfortunately it decreases the speed again (2s vs 2.2s vs 4s original),
but correctness is more important.
This commit is contained in:
Fabian Homborg 2016-01-07 21:32:16 +01:00
parent fdb2559425
commit ed1919b266
2 changed files with 18 additions and 12 deletions

View file

@ -157,18 +157,20 @@ function __fish_abbr_parse_entry -S -a __input __key __value
if test -z "$__value"
set __value __
end
switch $__input
case "*=*"
# No need for bounds-checking because we already matched before
set -l KV (string split "=" -m 1 -- $__input)
set $__key $KV[1]
set $__value $KV[2]
case "* *"
set -l KV (string split " " -m 1 -- $__input)
set $__key $KV[1]
set $__value $KV[2]
case "*"
set $__key $__input
# A "=" _before_ any space - we only read the first possible separator
# because the key can contain neither spaces nor "="
if string match -qr '^[^ ]+=' -- $__input
# No need for bounds-checking because we already matched before
set -l KV (string split "=" -m 1 -- $__input)
set $__key $KV[1]
set $__value $KV[2]
else if string match -qr '^[^ ]+ .*' -- $__input
set -l KV (string split " " -m 1 -- $__input)
set $__key $KV[1]
set $__value $KV[2]
else
# This is needed for `erase` et al, where we want to allow passing a value
set $__key $__input
end
return 0
end

View file

@ -31,3 +31,7 @@ abbr -e '~__abbr2'
abbr -- '--__abbr3' 'xyz'
abbr | grep __abbr3
abbr -e '--__abbr3'
# Ensure we are not recognizing later "=" as separators
abbr d2 env a=b banana
abbr -l | string match -q d2; or echo "= test failed"