Browse Source

completion: list variable names reliably with 'git config --name-only'

Recenty I created a multi-line branch description with '.' and '='
characters on one of the lines, and noticed that fragments of that line
show up when completing set variable names for 'git config', e.g.:

  $ git config --get branch.b.description
  Branch description to fool the completion script with a
  second line containing dot . and equals = characters.
  $ git config --unset <TAB>
  ...
  second line containing dot . and equals
  ...

The completion script runs 'git config --list' and processes its output
to strip the values and keep only the variable names.  It does so by
looking for lines containing '.' and '=' and outputting everything
before the '=', which was fooled by my multi-line branch description.

A similar issue exists with aliases and pretty format aliases with
multi-line values, but in that case 'git config --get-regexp' is run and
lines in its output are simply stripped after the first space, so
subsequent lines don't even have to contain '.' and '=' to fool the
completion script.

Use the new '--name-only' option added in the previous commit to list
config variable names reliably in both cases, without error-prone post
processing.

Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
SZEDER Gábor 10 years ago committed by Junio C Hamano
parent
commit
905f2036d0
  1. 15
      contrib/completion/git-completion.bash

15
contrib/completion/git-completion.bash

@ -744,9 +744,8 @@ __git_compute_porcelain_commands ()
__git_get_config_variables () __git_get_config_variables ()
{ {
local section="$1" i IFS=$'\n' local section="$1" i IFS=$'\n'
for i in $(git --git-dir="$(__gitdir)" config --get-regexp "^$section\..*" 2>/dev/null); do for i in $(git --git-dir="$(__gitdir)" config --name-only --get-regexp "^$section\..*" 2>/dev/null); do
i="${i#$section.}" echo "${i#$section.}"
echo "${i/ */}"
done done
} }


@ -1774,15 +1773,7 @@ __git_config_get_set_variables ()
c=$((--c)) c=$((--c))
done done


git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null | git --git-dir="$(__gitdir)" config $config_file --name-only --list 2>/dev/null
while read -r line
do
case "$line" in
*.*=*)
echo "${line/=*/}"
;;
esac
done
} }


_git_config () _git_config ()

Loading…
Cancel
Save