Skip to content

Commit 5c43c3c

Browse files
committed
fix(mutt): re-implement _muttconffiles w/ bash4 feat and w/o eval
1 parent 9c09133 commit 5c43c3c

File tree

1 file changed

+43
-20
lines changed

1 file changed

+43
-20
lines changed

completions/mutt

+43-20
Original file line numberDiff line numberDiff line change
@@ -44,27 +44,48 @@ _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+
# @return 0 if any conffiles are generated, 1 if none is generated.
50+
_comp_cmd_mutt__get_conffiles()
5151
{
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
52+
local -a conffiles=()
53+
local -A visited=()
54+
local file
55+
for file; do
56+
_comp_dequote "$file"
57+
_comp_cmd_mutt__get_conffiles__visit "$ret"
58+
done
59+
((${#conffiles[@]})) || return 1
60+
ret=("${conffiles[@]}")
61+
}
62+
# Recursion function for _comp_cmd_mutt__get_conffiles
63+
# @var[ref] conffiles List of config files found so far
64+
# @var[ref] visited Dictionary of config files already visited
65+
_comp_cmd_mutt__get_conffiles__visit()
66+
{
67+
[[ -f $1 && ${visited[$1]-} != yes ]] || return 0
68+
visited[$1]=yes
69+
conffiles+=("$1")
70+
71+
local -a newconffiles=($(command sed -n 's|^source[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$|\1|p' "$1"))
72+
((${#newconffiles[@]})) || return 0
73+
74+
local file
75+
for file in "${newconffiles[@]}"; do
76+
__expand_tilde_by_ref file
77+
_comp_cmd_mutt__get_conffiles__visit "$file"
6678
done
67-
printf '%s\n' $sofar
79+
}
80+
81+
# Recursively build list of sourced config files
82+
# @param $1... Config file to process
83+
# @output List of config files
84+
_muttconffiles()
85+
{
86+
local ret
87+
_comp_cmd_mutt__get_conffiles "$@" &&
88+
printf '%s\n' "${ret[@]}"
6889
}
6990

7091
# @param $1 (cur) Current word to complete
@@ -76,7 +97,9 @@ _muttaliases()
7697
muttrc=$(_muttrc)
7798
[[ ! $muttrc ]] && return
7899

79-
conffiles=($(eval _muttconffiles $muttrc $muttrc))
100+
local ret
101+
_comp_cmd_mutt__get_conffiles "$muttrc" || return 0
102+
conffiles=("${ret[@]}")
80103
# shellcheck disable=SC2046
81104
aliases=("$(command sed -n 's|^alias[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$|\1|p' \
82105
"${conffiles[@]}")")

0 commit comments

Comments
 (0)