From 6adaaf6b087cf84d3cfa6d1b3191eace216e5695 Mon Sep 17 00:00:00 2001 From: Bryan Drewery Date: Sat, 17 Sep 2022 13:06:53 -0700 Subject: hash: Add hash_isset_var() and hash_unset_var() --- src/share/poudriere/include/hash.sh | 51 +++++++++++++++++++++++++++++++++++++ test/hash_basic.sh | 17 +++++++++++++ 2 files changed, 68 insertions(+) diff --git a/src/share/poudriere/include/hash.sh b/src/share/poudriere/include/hash.sh index 28b3d298..e7bb38d5 100644 --- a/src/share/poudriere/include/hash.sh +++ b/src/share/poudriere/include/hash.sh @@ -35,6 +35,12 @@ if ! type eargs 2>/dev/null >&2; then } fi +if ! type mapfile_read_loop_redir 2>/dev/null >&2; then + mapfile_read_loop_redir() { + read -r "$@" + } +fi + if ! type _gsub 2>/dev/null >&2; then # Based on Shell Scripting Recipes - Chris F.A. Johnson (c) 2005 # Replace a pattern without needing a subshell/exec @@ -120,6 +126,32 @@ hash_isset() { _hash_var_name "${var}" "${key}" issetvar "${_hash_var_name}" } + +hash_isset_var() { + local -; set +x + [ $# -ne 1 ] && eargs hash_isset_var var + local _var="$1" + local _line _hash_var_name ret IFS + + _hash_var_name "${var}" "" + ret=1 + while IFS= mapfile_read_loop_redir line; do + # XXX: mapfile_read_loop can't safely return/break + if [ "${ret}" -eq 0 ]; then + continue + fi + case "${line}" in + ${_hash_var_name}*=*) + ret=0 + ;; + *) continue ;; + esac + done <<-EOF + $(set) + EOF + return "${ret}" +} + hash_get() { local -; set +x [ $# -ne 3 ] && eargs hash_get var key var_return @@ -171,6 +203,25 @@ hash_unset() { unset "${_hash_var_name}" } +hash_unset_var() { + local -; set +x + [ $# -eq 1 ] || eargs hash_unset_var var + local var="$1" + local key line _hash_var_name + + _hash_var_name "${var}" "" + while IFS= mapfile_read_loop_redir line; do + case "${line}" in + ${_hash_var_name}*=*) ;; + *) continue ;; + esac + key="${line%%=*}" + unset "${key}" + done <<-EOF + $(set) + EOF +} + list_contains() { local -; set +x [ $# -eq 2 ] || eargs list_contains var item diff --git a/test/hash_basic.sh b/test/hash_basic.sh index df821c44..01447d70 100644 --- a/test/hash_basic.sh +++ b/test/hash_basic.sh @@ -24,4 +24,21 @@ assert "ports-mgmt/pkg" "${value}" "Removed value should match" value= assert_ret 1 hash_get pkgname-origin "pkg-1.7" value +assert_ret 1 hash_isset_var 'blah' +hash_set blah 1 foo +hash_set blah 2 foo +hash_set blah 3 foo +hash_set blah 45 foo +hash_set blah2 1 foo +hash_set foo 1 foo +assert_ret 0 hash_isset_var 'blah' +assert_ret 0 hash_unset_var 'blah' +assert_ret 1 hash_isset blah 1 +assert_ret 1 hash_isset blah 2 +assert_ret 1 hash_isset blah 3 +assert_ret 1 hash_isset blah 45 +assert_ret 0 hash_isset blah2 1 +assert_ret 0 hash_isset foo 1 +assert_ret 1 hash_isset_var 'blah' + exit 0 -- cgit v1.2.3