de1c929ada
It is mostly for BSD system. Some tests (run-make/issue-35164 and run-make/cat-and-grep-sanity-check) are failing with BSD fgrep, whereas they pass with gnu version (gfgrep).
95 lines
2.7 KiB
Bash
Executable File
95 lines
2.7 KiB
Bash
Executable File
#!/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"
|