]> Sergey Matveev's repositories - zsh-autoenv.git/blobdiff - autoenv.zsh
Fix use of local in while loop. (#66)
[zsh-autoenv.git] / autoenv.zsh
index ed570c07a28b1802c0d715e221a338f0258902aa..db059f292e319a81f36296d9e7907f3c09d7c040 100644 (file)
@@ -168,30 +168,58 @@ _autoenv_debug() {
 # }}}
 
 
-# Generate hash pair for a given file ($1).
-# A fixed hash value can be given as 2nd arg, but is used with tests only.
+# Generate hash pair for a given file ($1) and version ($2).
+# A fixed hash value can be given as 3rd arg, but is used with tests only.
 # The format is ":$file:$hash:$version".
 _autoenv_hash_pair() {
   local env_file=${1:A}
-  local env_cksum=${2:-}
+  local cksum_version=${2:-2}
+  local env_cksum=${3:-}
   if [[ -z $env_cksum ]]; then
     if ! [[ -e $env_file ]]; then
       echo "Missing file argument for _autoenv_hash_pair!" >&2
       return 1
     fi
-    # Get the output from `cksum` and join the first two words with a dot.
-    env_cksum=${(j:.:)${:-$(cksum "$env_file")}[1,2]}
+    if [ $cksum_version = 2 ]; then
+      # Get the output from `cksum` and join the first two words with a dot.
+      env_cksum=${(j:.:)${:-$(cksum "$env_file")}[1,2]}
+    elif [ $cksum_version = 1 ]; then
+      env_cksum=$(shasum $env_file | cut -d' ' -f1)
+    else
+      echo "Invalid version argument (${cksum_version}) for _autoenv_hash_pair!" >&2
+      return 1
+    fi
   fi
-  echo ":${env_file}:${env_cksum}:1"
+  echo ":${env_file}:${env_cksum}:${cksum_version}"
 }
 
-_autoenv_authorized_env_file() {
-  local env_file=$1
-  local pair="$(_autoenv_hash_pair $env_file)"
+
+# Checks for the existence of a hash signature in the auth file
+_autoenv_authorized_pair() {
+  local pair=$1
   test -f $AUTOENV_AUTH_FILE \
     && \grep -qF $pair $AUTOENV_AUTH_FILE
 }
 
+
+_autoenv_authorized_env_file() {
+  local env_file=$1
+  local pair
+  pair=$(_autoenv_hash_pair $env_file)
+  _autoenv_debug "v2 pair: ${pair}"
+  if ! _autoenv_authorized_pair $pair; then
+    # Fallback for v1 (SHA-1) pairs
+    pair=$(_autoenv_hash_pair $env_file 1)
+    _autoenv_debug "v1 pair: ${pair}"
+    if _autoenv_authorized_pair $pair; then
+      # Upgrade v1 entries to v2
+      _autoenv_authorize $env_file
+    else
+      return 1
+    fi
+  fi
+}
+
 _autoenv_authorize() {
   local env_file=${1:A}
   _autoenv_deauthorize $env_file
@@ -200,12 +228,12 @@ _autoenv_authorize() {
 }
 
 # Deauthorize a given filename, by removing it from the auth file.
-# This uses `test -s` to only handle non-empty files, and a subshell to
-# allow for writing to the same file again.
+# This uses `test -s` to only handle non-empty files.
 _autoenv_deauthorize() {
   local env_file=${1:A}
   if [[ -s $AUTOENV_AUTH_FILE ]]; then
-    echo "$(\grep -vF :${env_file}: $AUTOENV_AUTH_FILE)" >| $AUTOENV_AUTH_FILE
+    \grep -vF :${env_file}: $AUTOENV_AUTH_FILE >| $AUTOENV_AUTH_FILE.tmp
+    \mv $AUTOENV_AUTH_FILE.tmp $AUTOENV_AUTH_FILE
   fi
 }
 
@@ -275,7 +303,16 @@ _autoenv_source() {
   # Source the env file.
   _autoenv_debug "== SOURCE: ${bold_color:-}$autoenv_env_file${reset_color:-}\n      PWD: $PWD"
   : $(( _autoenv_debug_indent++ ))
+
+  local restore_xtrace
+  if [[ $AUTOENV_DEBUG -gt 2 && ! -o xtrace ]]; then
+    restore_xtrace=1
+    setopt localoptions xtrace
+  fi
   source $autoenv_env_file
+  if (( restore_xtrace )); then
+    setopt noxtrace
+  fi
   : $(( _autoenv_debug_indent-- ))
   _autoenv_debug "== END SOURCE =="