From eb0014f1bb085bdabafd2502a9b9d5796c0081f2 Mon Sep 17 00:00:00 2001 From: Mork Date: Sat, 11 Jun 2022 01:33:05 +0800 Subject: [PATCH 1/5] fix works --- fn/-z4h-direnv-hook | 122 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 113 insertions(+), 9 deletions(-) diff --git a/fn/-z4h-direnv-hook b/fn/-z4h-direnv-hook index cd4780a..aa87012 100644 --- a/fn/-z4h-direnv-hook +++ b/fn/-z4h-direnv-hook @@ -16,18 +16,15 @@ fi # { print -n '\x1f\x8b\x08\x00\x00\x00\x00\x00'; base64 -d <<<${${DIRENV_WATCHES//-/+}//_//} } | zcat 2>/dev/null -# zcat -# gzcat -# uncompress -c -# gunzip -c -# gzip -cd +# zcat # gzcat # uncompress -c # gunzip -c # gzip -cd local sig -local envrc=(./(../)#.envrc(NY1:a)) +local envrc=( ./(../)#.envrc(NY1:a) ) if (( $#envrc )); then local -a deps=( ${XDG_DATA_HOME:-~/.local/share}/direnv/allow - ${XDG_CONFIG_HOME:-~/.config}/{direnv.toml,config.toml}) + ${XDG_CONFIG_HOME:-~/.config}/{,direnv/}{direnv.toml,config.toml,direnvrc} + ) local -a stat local files=($^deps(N)) local non_files=(${deps:|files}) @@ -43,9 +40,114 @@ else local sig=none fi -[[ $sig == ${_z4h_direnv_sig-} ]] && return + # echo with ansi color -unset _z4h_direnv_sig + # set -x + # echo "\e[1;46;95m$DIRENV_WATCHES\e[0m" + # set +x + +if [[ $sig == ${_z4h_direnv_sig-} ]]; then + [[ -v DIRENV_WATCHES ]] || return; + + + typeset watched_files_changed + (){ + typeset -A b64_map + local -i i=0 + local -a b64chars=({A..Z} {a..z} {0..9} + /) + + for char in $b64chars[@]; do + b64_map+=( ${char} $( printf %06d $(( [##2] $i )) ) ); i+=1; + done + # adding -, and _ to the map so it works without this replacement ${${ ... //-/+}//_//} + b64_map+=( + [-]=$b64_map[+] [_]=$b64_map[/] + # also adding = in the map while i'm at it + [=]=$( printf %06d $(( [##2] 0 )) ) + ) + + local bits hexstring + local -i bitlength=8 + for j in {0..${#DIRENV_WATCHES}}; do + bits+=${b64_map[${DIRENV_WATCHES:$j:1}]} + if [[ ${#bits} -ge $bitlength ]]; then + hexstring+="\x${(Ll:2::0:)$(( [##16] 2#${bits:0:$bitlength} ))}" + bits=${bits:$bitlength} + fi + done + + local lead_bits='\x1f\x8b\x08\x00\x00\x00\x00\x00' + local -a apps=( 'zcat' 'gzcat' 'gzip' '-cd' 'gunzip' '-c' 'uncompress' '-c' ) + + for app in $apps; do + (( $+commands[$app] )) || continue; + local unpacked=$( echo "${lead_bits}${hexstring}" | "$app" ${${apps[((${apps[(i)$app]}+1))]}:#[^-]*} -- 2>/dev/null ) + [[ -n $unpacked ]] && break + done + + setopt localoptions extendedglob + + local -A element + local sep + sep='},' + local -a data_array=( "${(ps:$sep:)${unpacked#(*)[^\{]}}" ) + sep='}\n' + local data=${(pj:$sep:)data_array:#(*)($envrc|${deps[1]})(*)} + local stats + + while [[ $#data -gt 1 ]]; do + (){ + local field + local -A found + + data=${${data//$'\r'}##[[:space:]]#} + + [[ $data == '{'* ]] || return + data[1]= + while true; do + data=${data##[[:space:]]#} + [[ -n $data ]] || return + case $data[1] in + ':') local tail=${data##([^,\\]|\\?)#} + local s=${data:1:-$#tail} + data=$tail + if [[ $field == (Path|Modtime) ]]; then + (( ! $+found[$field] )) || return + [[ -n $s ]] || return + [[ $s != *($'\n'|'\')* ]] || return + found[$field]=${(Q)s} + (( $#found == 2 )) && break + fi + ;; + ',') data[1]=; field=;; + '"') local tail=${data##\"([^\"\\]|\\?)#} + local s=${data:1:-$#tail} + data=${tail:1} + [[ -z $field ]] && field=${s:-x} + ;; + *) return 1;; + esac + done + element=( ${(kv)found[@]} ) + } + + zstat -A stats +mtime $element[Path] 2>/dev/null + + if [[ ${stats:=0} != $element[Modtime] ]]; then + watch_files_changed="$element[Path] $element[Modtime] $stats"; break + fi + + data=${data##([^\{]|\\?)#} + unset stats + + done + unsetopt localoptions extendedglob + } + + [[ -z $watch_files_changed ]] && return +fi + +unset _z4h_direnv_sig _z4h_direnv_watches local data data=$( @@ -77,5 +179,7 @@ if [[ ! -v __p9k_trapped ]]; then builtin trap : INT builtin trap "builtin trap ${(q)__p9k_trapint:--} INT" EXIT fi + builtin eval -- $out typeset -g _z4h_direnv_sig=$sig +typeset -g _z4h_direnv_watches=$DIRENV_WATCHES From 05cc36cf1c22b68fc8b83acfad0fad6754d7dc72 Mon Sep 17 00:00:00 2001 From: Mork Date: Sun, 12 Jun 2022 02:06:33 +0800 Subject: [PATCH 2/5] cleaned some comments --- fn/-z4h-direnv-hook | 120 ++++++++++++++++---------------------------- 1 file changed, 44 insertions(+), 76 deletions(-) diff --git a/fn/-z4h-direnv-hook b/fn/-z4h-direnv-hook index aa87012..9bf7e39 100644 --- a/fn/-z4h-direnv-hook +++ b/fn/-z4h-direnv-hook @@ -19,88 +19,50 @@ fi # zcat # gzcat # uncompress -c # gunzip -c # gzip -cd local sig -local envrc=( ./(../)#.envrc(NY1:a) ) +local envrc=(./(../)#.envrc(NY1:a)) if (( $#envrc )); then local -a deps=( ${XDG_DATA_HOME:-~/.local/share}/direnv/allow ${XDG_CONFIG_HOME:-~/.config}/{,direnv/}{direnv.toml,config.toml,direnvrc} ) - local -a stat - local files=($^deps(N)) - local non_files=(${deps:|files}) - if zstat -A stat +mtime -- $envrc $files 2>/dev/null; then - local sig=$envrc$'\0'${(pj:\0:)stat} - else - local sig=stat-error - fi -elif [[ ! -v DIRENV_WATCHES ]]; then - typeset -g _z4h_direnv_sig=none - return -else - local sig=none -fi - - # echo with ansi color - - # set -x - # echo "\e[1;46;95m$DIRENV_WATCHES\e[0m" - # set +x - -if [[ $sig == ${_z4h_direnv_sig-} ]]; then - [[ -v DIRENV_WATCHES ]] || return; - - - typeset watched_files_changed + if [[ -v DIRENV_WATCHES ]]; then + local watches=$DIRENV_WATCHES + local -a watched (){ typeset -A b64_map local -i i=0 local -a b64chars=({A..Z} {a..z} {0..9} + /) - for char in $b64chars[@]; do - b64_map+=( ${char} $( printf %06d $(( [##2] $i )) ) ); i+=1; - done - # adding -, and _ to the map so it works without this replacement ${${ ... //-/+}//_//} - b64_map+=( - [-]=$b64_map[+] [_]=$b64_map[/] - # also adding = in the map while i'm at it - [=]=$( printf %06d $(( [##2] 0 )) ) - ) - - local bits hexstring - local -i bitlength=8 - for j in {0..${#DIRENV_WATCHES}}; do - bits+=${b64_map[${DIRENV_WATCHES:$j:1}]} - if [[ ${#bits} -ge $bitlength ]]; then - hexstring+="\x${(Ll:2::0:)$(( [##16] 2#${bits:0:$bitlength} ))}" - bits=${bits:$bitlength} + for char in $b64chars[@]; do b64_map+=( ${char} $( printf %06d $(( [##2] $i )) ) ); i+=1; done + b64_map+=( [-]=$b64_map[+] [_]=$b64_map[/] [=]=$b64_map[A] ) + + local bits + local hexstring='\x1f\x8b\x08\x00\x00\x00\x00\x00' + local -i bitlen=8 + for j in {0..${#watches}}; do + bits+=${b64_map[${watches:$j:1}]} + if [[ ${#bits} -ge $bitlen ]]; then + hexstring+="\x${(Ll:2::0:)$(( [##16] 2#${bits:0:$bitlen} ))}"; bits=${bits:$bitlen} fi done - local lead_bits='\x1f\x8b\x08\x00\x00\x00\x00\x00' local -a apps=( 'zcat' 'gzcat' 'gzip' '-cd' 'gunzip' '-c' 'uncompress' '-c' ) - + local pat='[\[]*[\]]' for app in $apps; do (( $+commands[$app] )) || continue; - local unpacked=$( echo "${lead_bits}${hexstring}" | "$app" ${${apps[((${apps[(i)$app]}+1))]}:#[^-]*} -- 2>/dev/null ) - [[ -n $unpacked ]] && break + local unpacked=$( echo "${hexstring}" | "$app" ${${apps[((${apps[(i)$app]}+1))]}:#[^-]*} -- 2>/dev/null ) + [[ -n $unpacked ]] && [[ -z ${unpacked:#${~pat}} ]] && break done setopt localoptions extendedglob + local -a elements + elements=( "${=${unpacked:1:-1}//,\{/ {}" ) - local -A element - local sep - sep='},' - local -a data_array=( "${(ps:$sep:)${unpacked#(*)[^\{]}}" ) - sep='}\n' - local data=${(pj:$sep:)data_array:#(*)($envrc|${deps[1]})(*)} - local stats - - while [[ $#data -gt 1 ]]; do + for obj in $elements[@]; do (){ local field local -A found - - data=${${data//$'\r'}##[[:space:]]#} + data=${${obj//$'\r'}##[[:space:]]#} [[ $data == '{'* ]] || return data[1]= @@ -116,7 +78,8 @@ if [[ $sig == ${_z4h_direnv_sig-} ]]; then [[ -n $s ]] || return [[ $s != *($'\n'|'\')* ]] || return found[$field]=${(Q)s} - (( $#found == 2 )) && break + [[ ${(k)found} == 'Path' ]] && break + # (( $#found == 2 )) && break fi ;; ',') data[1]=; field=;; @@ -128,26 +91,32 @@ if [[ $sig == ${_z4h_direnv_sig-} ]]; then *) return 1;; esac done - element=( ${(kv)found[@]} ) - } - - zstat -A stats +mtime $element[Path] 2>/dev/null - - if [[ ${stats:=0} != $element[Modtime] ]]; then - watch_files_changed="$element[Path] $element[Modtime] $stats"; break - fi - - data=${data##([^\{]|\\?)#} - unset stats - + watched+=( ${(v)found} ) + } done unsetopt localoptions extendedglob } - - [[ -z $watch_files_changed ]] && return + fi + [[ $envrc == "${(@)watched[1]}" ]] + deps=( ${(@)watched} ${(@)deps} ) + local files=($^deps(N)) + local non_files=(${deps:|files}) + local -a stat + if zstat -A stat +mtime -- $files 2>/dev/null; then + local sig=$envrc$'\0'${(pj:\0:)stat} + else + local sig=stat-error + fi +elif [[ ! -v DIRENV_WATCHES ]]; then + typeset -g _z4h_direnv_sig=none + return +else + local sig=none fi -unset _z4h_direnv_sig _z4h_direnv_watches +[[ $sig == ${_z4h_direnv_sig-} ]] && return + +unset _z4h_direnv_sig local data data=$( @@ -182,4 +151,3 @@ fi builtin eval -- $out typeset -g _z4h_direnv_sig=$sig -typeset -g _z4h_direnv_watches=$DIRENV_WATCHES From 42476d2008617dd9fecf8783672a7c189c68f813 Mon Sep 17 00:00:00 2001 From: Mork Date: Thu, 16 Jun 2022 13:57:34 +0800 Subject: [PATCH 3/5] using new implentation if -z4h decode and zcat --- fn/-z4h-base64-decode | 38 ++++++++++++++++++++++ fn/-z4h-direnv-hook | 75 +++++++++++++++---------------------------- fn/-z4h-zcat | 11 +++++++ 3 files changed, 74 insertions(+), 50 deletions(-) create mode 100644 fn/-z4h-base64-decode create mode 100644 fn/-z4h-zcat diff --git a/fn/-z4h-base64-decode b/fn/-z4h-base64-decode new file mode 100644 index 0000000..aa4d4bd --- /dev/null +++ b/fn/-z4h-base64-decode @@ -0,0 +1,38 @@ +#!/usr/bin/env zsh + +eval "$_z4h_opt" + +setopt cbases + +typeset -g REPLY= + +[[ -z $1 ]] && return +(( $#1 % 4 == 0 )) || return 1 + +local table='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' + +local c1 c2 c3 c4 res +local -i16 b1 b2 b3 b4 + +for c1 c2 c3 c4 in ${(s::)1//=/A}; do + (( + b1 = $table[(ie)$c1] - 1, + b2 = $table[(ie)$c2] - 1, + b3 = $table[(ie)$c3] - 1, + b4 = $table[(ie)$c4] - 1, + b1 = b1 << 2 | b2 >> 4, + b2 = (b2 << 4) & 255 | b3 >> 2, + b3 = (b3 << 6) & 255 | b4 + )) + res+=($b1 $b2 $b3) +done + +if [[ $1 == *= ]]; then + if [[ $1 == *== ]]; then + res[-2,-1]=() + else + res[-1]=() + fi +fi + +printf -v REPLY ${(j:\:)res#0} diff --git a/fn/-z4h-direnv-hook b/fn/-z4h-direnv-hook index 9bf7e39..60937e8 100644 --- a/fn/-z4h-direnv-hook +++ b/fn/-z4h-direnv-hook @@ -14,45 +14,14 @@ else fi fi -# { print -n '\x1f\x8b\x08\x00\x00\x00\x00\x00'; base64 -d <<<${${DIRENV_WATCHES//-/+}//_//} } | zcat 2>/dev/null - -# zcat # gzcat # uncompress -c # gunzip -c # gzip -cd - -local sig +local -a deps local envrc=(./(../)#.envrc(NY1:a)) + if (( $#envrc )); then - local -a deps=( + deps+=( ${XDG_DATA_HOME:-~/.local/share}/direnv/allow - ${XDG_CONFIG_HOME:-~/.config}/{,direnv/}{direnv.toml,config.toml,direnvrc} - ) - if [[ -v DIRENV_WATCHES ]]; then - local watches=$DIRENV_WATCHES - local -a watched - (){ - typeset -A b64_map - local -i i=0 - local -a b64chars=({A..Z} {a..z} {0..9} + /) - - for char in $b64chars[@]; do b64_map+=( ${char} $( printf %06d $(( [##2] $i )) ) ); i+=1; done - b64_map+=( [-]=$b64_map[+] [_]=$b64_map[/] [=]=$b64_map[A] ) - - local bits - local hexstring='\x1f\x8b\x08\x00\x00\x00\x00\x00' - local -i bitlen=8 - for j in {0..${#watches}}; do - bits+=${b64_map[${watches:$j:1}]} - if [[ ${#bits} -ge $bitlen ]]; then - hexstring+="\x${(Ll:2::0:)$(( [##16] 2#${bits:0:$bitlen} ))}"; bits=${bits:$bitlen} - fi - done - - local -a apps=( 'zcat' 'gzcat' 'gzip' '-cd' 'gunzip' '-c' 'uncompress' '-c' ) - local pat='[\[]*[\]]' - for app in $apps; do - (( $+commands[$app] )) || continue; - local unpacked=$( echo "${hexstring}" | "$app" ${${apps[((${apps[(i)$app]}+1))]}:#[^-]*} -- 2>/dev/null ) - [[ -n $unpacked ]] && [[ -z ${unpacked:#${~pat}} ]] && break - done + ${XDG_CONFIG_HOME:-~/.config}/{,direnv/}{direnv.toml,config.toml,direnvrc}) +fi setopt localoptions extendedglob local -a elements @@ -95,23 +64,30 @@ if (( $#envrc )); then } done unsetopt localoptions extendedglob +if [[ -v DIRENV_WATCHES ]]; then + () { + local REPLY json + -z4h-base64-decode ${${DIRENV_WATCHES//-/+}//_//} || return + json=$(printf '\x1f\x8b\x08\x00\x00\x00\x00\x00%s' $REPLY | -z4h-zcat 2>/dev/null) || return + [[ $json == '['*']' ]] || return + # TODO: extract $(jq '.[] | .Path') from $json and append it to deps. + # TODO: cache those elements with $DIRENV_WATCHES as the key. } - fi - [[ $envrc == "${(@)watched[1]}" ]] - deps=( ${(@)watched} ${(@)deps} ) - local files=($^deps(N)) - local non_files=(${deps:|files}) - local -a stat - if zstat -A stat +mtime -- $files 2>/dev/null; then - local sig=$envrc$'\0'${(pj:\0:)stat} - else - local sig=stat-error - fi -elif [[ ! -v DIRENV_WATCHES ]]; then + # TODO: handle errors from the above intelligently. +fi + +if (( $#envrc + $#deps == 0 )); then typeset -g _z4h_direnv_sig=none return +fi + +local -a stat +local files=($^deps(N)) +local non_files=(${deps:|files}) +if zstat -A stat +mtime -- $envrc $files 2>/dev/null; then + local sig=$envrc$'\0'${(pj:\0:)stat} else - local sig=none + local sig=stat-error fi [[ $sig == ${_z4h_direnv_sig-} ]] && return @@ -148,6 +124,5 @@ if [[ ! -v __p9k_trapped ]]; then builtin trap : INT builtin trap "builtin trap ${(q)__p9k_trapint:--} INT" EXIT fi - builtin eval -- $out typeset -g _z4h_direnv_sig=$sig diff --git a/fn/-z4h-zcat b/fn/-z4h-zcat new file mode 100644 index 0000000..106bd5e --- /dev/null +++ b/fn/-z4h-zcat @@ -0,0 +1,11 @@ +#!/usr/bin/env zsh + +eval "$_z4h_opt" + +local cmd +for cmd in zcat gzcat 'uncompress -c' 'gunzip -c' 'gzip -cd'; do + local words=($=cmd) + [[ -v commands[$words[1]] ]] || continue + $words || return + break +done From 64cf5bb044a4c1ed2754fc02bf7bfdf5c008b812 Mon Sep 17 00:00:00 2001 From: Mork Date: Thu, 16 Jun 2022 19:16:49 +0800 Subject: [PATCH 4/5] patched in json parsing so direnv_watches works again for now --- fn/-z4h-direnv-hook | 62 ++++++++++----------------------- fn/-z4h-json-parse | 85 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 43 deletions(-) create mode 100644 fn/-z4h-json-parse diff --git a/fn/-z4h-direnv-hook b/fn/-z4h-direnv-hook index 60937e8..b81ac93 100644 --- a/fn/-z4h-direnv-hook +++ b/fn/-z4h-direnv-hook @@ -1,5 +1,4 @@ #!/usr/bin/env zsh - eval "$_z4h_opt" unset _z4h_direnv_err @@ -23,54 +22,31 @@ if (( $#envrc )); then ${XDG_CONFIG_HOME:-~/.config}/{,direnv/}{direnv.toml,config.toml,direnvrc}) fi - setopt localoptions extendedglob - local -a elements - elements=( "${=${unpacked:1:-1}//,\{/ {}" ) - - for obj in $elements[@]; do - (){ - local field - local -A found - data=${${obj//$'\r'}##[[:space:]]#} - - [[ $data == '{'* ]] || return - data[1]= - while true; do - data=${data##[[:space:]]#} - [[ -n $data ]] || return - case $data[1] in - ':') local tail=${data##([^,\\]|\\?)#} - local s=${data:1:-$#tail} - data=$tail - if [[ $field == (Path|Modtime) ]]; then - (( ! $+found[$field] )) || return - [[ -n $s ]] || return - [[ $s != *($'\n'|'\')* ]] || return - found[$field]=${(Q)s} - [[ ${(k)found} == 'Path' ]] && break - # (( $#found == 2 )) && break - fi - ;; - ',') data[1]=; field=;; - '"') local tail=${data##\"([^\"\\]|\\?)#} - local s=${data:1:-$#tail} - data=${tail:1} - [[ -z $field ]] && field=${s:-x} - ;; - *) return 1;; - esac - done - watched+=( ${(v)found} ) - } - done - unsetopt localoptions extendedglob if [[ -v DIRENV_WATCHES ]]; then () { local REPLY json -z4h-base64-decode ${${DIRENV_WATCHES//-/+}//_//} || return - json=$(printf '\x1f\x8b\x08\x00\x00\x00\x00\x00%s' $REPLY | -z4h-zcat 2>/dev/null) || return + json=$(printf '\x1f\x8b\x08\x00\x00\x00\x00\x00%s' $REPLY | -z4h-zcat 2>/dev/null) #|| return [[ $json == '['*']' ]] || return # TODO: extract $(jq '.[] | .Path') from $json and append it to deps. + + local -i i=1; + local pathmatch; + pathmatch=${(*MSI:$i:)json##\"Path\"\:\"([^\"])#\"} + while [[ -n $pathmatch ]]; do + deps+=${(Q)${(ps+:+)pathmatch}[2]} + ((i++)) + pathmatch=${(*MSI:$i:)json##\"Path\"\:\"([^\"])#\"} + done + + # setopt localoptions noxtrace + + # jsons=( $( -z4h-json-parse $json ) ) + + # for object in $jsons; do + # deps+=$( -z4h-json-parse $object Path ) + # done + # TODO: cache those elements with $DIRENV_WATCHES as the key. } # TODO: handle errors from the above intelligently. diff --git a/fn/-z4h-json-parse b/fn/-z4h-json-parse new file mode 100644 index 0000000..5569a42 --- /dev/null +++ b/fn/-z4h-json-parse @@ -0,0 +1,85 @@ +#!/usr/bin/env zsh +# Redneck json parsing. Yields correct results for any well-formed json document. +# Produces random garbage for invalid json. + +local data +local -a params + +data=$1; shift; params=( $@ ); + +data="${${data//$'\r'}##[[:space:]]#}" +[[ $data == ('{'|'[')* ]] || return +if [[ $data == '['*']' ]] +then + local arrayitem='' + local -a arraycontents + local -i depth=1 + data[1]= + while (( depth > 0 )) + do + data=${data##[[:space:]]#} + [[ -n $data ]] || return + case $data[1] in + '{'|'[') arrayitem+=$data[1]; data[1]=; (( ++depth )) ;; + '}'|']') arrayitem+=$data[1]; data[1]= + (( --depth == 1 )) && { arraycontents+=($arrayitem); arrayitem='' } ;; + ',') (( depth == 1 )) || arrayitem+=$data[1]; + data[1]= ;; + ':') arrayitem+=$data[1] data[1]= ;; + '"'|[[:alnum:].]) + if [[ $data[1] == '"' ]]; then + local tail=${data##\"([^\"\\]|\\?)#\"} + else + local tail=${data##[[:alnum:].]#} + fi + [[ $tail == [[:space:][:punct:]]* ]] || return + arrayitem+=${data::-$#tail}; data=${tail} + ;; + *) return 1 ;; + esac + done + (( ${#data##[[:space:]]#} == 0 )) || return + echo $arraycontents + +elif [[ $data == '{'*'}' ]] +then + local field + local -A found + local -i depth=1 + data[1]= + while (( depth > 0 )) + do + data=${data##[[:space:]]#} + [[ -n $data ]] || return + case $data[1] in + '{'|'[') data[1]=; (( ++depth )) ;; + '}'|']') data[1]=; (( --depth > 0 )) || return ;; + ':') data[1]= ;; + ',') data[1]=; field= ;; + '"'|[[:alnum:].]) + if [[ $data[1] == '"' ]]; then + local tail=${data##\"([^\"\\]|\\?)#\"} + else + local tail=${data##[[:alnum:].]#} + fi + [[ $tail == [[:space:][:punct:]]* ]] || return + local s=${data::-$#tail} + data=${tail} + (( depth == 1 )) || continue + if [[ -z $field ]]; then + field=${s:-x} + elif [[ $field:*params ]] + then + (( ! $+found[$field] )) || return + [[ -n $s ]] || return + [[ $s != *($'\n'|'\')* ]] || return + found[$field]=$s + (( $#found == $#params )) && break + fi + ;; + *) return 1 ;; + esac + done + echo ${(Q)found} +fi + From ae6617001ac3368e2963ae6d496078c4df733d78 Mon Sep 17 00:00:00 2001 From: Mork Date: Thu, 16 Jun 2022 19:16:49 +0800 Subject: [PATCH 5/5] patched in json parsing so direnv_watches works again for now --- fn/-z4h-direnv-hook | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/fn/-z4h-direnv-hook b/fn/-z4h-direnv-hook index b81ac93..518c263 100644 --- a/fn/-z4h-direnv-hook +++ b/fn/-z4h-direnv-hook @@ -31,22 +31,14 @@ if [[ -v DIRENV_WATCHES ]]; then # TODO: extract $(jq '.[] | .Path') from $json and append it to deps. local -i i=1; + local pattern=${:-\"Path\":\"([^\"\\\\]|\\\\?)#\"} local pathmatch; - pathmatch=${(*MSI:$i:)json##\"Path\"\:\"([^\"])#\"} + pathmatch=${(*MSI:$i:)json##${~pattern}} while [[ -n $pathmatch ]]; do - deps+=${(Q)${(ps+:+)pathmatch}[2]} - ((i++)) - pathmatch=${(*MSI:$i:)json##\"Path\"\:\"([^\"])#\"} + deps+=${(Q)pathmatch##(*):} + pathmatch=${(*MSI:$((++i)):)json##${~pattern}} done - # setopt localoptions noxtrace - - # jsons=( $( -z4h-json-parse $json ) ) - - # for object in $jsons; do - # deps+=$( -z4h-json-parse $object Path ) - # done - # TODO: cache those elements with $DIRENV_WATCHES as the key. } # TODO: handle errors from the above intelligently.