summaryrefslogtreecommitdiffstats
path: root/src/etc/cat-and-grep.sh
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:02:58 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:02:58 +0000
commit698f8c2f01ea549d77d7dc3338a12e04c11057b9 (patch)
tree173a775858bd501c378080a10dca74132f05bc50 /src/etc/cat-and-grep.sh
parentInitial commit. (diff)
downloadrustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.tar.xz
rustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.zip
Adding upstream version 1.64.0+dfsg1.upstream/1.64.0+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/etc/cat-and-grep.sh')
-rwxr-xr-xsrc/etc/cat-and-grep.sh84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/etc/cat-and-grep.sh b/src/etc/cat-and-grep.sh
new file mode 100755
index 000000000..77dc52a93
--- /dev/null
+++ b/src/etc/cat-and-grep.sh
@@ -0,0 +1,84 @@
+#!/bin/sh
+set -eu
+
+# 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"