]> Sergey Matveev's repositories - zsh-autoenv.git/blobdiff - lib/varstash
varstash: fix get_autostash_array_name for Zsh 4.3.17 (Travis)
[zsh-autoenv.git] / lib / varstash
index eae62b37836248dba62678578af18b474906b805..26b2e7286f6f32d987c711d5f071a82b1e62a48b 100644 (file)
 ################################################################################
 
 
-# Library functions, from smartcd's lib/core/arrays. {{{
-function apush() {
-    local var=$1; shift
-    eval "$var=(\${$var[@]} \"\$@\")"
-}
-
-function alen() {
-    local var=$1
-
-    if [[ -n $var ]]; then
-        eval "echo \${#$var[@]}"
-    fi
-}
-
-function afirst() {
-    setopt localoptions && setopt ksharrays
-    local var=$1
-
-    if [[ -n $var ]] && (( $(eval "echo \${#$var[@]}") >= 1 )); then
-        eval "echo \"\${$var""[0]}\""
-    fi
-}
-
-function ashift() {
-    setopt localoptions && setopt ksharrays
-    local var=$1
-
-    local _ashift_return=
-
-    if [[ -n $var ]] && (( $(eval "echo \${#$var[@]}") >= 1 )); then
-        eval "_ashift_return=\"\${$var""[0]}\""
-        eval "$var""[0]=()"
-
-        echo "$_ashift_return"
-    fi
-}
-# }}}
-
-
 function stash() {
     if [[ $1 == "-f" ]]; then
         local force=1; shift
@@ -188,7 +149,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 +175,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,10 +189,22 @@ 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}
+    if ! (( ${(P)+autostash_array_name} )); then
+        # Conditionally set it, to prevent error with Zsh 4.3:
+        # can't tie already tied scalar: ...
+        typeset -xT $autostash_name $autostash_array_name
+    fi
+    ret=$autostash_array_name
+}
+
 function autostash() {
     local run_from_autostash=1
     while [[ -n $1 ]]; do
-        if [[ $1 == "alias" && $2 = *=* ]]; then
+        if [[ $1 == "alias" && $2 == *=* ]]; then
             shift
             local _stashing_alias_assign=1
         fi
@@ -239,9 +212,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
+            eval "$ret=(\$$ret \$varname)"
         fi
         shift
         unset -v _stashing_alias_assign
@@ -322,15 +295,14 @@ function unstash() {
 
 function autounstash() {
     # If there is anything in (mangled) variable AUTOSTASH, then unstash it
-    local autounstash_name=$(_mangle_var AUTOSTASH)
-    if (( $(alen $autounstash_name) > 0 )); then
+    local ret
+    get_autostash_array_name
+    if (( ${#${(P)ret}} > 0 )); then
         local run_from_autounstash=1
-        while (( $(alen $autounstash_name) > 0 )); do
-            local autounstash_var=$(afirst $autounstash_name)
-            ashift $autounstash_name >/dev/null
+        for autounstash_var in ${(P)ret}; do
             unstash $autounstash_var
         done
-        unset $autounstash_name
+        unset $ret
     fi
 }
 
@@ -341,4 +313,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