perf(aws): speed up aws_profiles by parsing config files directly

Parse ~/.aws/config and ~/.aws/credentials directly instead of invoking
`aws configure list-profiles`, which has significant startup overhead
due to the Python-based AWS CLI.

Falls back to AWS CLI if neither file is readable.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Yu Xiang Zhang 2026-01-23 17:09:39 -05:00
commit 6f27d734c8

View file

@ -239,9 +239,30 @@ function aws_regions() {
}
function aws_profiles() {
aws --no-cli-pager configure list-profiles 2> /dev/null && return
[[ -r "${AWS_CONFIG_FILE:-$HOME/.aws/config}" ]] || return 1
grep --color=never -Eo '\[.*\]' "${AWS_CONFIG_FILE:-$HOME/.aws/config}" | sed -E 's/^[[:space:]]*\[(profile)?[[:space:]]*([^[:space:]]+)\][[:space:]]*$/\2/g'
local config_file="${AWS_CONFIG_FILE:-$HOME/.aws/config}"
local credentials_file="${AWS_SHARED_CREDENTIALS_FILE:-$HOME/.aws/credentials}"
local profiles=()
# Parse config file: match [default], [profile name], but not [sso-session ...] etc.
# Pattern handles optional whitespace around brackets and profile keyword
if [[ -r "$config_file" ]]; then
profiles+=($(grep --color=never -Eo '\[.*\]' "$config_file" \
| sed -nE 's/^[[:space:]]*\[(profile[[:space:]]+)?([^[:space:]]+)[[:space:]]*\]$/\2/p' \
| grep -v '^sso-session$'))
fi
# Parse credentials file (profiles have [name] format, no "profile" prefix)
if [[ -r "$credentials_file" ]]; then
profiles+=($(grep --color=never -Eo '\[.*\]' "$credentials_file" \
| sed -nE 's/^[[:space:]]*\[([^[:space:]]+)[[:space:]]*\]$/\1/p'))
fi
# Return unique profiles, or fall back to AWS CLI
if [[ ${#profiles[@]} -gt 0 ]]; then
printf '%s\n' "${profiles[@]}" | sort -u
else
aws --no-cli-pager configure list-profiles 2>/dev/null
fi
}
function _aws_regions() {