| #!/bin/sh |
| set -eu |
| |
| # Copyright 2017 The Rust Project Developers. See the COPYRIGHT |
| # file at the top-level directory of this distribution and at |
| # http://rust-lang.org/COPYRIGHT. |
| # |
| # Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or |
| # http://www.apache.org/licenses/LICENSE-2.0> or the MIT license |
| # <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your |
| # option. This file may not be copied, modified, or distributed |
| # except according to those terms. |
| |
| # Performs `cat` and `grep` simultaneously for `run-make` tests in the Rust CI. |
| # |
| # This program will read lines from stdin and print them to stdout immediately. |
| # At the same time, it will check if the input line contains the substring or |
| # regex specified in the command line. If any match is found, the program will |
| # set the exit code to 0, otherwise 1. |
| # |
| # This is written to simplify debugging runmake tests. Since `grep` swallows all |
| # output, when a test involving `grep` failed, it is impossible to know the |
| # reason just by reading the failure log. While it is possible to `tee` the |
| # output into another stream, it becomes pretty annoying to do this for all test |
| # cases. |
| |
| USAGE=' |
| cat-and-grep.sh [-v] [-e] [-i] s1 s2 s3 ... < input.txt |
| |
| Prints the stdin, and exits successfully only if all of `sN` can be found in |
| some lines of the input. |
| |
| Options: |
| -v Invert match, exits successfully only if all of `sN` cannot be found |
| -e Regex search, search using extended Regex instead of fixed string |
| -i Case insensitive search. |
| ' |
| |
| GREPPER=fgrep |
| INVERT=0 |
| GREPFLAGS='q' |
| while getopts ':vieh' OPTION; do |
| case "$OPTION" in |
| v) |
| INVERT=1 |
| ERROR_MSG='should not be found' |
| ;; |
| i) |
| GREPFLAGS="i$GREPFLAGS" |
| ;; |
| e) |
| GREPPER=egrep |
| ;; |
| h) |
| echo "$USAGE" |
| exit 2 |
| ;; |
| *) |
| break |
| ;; |
| esac |
| done |
| |
| shift $((OPTIND - 1)) |
| |
| # use gnu version of tool if available (for bsd) |
| if command -v "g${GREPPER}"; then |
| GREPPER="g${GREPPER}" |
| fi |
| |
| LOG=$(mktemp -t cgrep.XXXXXX) |
| trap "rm -f $LOG" EXIT |
| |
| printf "[[[ begin stdout ]]]\n\033[90m" |
| tee "$LOG" |
| echo >> "$LOG" # ensure at least 1 line of output, otherwise `grep -v` may unconditionally fail. |
| printf "\033[0m\n[[[ end stdout ]]]\n" |
| |
| HAS_ERROR=0 |
| for MATCH in "$@"; do |
| if "$GREPPER" "-$GREPFLAGS" -- "$MATCH" "$LOG"; then |
| if [ "$INVERT" = 1 ]; then |
| printf "\033[1;31mError: should not match: %s\033[0m\n" "$MATCH" |
| HAS_ERROR=1 |
| fi |
| else |
| if [ "$INVERT" = 0 ]; then |
| printf "\033[1;31mError: cannot match: %s\033[0m\n" "$MATCH" |
| HAS_ERROR=1 |
| fi |
| fi |
| done |
| |
| exit "$HAS_ERROR" |