From 061b6d14a257bbee3fb920a41d8d539ef8bf667e Mon Sep 17 00:00:00 2001 From: sdomi Date: Tue, 4 Mar 2025 01:52:19 +0100 Subject: [PATCH 1/5] notORM: fix yeet regression + better non-greedy match --- src/notORM.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/notORM.sh b/src/notORM.sh index 81a0bcd..828e8c8 100755 --- a/src/notORM.sh +++ b/src/notORM.sh @@ -70,17 +70,17 @@ alias _data_parse_pairs=' _data_gen_expr() { # we need the pairs sorted due to how the sed expr generation works local IFS=$'\01\n' - local i + local i sorted sorted=($(for (( i=0; i<${#search[@]}; i++ )); do echo "${column[i]}"$'\01'"${search[i]}" done | sort -n -t$'\01')) local last=0 for (( i=0; i<${#sorted[@]}; i=i+2 )); do - if [[ $((sorted[i] - last)) -le 1 ]]; then + if [[ $((sorted[i] - last)) -le 1 && $i != 0 ]]; then expr+="$(_sed_sanitize "${sorted[i+1]}")${delim}" else - expr+="$(repeat $((sorted[i] - last)) ".*$delim")$(_sed_sanitize "${sorted[i+1]}")${delim}" + expr+="$(repeat $((sorted[i] - last)) "[^${delim}]*${delim}")$(_sed_sanitize "${sorted[i+1]}")${delim}" fi last="${sorted[i]}" done From c22ee9b245bf89619df5843f1a9c6833d10b18b5 Mon Sep 17 00:00:00 2001 From: sdomi Date: Tue, 4 Mar 2025 02:30:14 +0100 Subject: [PATCH 2/5] tests: fixup the header test --- tests/01-http-basic.sh | 50 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/tests/01-http-basic.sh b/tests/01-http-basic.sh index 04722bf..e769f43 100644 --- a/tests/01-http-basic.sh +++ b/tests/01-http-basic.sh @@ -60,7 +60,39 @@ EOF match="nyaa" } -server_res_header() { +server_patch_dummy() { + prepare() { + cat <<"EOF" > app/webroot/meow.shs +#!/bin/bash +echo "${r[method]}" +EOF + } + + tst() { + curl -s "localhost:1337/meow.shs" -X PATCH + } + + match="PATCH" +} + +server_put_dummy() { + tst() { + curl -s "localhost:1337/meow.shs" -X PUT + } + + match="PUT" +} + +server_delete_dummy() { + tst() { + curl -s "localhost:1337/meow.shs" -X DELETE + } + + match="DELETE" +} + +server_head() { + # known to fail; TODO for another day tst() { curl -s -I localhost:1337 } @@ -68,6 +100,14 @@ server_res_header() { match_sub="HTTP.sh" } +server_res_header() { + tst() { + curl -s -v localhost:1337 2>&1 + } + + match_sub="HTTP.sh" +} + server_res_header_custom() { prepare() { cat <<"EOF" > app/webroot/meow.shs @@ -162,6 +202,14 @@ subtest_list=( server_get_param server_post_param + # currently functionally equivalent + server_patch_dummy + server_put_dummy + server_delete_dummy + + ## currently broken, TODO + # server_head + server_res_header server_res_header_custom From 19039683bb4071361c5ad7197353b02052b5d13b Mon Sep 17 00:00:00 2001 From: sdomi Date: Tue, 4 Mar 2025 02:30:44 +0100 Subject: [PATCH 3/5] tests: correct typo in notORM replace-oldsyntax test --- tests/04-notORM.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/04-notORM.sh b/tests/04-notORM.sh index 995f6ba..afde06d 100644 --- a/tests/04-notORM.sh +++ b/tests/04-notORM.sh @@ -83,7 +83,7 @@ notORM_replace_oldsyntax() { data_get "$store" { } out out[2]='meow!' data_replace "$store" 4 out 1 || return $? - data_get "$store" 4 || return $? + data_get "$store" 4 1 || return $? [[ "${res[@]}" == "${out[@]}" ]] && return 0 || return 1 } } From 533c49e67048fb7c6e0b06030ffa014e1f2bec90 Mon Sep 17 00:00:00 2001 From: sdomi Date: Tue, 4 Mar 2025 02:34:02 +0100 Subject: [PATCH 4/5] notORM: migrate to safer delimeter matching everywhere --- src/notORM.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/notORM.sh b/src/notORM.sh index 828e8c8..0adf36e 100755 --- a/src/notORM.sh +++ b/src/notORM.sh @@ -238,7 +238,7 @@ data_replace_value() { if [[ $column == 0 ]]; then local expr="s$ctrl^$(_sed_sanitize "$2")\(${delim}.*\)$ctrl$(_sed_sanitize "$3")\1$ctrl" else - local expr="s$ctrl^\($(repeat $column ".*$delim")\)$(_sed_sanitize "$2")\($delim$(repeat $(( $(cat "${1}.cols") - column - 1 )) ".*$delim")\)"'$'"$ctrl\1$(_sed_sanitize "$3")\2$ctrl" + local expr="s$ctrl^\($(repeat $column "[^${delim}]*${delim}")\)$(_sed_sanitize "$2")\($delim$(repeat $(( $(cat "${1}.cols") - column - 1 )) "[^${delim}]*${delim}")\)"'$'"$ctrl\1$(_sed_sanitize "$3")\2$ctrl" fi sed -i "$expr" "$1" @@ -273,7 +273,7 @@ data_replace() { if [[ $column == 0 ]]; then local expr="s$ctrl^$(_sed_sanitize "$2")${delim}.*$ctrl" else - local expr="s$ctrl^$(repeat $column ".*$delim")$(_sed_sanitize "$2")$delim$(repeat $(( $(cat "${store}.cols") - column - 1 )) ".*$delim")"'$'"$ctrl" + local expr="s$ctrl^$(repeat $column "[^${delim}]*${delim}")$(_sed_sanitize "$2")$delim$(repeat $(( $(cat "${store}.cols") - column - 1 )) "[^${delim}]*${delim}")"'$'"$ctrl" fi # fi @@ -310,7 +310,7 @@ data_yeet() { if [[ $column == 0 ]]; then local expr="/^$(_sed_sanitize "$2")${delim}.*/d" else - local expr="/^$(repeat $column ".*$delim")$(_sed_sanitize "$2")$delim$(repeat $(( $(cat "${store}.cols") - column - 1 )) ".*$delim")"'$'"/d" + local expr="/^$(repeat $column "[^${delim}]*${delim}")$(_sed_sanitize "$2")$delim$(repeat $(( $(cat "${store}.cols") - column - 1 )) "[^${delim}]*${delim}")"'$'"/d" fi fi From 7c9ae72db44e8195f42e9230e6c141719605d43e Mon Sep 17 00:00:00 2001 From: sdomi Date: Tue, 4 Mar 2025 02:36:06 +0100 Subject: [PATCH 5/5] tst: small QoL invocation fixes --- tst.sh | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/tst.sh b/tst.sh index bb50350..52d8171 100755 --- a/tst.sh +++ b/tst.sh @@ -1,4 +1,10 @@ #!/usr/bin/env bash +trap ctrl_c INT +ctrl_c() { + pkill -P $$ + echo -e "Interrupted and cleaned up." + return 255 +} _defaults() { match="" @@ -52,6 +58,7 @@ on_fatal() { IFS=$'\n' for i in "$@"; do if [[ ! -f "$i" ]]; then + echo "ENOENT: $i" echo -e "$0 - basic test framework\n\nusage: $0 [test] [...]" exit 1 fi @@ -116,10 +123,12 @@ _final_cleanup() { for i in $(jobs -p); do pkill -P $i done - sleep 2 - for i in $(jobs -p); do - pkill -9 -P $i - done + if [[ "$(jobs -p)" != '' ]]; then + sleep 1 + for i in $(jobs -p); do + pkill -9 -P $i + done + fi pkill -P $$ }