18 Commits

Author SHA1 Message Date
Thomas Levine
40950a0b52 add -- after readlink 2016-02-27 19:10:28 +00:00
Thomas Levine
dc53523deb fix / detection 2016-02-27 18:41:57 +00:00
Thomas Levine
a797fc2c8b typo 2016-02-27 18:31:41 +00:00
Thomas Levine
e07b340906 Automatic commit with j 2016-02-27 18:26:14 +00:00
Thomas Levine
a4a0aabbef cleaner comment 2016-02-27 18:13:12 +00:00
Thomas Levine
f4d3ffa0e4 Automatic commit with j 2016-02-27 18:12:33 +00:00
Thomas Levine
28832f22a1 check hidden files better 2016-02-27 18:09:40 +00:00
Thomas Levine
f5ef61633e better check 2016-02-27 18:06:19 +00:00
Thomas Levine
2836d4b9a9 woo 2016-02-27 17:53:15 +00:00
Thomas Levine
972fe6bc35 aoeu 2016-02-27 17:51:14 +00:00
Thomas Levine
633d6d32c9 better than main 2016-02-27 17:44:35 +00:00
Thomas Levine
b9d72aef72 remove debug statements 2016-02-27 17:41:37 +00:00
Thomas Levine
92cec52c97 main function 2016-02-27 17:33:46 +00:00
Thomas Levine
b9a067c68e make the .urhin directory 2016-02-27 17:14:32 +00:00
Thomas Levine
e9d6b73dbd urchin_root 2016-02-27 17:13:55 +00:00
Thomas Levine
b8bd097f5c Automatic commit with j 2016-02-27 16:59:47 +00:00
Thomas Levine
f83df14868 set +e 2016-02-27 16:56:44 +00:00
Thomas Levine
fdc7129921 urchin root 2016-02-27 16:53:27 +00:00
4 changed files with 96 additions and 76 deletions

2
tests/.urchin/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*
!.gitignore

View File

@@ -1,3 +1,2 @@
#!/bin/sh #!/bin/sh
#!/bin/sh
../../urchin --root .testsuite/a/b/c/testcase ../../urchin --root .testsuite/a/b/c/testcase

4
tests/get_stdout_file/t Executable file
View File

@@ -0,0 +1,4 @@
#!/bin/sh
I_AM_SOURCING_URCHIN_IN_A_TEST=true . ../../urchin
test $(get_stdout_file t) = aoeu

85
urchin
View File

@@ -7,8 +7,7 @@
# No part of urchin, including this file, may be copied, modified, propagated, # No part of urchin, including this file, may be copied, modified, propagated,
# or distributed except according to the terms contained in the COPYING file. # or distributed except according to the terms contained in the COPYING file.
# Stop on error. set +e
set -e
# Make sure that CDPATH isn't set, as it causes `cd` to behave unpredictably - # Make sure that CDPATH isn't set, as it causes `cd` to behave unpredictably -
# notably, it can produce output, which breaks fullpath(). # notably, it can produce output, which breaks fullpath().
@@ -19,24 +18,15 @@ VERSION=0.0.6
urchin_root() { urchin_root() {
# Call recursively but remember the original argument. # Call recursively but remember the original argument.
current="$1" current="$(remove_trailing_slash "$1")"
if test -n "$2"; then if test -n "$2"; then
orig="$2" orig="$2"
else else
orig="$1" orig="$1"
fi fi
( if test "$(readlink -f -- "$1")" = /; then
set -e # Stop traversing upwards at /
if ! test -e "$current"; then
echo "$current: No such file or directory">&2
exit 1
elif test -f "$current"; then
urchin_root "$(dirname "$current")" "$orig"
elif test -d "$current"/.urchin; then
echo "$current"
elif test "$(readlink -f "$current")" = /; then
if test -d "$orig"; then if test -d "$orig"; then
origdir="$orig" origdir="$orig"
else else
@@ -45,12 +35,23 @@ urchin_root() {
echo "You need to create the .urchin directory in the root of your tests, echo "You need to create the .urchin directory in the root of your tests,
maybe like this: maybe like this:
mkdir '$origdir/.urchin' mkdir '$(readlink -f -- "$(remove_trailing_slash "$origdir")")/.urchin'
" >&2 " >&2
return 1
elif ! test -e "$current"; then
echo "$current: No such file or directory">&2
return 1
elif test -f "$current"; then
urchin_root "$(dirname "$current")" "$orig"
elif test -d "$current"/.urchin; then
remove_trailing_slash "$current"
elif test "$current" != . && test "$current" != .. &&
echo "$current" | grep '^\.' && > /dev/null; then
# Stop traversing upwards at hidden directories.
urchin_root / "$orig"
else else
urchin_root "$current"/.. "$orig" urchin_root "$current"/.. "$orig"
fi fi
)
} }
indent() { indent() {
@@ -60,13 +61,17 @@ indent() {
fi fi
} }
remove_trailing_slash() {
echo "$1" | sed s/\\/$//
}
escape_slashes() { escape_slashes() {
echo "$1" | sed s+/+\\\\/+g echo "$1" | sed s+/+\\\\/+g
} }
get_stdout_file() { get_stdout_file() {
root="$(readlink -f "$(urchin_root "$1")")" root="$(readlink -f -- "$(urchin_root "$1")")"
test_file="$(readlink -f "$1")" test_file="$(readlink -f -- "$1")"
eroot="$(escape_slashes "$root")" eroot="$(escape_slashes "$root")"
base="$(echo "$test_file" | sed "s/^$eroot/$eroot\/.urchin/")" base="$(echo "$test_file" | sed "s/^$eroot/$eroot\/.urchin/")"
if test -d "$1"; then if test -d "$1"; then
@@ -81,6 +86,7 @@ recurse() {
indent_level="$2" indent_level="$2"
shell_for_sh_tests="$3" shell_for_sh_tests="$3"
[ "$potential_test" = '.urchin' ] && return
[ "$potential_test" = 'setup_dir' ] && return [ "$potential_test" = 'setup_dir' ] && return
[ "$potential_test" = 'teardown_dir' ] && return [ "$potential_test" = 'teardown_dir' ] && return
[ "$potential_test" = 'setup' ] && return [ "$potential_test" = 'setup' ] && return
@@ -116,8 +122,10 @@ recurse() {
[ -f setup ] && [ -x setup ] && ./setup >> "$stdout_file" [ -f setup ] && [ -x setup ] && ./setup >> "$stdout_file"
# $2 instead of $indent_level so it doesn't clash # $2 instead of $indent_level so it doesn't clash
set +e
recurse "${test}" "$(( $2 + 1 ))" "$shell_for_sh_tests" recurse "${test}" "$(( $2 + 1 ))" "$shell_for_sh_tests"
exit_code=$? exit_code=$?
set -e
if $exit_on_fail && test $exit_code -ne 0; then if $exit_on_fail && test $exit_code -ne 0; then
[ -f teardown ] && [ -x teardown ] && ./teardown >> "$stdout_file" [ -f teardown ] && [ -x teardown ] && ./teardown >> "$stdout_file"
@@ -279,7 +287,10 @@ urchin_go() {
TEST_SHELL='/bin/sh' TEST_SHELL='/bin/sh'
fi fi
recurse "$1" 0 "$2" # test folder -- indentation level -- [shell to invoke test scripts with] # 1 test folder
# 2 indentation level
# 3 shell to invoke test scripts with
recurse "$1" 0 "$2"
finish=$(date +%s) finish=$(date +%s)
elapsed=$(($finish - $start)) elapsed=$(($finish - $start))
@@ -301,7 +312,7 @@ urchin_go() {
printf '%s\n' "$failed $(plural test "$failed") failed." printf '%s\n' "$failed $(plural test "$failed") failed."
printf '\033[m' printf '\033[m'
fi fi
rm -f "$logfile" # rm -f "$logfile"
test -z "$failed" || test "$failed" -eq '0' test -z "$failed" || test "$failed" -eq '0'
} }
@@ -317,12 +328,13 @@ urchin_molly_guard() {
exit 1 exit 1
} }
shell_for_sh_tests= if test -z "$I_AM_SOURCING_URCHIN_IN_A_TEST"; then
force=false shell_for_sh_tests=
exit_on_fail=false force=false
tap_format=false exit_on_fail=false
while [ $# -gt 0 ] tap_format=false
do while [ $# -gt 0 ]
do
case "$1" in case "$1" in
-e) exit_on_fail=true;; -e) exit_on_fail=true;;
-f) force=true;; -f) force=true;;
@@ -348,22 +360,25 @@ do
*) break;; *) break;;
esac esac
shift shift
done done
# Verify argument for main stuff # Verify argument for main stuff
if [ "$#" != '1' ] || [ ! -d "$1" ] if [ "$#" != '1' ] || [ ! -d "$1" ]
then then
[ -n "$1" ] && [ ! -d "$1" ] && echo "Not a directory: '$1'" >&2 [ -n "$1" ] && [ ! -d "$1" ] && echo "Not a directory: '$1'" >&2
echo "$USAGE" >&2 echo "$USAGE" >&2
exit 11 exit 11
fi fi
# Run or present the Molly guard. # Run or present the Molly guard.
if dirname "$(readlink -f "$(urchin_root "$1")")" | if ! urchin_root "$1" > /dev/null; then
exit 1
elif basename "$(readlink -f -- "$(urchin_root "$1")")" |
grep -Fi 'test' > /dev/null || $force; then grep -Fi 'test' > /dev/null || $force; then
logfile="$(readlink -f "$(urchin_root "$1")/.urchin/.log")" logfile="$(readlink -f -- "$(urchin_root "$1")/.urchin/.log")"
echo > "$logfile" printf '' > "$logfile"
urchin_go "$1" "$shell_for_sh_tests" urchin_go "$1" "$shell_for_sh_tests"
else else
urchin_molly_guard urchin_molly_guard
fi
fi fi