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 109 additions and 96 deletions

View File

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

View File

@@ -1,8 +1,2 @@
#!/bin/sh
set -e
tmp=$(mktemp -d)
../../urchin --root $tmp 2>&1 | grep suppress
../../urchin --root $tmp 2>&1 | grep "'$tmp/.urchin'"
../../urchin --root $tmp
rm -R "$tmp"
../../urchin --root /bin 2>&1 | grep "'/bin/.urchin'"

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

192
urchin
View File

@@ -7,8 +7,7 @@
# No part of urchin, including this file, may be copied, modified, propagated,
# 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 -
# notably, it can produce output, which breaks fullpath().
@@ -19,32 +18,37 @@ VERSION=0.0.6
urchin_root() {
# Call recursively but remember the original argument.
current="$1"
current="$(remove_trailing_slash "$1")"
if test -n "$2"; then
orig="$2"
else
orig="$1"
fi
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 "$(readlink -f -- "$1")" = /; then
# Stop traversing upwards at /
if test -d "$orig"; then
origdir="$orig"
else
origdir=$(dirname "$orig")
fi
echo "You must create a .urchin directory to specify the urchin root.
Run something like this, and then run urchin again.
echo "You need to create the .urchin directory in the root of your tests,
maybe like this:
mkdir '$origdir/.urchin'
mkdir '$(readlink -f -- "$(remove_trailing_slash "$origdir")")/.urchin'
" >&2
exit 1
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
urchin_root "$current"/.. "$orig"
fi
@@ -57,13 +61,17 @@ indent() {
fi
}
remove_trailing_slash() {
echo "$1" | sed s/\\/$//
}
escape_slashes() {
echo "$1" | sed s+/+\\\\/+g
}
get_stdout_file() {
root="$(readlink -f "$1")"
test_file="$(readlink -f "$2")"
root="$(readlink -f -- "$(urchin_root "$1")")"
test_file="$(readlink -f -- "$1")"
eroot="$(escape_slashes "$root")"
base="$(echo "$test_file" | sed "s/^$eroot/$eroot\/.urchin/")"
if test -d "$1"; then
@@ -77,14 +85,14 @@ recurse() {
potential_test="$1"
indent_level="$2"
shell_for_sh_tests="$3"
root="$4"
[ "$potential_test" = '.urchin' ] && return
[ "$potential_test" = 'setup_dir' ] && return
[ "$potential_test" = 'teardown_dir' ] && return
[ "$potential_test" = 'setup' ] && return
[ "$potential_test" = 'teardown' ] && return
stdout_file="$(get_stdout_file "$root" "$potential_test")"
stdout_file="$(get_stdout_file "$potential_test")"
mkdir -p "$(dirname "$stdout_file")"
[ $indent_level -eq 0 ] && : > "$stdout_file"
@@ -114,8 +122,10 @@ recurse() {
[ -f setup ] && [ -x setup ] && ./setup >> "$stdout_file"
# $2 instead of $indent_level so it doesn't clash
recurse "${test}" "$(( $2 + 1 ))" "$shell_for_sh_tests" "$root"
set +e
recurse "${test}" "$(( $2 + 1 ))" "$shell_for_sh_tests"
exit_code=$?
set -e
if $exit_on_fail && test $exit_code -ne 0; then
[ -f teardown ] && [ -x teardown ] && ./teardown >> "$stdout_file"
@@ -257,66 +267,7 @@ plural () {
fi
}
urchin_molly_guard() {
{
echo
echo 'The name of the directory on which you are running urchin'
echo 'does not contain the word "test", so I am not running,'
echo 'in case that was an accident. Use the -f flag if you really'
echo 'want to run urchin on that directory.'
echo
} >&2
exit 1
}
shell_for_sh_tests=
force=false
exit_on_fail=false
tap_format=false
while [ $# -gt 0 ]
do
case "$1" in
-e) exit_on_fail=true;;
-f) force=true;;
-r|--root)
shift
urchin_root "$1"
exit;;
-s)
shift
shell_for_sh_tests=$1
which "$shell_for_sh_tests" > /dev/null || {
echo "Cannot find specified shell: '$shell_for_sh_tests'" >&2
urchin_help >&2
exit 11
} ;;
-t) tap_format=true;;
-h|--help) urchin_help
exit 0;;
-v) echo "$VERSION"
exit;;
-*) urchin_help >&2
exit 1;;
*) break;;
esac
shift
done
# Verify argument for main stuff
if [ "$#" != '1' ] || [ ! -d "$1" ]
then
[ -n "$1" ] && [ ! -d "$1" ] && echo "Not a directory: '$1'" >&2
echo "$USAGE" >&2
exit 11
fi
# Run or present the Molly guard.
root="$(urchin_root "$1")"
if basename "$(readlink -f "$root")" |
grep -Fi 'test' > /dev/null || $force; then
logfile="$(readlink -f "$root")/.urchin/.log"
echo > "$logfile"
urchin_go() {
if "$tap_format"; then
printf \#\
fi
@@ -328,17 +279,18 @@ if basename "$(readlink -f "$root")" |
# - Set it to the shell specified via -s, if any.
# - Otherwise, use its present value, if non-empty.
# - Otherwise, default to '/bin/sh'.
if [ -n "$shell_for_sh_tests" ]; then
TEST_SHELL="$shell_for_sh_tests"
elif [ -z "$TEST_SHELL" ]; then
if [ -n "$2" ]
then
TEST_SHELL="$2"
elif [ -z "$TEST_SHELL" ]
then
TEST_SHELL='/bin/sh'
fi
# 1 test folder
# 2 indentation level
# 3 shell to invoke test scripts with
# 4 urchin root
recurse "$1" 0 "$shell_for_sh_tests" "$root"
recurse "$1" 0 "$2"
finish=$(date +%s)
elapsed=$(($finish - $start))
@@ -360,9 +312,73 @@ if basename "$(readlink -f "$root")" |
printf '%s\n' "$failed $(plural test "$failed") failed."
printf '\033[m'
fi
rm -f "$logfile"
# rm -f "$logfile"
test -z "$failed" || test "$failed" -eq '0'
}
else
urchin_molly_guard
urchin_molly_guard() {
{
echo
echo 'The name of the directory on which you are running urchin'
echo 'does not contain the word "test", so I am not running,'
echo 'in case that was an accident. Use the -f flag if you really'
echo 'want to run urchin on that directory.'
echo
} >&2
exit 1
}
if test -z "$I_AM_SOURCING_URCHIN_IN_A_TEST"; then
shell_for_sh_tests=
force=false
exit_on_fail=false
tap_format=false
while [ $# -gt 0 ]
do
case "$1" in
-e) exit_on_fail=true;;
-f) force=true;;
-r|--root)
shift
urchin_root "$1"
exit;;
-s)
shift
shell_for_sh_tests=$1
which "$shell_for_sh_tests" > /dev/null || {
echo "Cannot find specified shell: '$shell_for_sh_tests'" >&2
urchin_help >&2
exit 11
} ;;
-t) tap_format=true;;
-h|--help) urchin_help
exit 0;;
-v) echo "$VERSION"
exit;;
-*) urchin_help >&2
exit 1;;
*) break;;
esac
shift
done
# Verify argument for main stuff
if [ "$#" != '1' ] || [ ! -d "$1" ]
then
[ -n "$1" ] && [ ! -d "$1" ] && echo "Not a directory: '$1'" >&2
echo "$USAGE" >&2
exit 11
fi
# Run or present the Molly guard.
if ! urchin_root "$1" > /dev/null; then
exit 1
elif basename "$(readlink -f -- "$(urchin_root "$1")")" |
grep -Fi 'test' > /dev/null || $force; then
logfile="$(readlink -f -- "$(urchin_root "$1")/.urchin/.log")"
printf '' > "$logfile"
urchin_go "$1" "$shell_for_sh_tests"
else
urchin_molly_guard
fi
fi