From c4e388980e44c339b4f1246e7b1f3ee6e3ac1b38 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Thu, 23 Apr 2015 15:11:40 +0200 Subject: [PATCH] varstash: add support for exported variables in subshells --- lib/varstash | 24 ++++++++++++----- tests/varstash_export.t | 58 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 tests/varstash_export.t diff --git a/lib/varstash b/lib/varstash index 17bcd62..f43a10e 100644 --- a/lib/varstash +++ b/lib/varstash @@ -188,7 +188,7 @@ function stash() { elif [[ $vartype == $pattern" -x"* ]]; then # variable is exported if [[ -z $already_stashed ]]; then - eval "__varstash_export__$stash_name=\"\$$stash_which\"" + eval "export __varstash_export__$stash_name=\"\$$stash_which\"" fi if [[ $stash_which != $stash_expression && -z $_stashing_alias_assign ]]; then eval "export $stash_which=\"$stash_value\"" @@ -214,7 +214,7 @@ function stash() { # (eval):1: command not found: __varstash_nostash___tmp__home_dolszewski_src_smartcd_RANDOM_VARIABLE=1 # fixed in zsh commit 724fd07a67f, version 4.3.14 if [[ -z $already_stashed ]]; then - eval "__varstash_nostash__$stash_name=1" + eval "export __varstash_nostash__$stash_name=1" fi # In the case of a previously unset variable that we're assigning too, export it @@ -228,6 +228,14 @@ function stash() { done } +function get_autostash_array_name() { + local autostash_name=$(_mangle_var AUTOSTASH) + # Create a scalar variable linked to an array (for exporting). + local autostash_array_name=${(L)autostash_name} + typeset -xT $autostash_name $autostash_array_name + ret=$autostash_array_name +} + function autostash() { local run_from_autostash=1 while [[ -n $1 ]]; do @@ -239,9 +247,9 @@ function autostash() { local already_stashed= stash "$1" if [[ -z $already_stashed ]]; then - local autostash_name=$(_mangle_var AUTOSTASH) - local varname=${1%%'='*} - apush $autostash_name "$varname" + local ret varname=${1%%'='*} + get_autostash_array_name + apush $ret "$varname" fi shift unset -v _stashing_alias_assign @@ -322,7 +330,9 @@ function unstash() { function autounstash() { # If there is anything in (mangled) variable AUTOSTASH, then unstash it - local autounstash_name=$(_mangle_var AUTOSTASH) + local ret + get_autostash_array_name + local autounstash_name=$ret if (( $(alen $autounstash_name) > 0 )); then local run_from_autounstash=1 while (( $(alen $autounstash_name) > 0 )); do @@ -341,4 +351,4 @@ function _mangle_var() { echo "_tmp_${mangle_var_where}_${mangled_name}" } -# vim: filetype=sh autoindent expandtab shiftwidth=4 softtabstop=4 +# vim: filetype=zsh autoindent expandtab shiftwidth=4 softtabstop=4 diff --git a/tests/varstash_export.t b/tests/varstash_export.t new file mode 100644 index 0000000..d666d66 --- /dev/null +++ b/tests/varstash_export.t @@ -0,0 +1,58 @@ +Test varstash with exported variables in subshell. + + $ source $TESTDIR/setup.sh || return 1 + +Setup test environment. + + $ mkdir sub + $ cd sub + $ echo 'echo ENTER; autostash MYVAR=changed; autostash MYEXPORT=changed_export' > $AUTOENV_FILE_ENTER + $ echo 'echo LEAVE; autounstash' > $AUTOENV_FILE_LEAVE + +Manually create auth file + + $ test_autoenv_auth_env_files + +Set environment variable. + + $ MYVAR=orig + $ export MYEXPORT=orig_export + +Activating the env stashes it and applies a new value. + + $ cd . + ENTER + $ echo $MYVAR + changed + $ echo $MYEXPORT + changed_export + +The variable is not available in a subshell, only the exported one. + + $ $SHELL -c 'echo ${MYVAR:-empty}; echo $MYEXPORT' + empty + changed_export + +Activate autoenv in the subshell. + + $ $SHELL -c 'source $TEST_AUTOENV_PLUGIN_FILE; echo ${MYVAR}; echo $MYEXPORT' + ENTER + changed + changed_export + +"autounstash" should handle the exported variables. + + $ $SHELL -c 'source $TEST_AUTOENV_PLUGIN_FILE; cd ..; echo ${MYVAR:-empty}; echo $MYEXPORT' + ENTER + LEAVE + empty + orig_export +# +# Exiting the subshell should restore. +# +# $ pwd +# */varstash_export.t (glob) +# $ echo $MYVAR +# changed +# $ echo $MYEXPORT +# changed_export