diff --git a/urchin b/urchin index 4b60ba0..2efcea3 100755 --- a/urchin +++ b/urchin @@ -421,15 +421,6 @@ format_urchin() { fi } -# ---------- Temporary directory global variable ---------- -urchin_tmp=$(mktemp_dir) -> "${urchin_tmp}/log" - -urchin_exit() { - rm -Rf "${urchin_tmp}" - exit "$@" -} - # -------------------- Main stuff -------------------- recurse() { requested_path="${1}" @@ -584,90 +575,91 @@ report_outcome() { main() { + # Defaults format=urchin - - while [ "${#}" -gt 0 ] - do - case "${1}" in - -b|--run-in-series) run_in_series=true;; - -e|--exit-on-fail) exit_on_not_ok=true;; - -f|--force) force=true;; - -s|--shell) - shift - shell_for_sh_tests="${1}" - - if ! command -v "${shell_for_sh_tests}" > /dev/null; then - echo "Cannot find specified shell: '${shell_for_sh_tests}'" >&2 - urchin_help >&2 - urchin_exit 13 - fi - - if contains "${potential_test}" "${HT}" "${LF}"; then - echo 'Shell paths may contain all characters other than' >&2 - echo 'horizontal tab (\t) and line feed (\n).' >&2 - urchin_exit 11 - fi - - if contains "${shell_for_sh_tests}" "[${IFS}]"; then - echo "Warning: It is best if field-separator characters -(usually spaces) are absent from shell paths so that -you don't need to quote the TEST_SHELL variable." >&2 - fi - - shell_list="${shell_for_sh_tests}${LF}${shell_list}" - ;; - -F|--format) shift ; format="${1}";; - -T|--timeout) - shift - urchin_timeout="${1}" - if ! contains "${urchin_timeout}" \ - '[0-9][0-9.]*\(s\|m\|h\|d\|\)' ; then - echo Bad timeout argument: "${urchin_timeout}" >&2 - urchin_exit 11 - fi ;; - -p|--pretty) print_in_color=true;; - - -q|--quiet) verbosity=0 ;; - -v) verbosity=2 ;; - -vv) verbosity=3 ;; - -vvv|--verbose) verbosity=4 ;; - -vvvv|--debug) verbosity=5 ;; - - -h|--help) urchin_help - urchin_exit 0;; - - --version) echo "${VERSION}" - urchin_exit;; - -*) urchin_help >&2 - urchin_exit 11;; - *) if contains "${1}" "${HT}" "${LF}"; then - echo 'Test file names may contain all characters other than' >&2 - echo 'horizontal tab (\t) and line feed (\n).' >&2 - urchin_exit 11 - elif [ ! -e "${1}" ]; then - echo "No such file or directory: '${1}'" >&2 - echo "${USAGE}" >&2 - urchin_exit 11 - elif ! { - # Molly guard - root="$(test_suite_root "${1}")" - basename "$(fullpath "${root}")" | - grep -i 'test' > /dev/null || "${force}" - }; then - echo 'The root directory of the tests that you are running urchin on -does not contain the word "test", so I am not running, -in case that was an accident. Use the -f flag if you really -want to run urchin on that directory.' >&2 - urchin_exit 12 - fi - test_seeds="${1}${LF}${test_seeds}" ;; - esac - shift - done if "${RUN_IN_SERIES}" 2> /dev/null; then run_in_series=true fi + # Shift if possible; error otherwise. + flag_arg() { + flag="${1}" + if shift; then + echo "${1}" + else + echo Missing argument for "${flag}" >&2 + exit 11 + fi + } + + # Receive input + while [ "${#}" -gt 0 ]; do + case "${1}" in + -b|--run-in-series) run_in_series=true;; + -e|--exit-on-fail) exit_on_not_ok=true;; + -f|--force) force=true;; + + -F|--format) format="$(flag_arg)" ;; + -p|--pretty) print_in_color=true;; + + -q|--quiet) verbosity=0 ;; + -v) verbosity=2 ;; + -vv) verbosity=3 ;; + -vvv|--verbose) verbosity=4 ;; + -vvvv|--debug) verbosity=5 ;; + + --version) echo "${VERSION}" && exit;; + -h|--help) urchin_help && exit 0;; + + -s|--shell) sh="$(flag_arg)" + if ! command -v "${sh}" > /dev/null; then + echo "Cannot find specified shell: '${sh}'" >&2 + urchin_help >&2 + exit 13 + elif contains "${potential_test}" "${HT}" "${LF}"; then + echo 'Shell paths may contain all characters other than' >&2 + echo 'horizontal tab (\t) and line feed (\n).' >&2 + exit 11 + elif contains "${sh}" "[${IFS}]"; then + echo "Warning: It is best if field-separator characters +(usually spaces) are absent from shell paths so that +you don't need to quote the TEST_SHELL variable." >&2 + fi + shell_list="${sh}${LF}${shell_list}" ;; + + -T|--timeout) urchin_timeout="$(flag_arg)" + if ! contains "${urchin_timeout}" \ + '[0-9][0-9.]*\(s\|m\|h\|d\|\)' ; then + echo Bad timeout argument: "${urchin_timeout}" >&2 + exit 11 + fi ;; + + -*) urchin_help >&2 && exit 11;; + *) if contains "${1}" "${HT}" "${LF}"; then + echo 'Test file names may contain all characters other than' >&2 + echo 'horizontal tab (\t) and line feed (\n).' >&2 + exit 11 + elif [ ! -e "${1}" ]; then + echo "No such file or directory: '${1}'" >&2 + echo "${USAGE}" >&2 + exit 11 + elif ! { + # Molly guard + root="$(test_suite_root "${1}")" + basename "$(fullpath "${root}")" | + grep -i 'test' > /dev/null || "${force}" + }; then + echo 'The root directory of the tests that you are running urchin on +doesnot contain the word "test", so I am not running, +in case that was an accident. Use the -f flag if you really +wantto run urchin on that directory.' >&2 + exit 12 + fi + test_seeds="${1}${LF}${test_seeds}" ;; + esac + shift + done + # If -s was not passed, use the available default shells. if ! is_set "${shell_list}"; then if $cycle_shell; then @@ -687,17 +679,20 @@ want to run urchin on that directory.' >&2 TIMEOUT="timeout ${urchin_timeout}" else echo I couldn\'t figure out how to use your version of timeout >&2 - urchin_exit 10 + exit 10 fi fi if "${exit_on_not_ok}" && ! "${run_in_series}"; then echo 'You must also pass -b/--series in order to use -e/--exit-on-fail.' >&2 - urchin_exit 11 + exit 11 fi # -------------------- REALLY RUN -------------------- # + # Temporary files + urchin_tmp=$(mktemp_dir) + # Write header information echo Running tests at $(date +%Y-%m-%dT%H:%M:%S) >> "${urchin_tmp}"/head printf 'Cycling with the following shells: ' >> "${urchin_tmp}"/head @@ -710,16 +705,18 @@ want to run urchin on that directory.' >&2 done finish=$("${epoch}") - if test $(cat "${urchin_tmp}"/log | wc -l) -eq 0; then + if ! test -f "${urchin_tmp}"/log ; then echo 'No tests found' >&2 - urchin_exit 2 + exit_code=2 + else + cat "${urchin_tmp}"/head + report_outcome "${root}" "${format}" "${urchin_tmp}"/log "${start}" \ + "${finish}" + # cat "${urchin_tmp}"/foot fi - - cat "${urchin_tmp}"/head - report_outcome "${root}" "${format}" "${urchin_tmp}"/log "${start}" \ - "${finish}" -# cat "${urchin_tmp}"/foot - urchin_exit "${?}" + + rm -Rf "${urchin_tmp}" + exit "${exit_code}" } is_set TESTING_URCHIN_INTERNALS || main "$@"