Skip to content

Commit

Permalink
util (ble/util/{save,restore}-vars): fix a bug that "name" and "prefi…
Browse files Browse the repository at this point in the history
…x" cannot be saved/restored
  • Loading branch information
akinomyoga committed Apr 6, 2020
1 parent 5966f22 commit 5f2480c
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 12 deletions.
104 changes: 104 additions & 0 deletions lib/test-util.sh
Expand Up @@ -58,6 +58,110 @@ ble/test ble/util/setexit 9 exit=9
ble/test ble/util/setexit 128 exit=128
ble/test ble/util/setexit 255 exit=255

# ble/unlocal

(
a=1
function f1 {
echo g:$a
local a=2
echo l:$a
ble/util/unlocal a
echo g:$a
a=3
}
ble/test 'f1; echo g:$a' \
stdout=g:1 \
stdout=l:2 \
stdout=g:1 \
stdout=g:3

function f2 {
echo f1:$a@f2
local a=3
echo f2:$a@f2
ble/util/unlocal a
echo f1:$a@f2
a=$a+
}
function f1 {
echo g:$a@f1
local a=2
echo f1:$a@f1
f2
echo f1:$a@f1
ble/util/unlocal a
echo g:$a@f1
a=$a+
}
ble/test 'a=1; f1; echo g:$a@g' \
stdout=g:1@f1 \
stdout=f1:2@f1 \
stdout=f1:2@f2 \
stdout=f2:3@f2 \
stdout=f1:2@f2 \
stdout=f1:2+@f1 \
stdout=g:1@f1 \
stdout=g:1+@g
)

# ble/util/upvar, ble/util/uparr

(
function f1 {
local a=1 b=2
local result=$((a+b))
local "$1" && ble/util/upvar "$1" "$result"
}
ble/test 'f1 x; ret=$x' ret=3
ble/test 'f1 a; ret=$a' ret=3
ble/test 'f1 result; ret=$result' ret=3

function f2 {
local a=1
local -a b=(2)
local -a result=($((a+b[0])) y z)
local "$1" && ble/util/uparr "$1" "${result[@]}"
}
ble/test 'f2 x; ret="(${x[*]})"' ret='(3 y z)'
ble/test 'f2 a; ret="(${a[*]})"' ret='(3 y z)'
ble/test 'f2 b; ret="(${b[*]})"' ret='(3 y z)'
ble/test 'f2 result; ret="(${result[*]})"' ret='(3 y z)'
)

# ble/util/save-vars, restore-vars

(
VARNAMES=(name x y count data)

function print-status {
echo "name=$name x=$x y=$y count=$count data=(${data[*]})"
}

function f1 {
local "${VARNAMES[@]}"

name=1 x=2 y=3 count=4 data=(aa bb cc dd)
print-status
ble/util/save-vars save1_ "${VARNAMES[@]}"

name=one x= y=A count=1 data=(Q)
print-status
ble/util/save-vars save2_ "${VARNAMES[@]}"

ble/util/restore-vars save1_ "${VARNAMES[@]}"
print-status

ble/util/restore-vars save2_ "${VARNAMES[@]}"
print-status
}
ble/test f1 \
stdout='name=1 x=2 y=3 count=4 data=(aa bb cc dd)' \
stdout='name=one x= y=A count=1 data=(Q)' \
stdout='name=1 x=2 y=3 count=4 data=(aa bb cc dd)' \
stdout='name=one x= y=A count=1 data=(Q)'
)

#------------------------------------------------------------------------------

## 関数 ble/test/check-ret
Expand Down
5 changes: 3 additions & 2 deletions memo/ChangeLog.md
Expand Up @@ -47,7 +47,8 @@
- global: work around `TMOUT` for `builtin read` `#D1306` 1c22a9d
- syntax: fix failglob errors of heredocs of the form `<<$(echo A)` `#D1308` 3212fd2
- decode (`ble-bind`): fix an error message `#D1311` c868b6d
- util (`bleopt`): fix a bug that a new setting is not defined with `name:=` `#D1312` c757b92
- util (`bleopt`): fix a bug that a new setting is not defined with `name:=` (test-util) `#D1312` c757b92
- util (`ble/util/{save,restore}-vars`): fix a bug that `name` and `prefix` cannot be saved/restored (test-util) 0000000

## Changes

Expand All @@ -63,7 +64,7 @@
- edit (quoted-insert): insert literal key sequence `#D1291` 420c933
- decode: support `decode_abort_char` for `modifyOtherKeys` `#D1293` ad98416
- edit (edit-and-execute): disable highlighting of old command line content `#D1295` 2f9a000
- util (`bleopt`): fail when a specified bleopt variable does not exist (test-util)
- util (`bleopt`): fail when a specified bleopt variable does not exist (test-util) 0000000

## Compatibility

Expand Down
20 changes: 10 additions & 10 deletions src/util.sh
Expand Up @@ -204,22 +204,22 @@ else
fi

function ble/util/save-vars {
local name prefix=$1; shift
for name; do
if ble/is-array "$name"; then
builtin eval "$prefix$name=(\"\${$name[@]}\")"
local __name __prefix=$1; shift
for __name; do
if ble/is-array "$__name"; then
builtin eval "$__prefix$__name=(\"\${$__name[@]}\")"
else
builtin eval "$prefix$name=\"\$$name\""
builtin eval "$__prefix$__name=\"\$$__name\""
fi
done
}
function ble/util/restore-vars {
local name prefix=$1; shift
for name; do
if ble/is-array "$prefix$name"; then
builtin eval "$name=(\"\${$prefix$name[@]}\")"
local __name __prefix=$1; shift
for __name; do
if ble/is-array "$__prefix$__name"; then
builtin eval "$__name=(\"\${$__prefix$__name[@]}\")"
else
builtin eval "$name=\"\$$prefix$name\""
builtin eval "$__name=\"\$$__prefix$__name\""
fi
done
}
Expand Down

0 comments on commit 5f2480c

Please sign in to comment.