diff options
| author | Egor Tensin <egor@tensin.name> | 2026-06-06 18:12:33 +0200 |
|---|---|---|
| committer | Egor Tensin <egor@tensin.name> | 2026-06-06 18:17:34 +0200 |
| commit | 40b7b047a3fbf6451228de7f69c8ad5f156f7d1c (patch) | |
| tree | 365df06d7b7cb6122d8a30695aa45a12c4f58302 /lib/vars.sh | |
| parent | workflows/ci: remove on: pull_request (diff) | |
| download | config-links-40b7b047a3fbf6451228de7f69c8ad5f156f7d1c.tar.gz config-links-40b7b047a3fbf6451228de7f69c8ad5f156f7d1c.zip | |
reorganize filesv2.1.0
Diffstat (limited to 'lib/vars.sh')
| -rw-r--r-- | lib/vars.sh | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/lib/vars.sh b/lib/vars.sh new file mode 100644 index 0000000..97b8da9 --- /dev/null +++ b/lib/vars.sh @@ -0,0 +1,59 @@ +# Copyright (c) 2016 Egor Tensin <egor@tensin.name> +# This file is part of the "Config file sharing" project. +# For details, see https://github.com/egor-tensin/config-links. +# Distributed under the MIT License. + +# Variable resolution + +declare -A cached_paths + +readonly root_var_name='CONFIG_LINKS_ROOT' + +resolve_variable() { + if [ "$#" -ne 1 ]; then + echo "usage: ${FUNCNAME[0]} VAR_NAME" >&2 + return 1 + fi + + local var_name="$1" + + if [ -n "${cached_paths[$var_name]+x}" ]; then + echo "${cached_paths[$var_name]}" + return 0 + fi + + if [ "$var_name" = "$root_var_name" ]; then + echo '/' + return 0 + fi + + if [ -z "${!var_name+x}" ]; then + dump "variable is not set: $var_name" >&2 + return 1 + fi + + local var_path="${!var_name}" + traverse_path --exist --directory -- "$var_path" +} + +cache_variable() { + local var_name + for var_name; do + [ -n "${cached_paths[$var_name]+x}" ] && continue + cached_paths[$var_name]="$( resolve_variable "$var_name" )" + done +} + +readonly var_name_regex='%\([_[:alpha:]][_[:alnum:]]*\)%' + +extract_variable_name() { + local s + for s; do + local var_name + if ! var_name="$( expr "$s" : "$var_name_regex/" )"; then + dump "couldn't extract variable name from: $s" >&2 + return 1 + fi + echo "$var_name" + done +} |
