Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/freebsd/poudriere.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan Drewery <bryan@shatow.net>2022-09-17 23:06:53 +0300
committerBryan Drewery <bryan@shatow.net>2022-11-05 18:47:57 +0300
commit6adaaf6b087cf84d3cfa6d1b3191eace216e5695 (patch)
tree920cb185f92042362609006c8b8d8fa6dcd4c358
parentdc03d6c66cbcc38dbe5c35345fcf1a1cbb506669 (diff)
hash: Add hash_isset_var() and hash_unset_var()
-rw-r--r--src/share/poudriere/include/hash.sh51
-rw-r--r--test/hash_basic.sh17
2 files changed, 68 insertions, 0 deletions
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