Skip to content

Commit 8b9c9a2

Browse files
committed
fix(mutt): re-implement _muttconffiles w/ bash4 feat and w/o eval
1 parent 280f59d commit 8b9c9a2

File tree

1 file changed

+39
-20
lines changed

1 file changed

+39
-20
lines changed

completions/mutt

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -44,27 +44,44 @@ _muttrc()
4444
}
4545

4646
# Recursively build list of sourced config files
47-
# @param $1 List of config files found so far
48-
# @param $2 Config file to process
49-
# @output List of config files
50-
_muttconffiles()
47+
# @param $1... Config file to process
48+
# @var[out] ret List of config files
49+
_comp_cmd_mutt__get_conffiles()
5150
{
52-
local file sofar
53-
local -a newconffiles
54-
55-
sofar=" $1 "
56-
shift
57-
while [[ ${1-} ]]; do
58-
newconffiles=($(command sed -n 's|^source[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$|\1|p' "$(eval printf %s $1)"))
59-
for file in ${newconffiles+"${newconffiles[@]}"}; do
60-
__expand_tilde_by_ref file
61-
[[ ! -f $file || $sofar == *\ $file\ * ]] && continue
62-
sofar+=" $file"
63-
sofar=" $(eval _muttconffiles \"$sofar\" $file) "
64-
done
65-
shift
51+
local -a conffiles=()
52+
local -A visited=()
53+
local file
54+
for file; do
55+
_comp_dequote "$file"
56+
_comp_cmd_mutt__get_conffiles__visit "$ret"
57+
done
58+
ret=("${conffiles[@]}")
59+
}
60+
# Recursion function for _comp_cmd_mutt__get_conffiles
61+
# @var[ref] conffiles List of config files found so far
62+
# @var[ref] visited Dictionary of config files already visited
63+
_comp_cmd_mutt__get_conffiles__visit()
64+
{
65+
[[ -f $1 && ${visited[$1]-} != yes ]] || return
66+
visited[$1]=yes
67+
conffiles+=("$1")
68+
69+
local -a newconffiles=($(command sed -n 's|^source[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$|\1|p' "$1"))
70+
local file
71+
for file in "${newconffiles[@]}"; do
72+
__expand_tilde_by_ref file
73+
_comp_cmd_mutt__get_conffiles__visit "$file"
6674
done
67-
printf '%s\n' $sofar
75+
}
76+
77+
# Recursively build list of sourced config files
78+
# @param $1... Config file to process
79+
# @output List of config files
80+
_muttconffiles()
81+
{
82+
local ret
83+
_comp_cmd_mutt__get_conffiles "$@"
84+
printf '%s\n' "${ret[@]}"
6885
}
6986

7087
# @param $1 (cur) Current word to complete
@@ -76,7 +93,9 @@ _muttaliases()
7693
muttrc=$(_muttrc)
7794
[[ -z $muttrc ]] && return
7895

79-
conffiles=($(eval _muttconffiles $muttrc $muttrc))
96+
local ret
97+
_comp_cmd_mutt__get_conffiles "$muttrc"
98+
conffiles=("${ret[@]}")
8099
# shellcheck disable=SC2046
81100
aliases=("$(command sed -n 's|^alias[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$|\1|p' \
82101
"${conffiles[@]}")")

0 commit comments

Comments
 (0)