]> git.lizzy.rs Git - rust.git/blob - src/etc/cat-and-grep.sh
Rollup merge of #49162 - tmandry:stabilize-termination-trait, r=nikomatsakis
[rust.git] / src / etc / cat-and-grep.sh
1 #!/bin/sh
2 set -eu
3
4 # Copyright 2017 The Rust Project Developers. See the COPYRIGHT
5 # file at the top-level directory of this distribution and at
6 # http://rust-lang.org/COPYRIGHT.
7 #
8 # Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
9 # http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
10 # <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
11 # option. This file may not be copied, modified, or distributed
12 # except according to those terms.
13
14 # Performs `cat` and `grep` simultaneously for `run-make` tests in the Rust CI.
15 #
16 # This program will read lines from stdin and print them to stdout immediately.
17 # At the same time, it will check if the input line contains the substring or
18 # regex specified in the command line. If any match is found, the program will
19 # set the exit code to 0, otherwise 1.
20 #
21 # This is written to simplify debugging runmake tests. Since `grep` swallows all
22 # output, when a test involving `grep` failed, it is impossible to know the
23 # reason just by reading the failure log. While it is possible to `tee` the
24 # output into another stream, it becomes pretty annoying to do this for all test
25 # cases.
26
27 USAGE='
28 cat-and-grep.sh [-v] [-e] [-i] s1 s2 s3 ... < input.txt
29
30 Prints the stdin, and exits successfully only if all of `sN` can be found in
31 some lines of the input.
32
33 Options:
34     -v      Invert match, exits successfully only if all of `sN` cannot be found
35     -e      Regex search, search using extended Regex instead of fixed string
36     -i      Case insensitive search.
37 '
38
39 GREPPER=fgrep
40 INVERT=0
41 GREPFLAGS='q'
42 while getopts ':vieh' OPTION; do
43     case "$OPTION" in
44         v)
45             INVERT=1
46             ERROR_MSG='should not be found'
47             ;;
48         i)
49             GREPFLAGS="i$GREPFLAGS"
50             ;;
51         e)
52             GREPPER=egrep
53             ;;
54         h)
55             echo "$USAGE"
56             exit 2
57             ;;
58         *)
59             break
60             ;;
61     esac
62 done
63
64 shift $((OPTIND - 1))
65
66 # use gnu version of tool if available (for bsd)
67 if command -v "g${GREPPER}"; then
68     GREPPER="g${GREPPER}"
69 fi
70
71 LOG=$(mktemp -t cgrep.XXXXXX)
72 trap "rm -f $LOG" EXIT
73
74 printf "[[[ begin stdout ]]]\n\033[90m"
75 tee "$LOG"
76 echo >> "$LOG"   # ensure at least 1 line of output, otherwise `grep -v` may unconditionally fail.
77 printf "\033[0m\n[[[ end stdout ]]]\n"
78
79 HAS_ERROR=0
80 for MATCH in "$@"; do
81     if "$GREPPER" "-$GREPFLAGS" -- "$MATCH" "$LOG"; then
82         if [ "$INVERT" = 1 ]; then
83             printf "\033[1;31mError: should not match: %s\033[0m\n" "$MATCH"
84             HAS_ERROR=1
85         fi
86     else
87         if [ "$INVERT" = 0 ]; then
88             printf "\033[1;31mError: cannot match: %s\033[0m\n" "$MATCH"
89             HAS_ERROR=1
90         fi
91     fi
92 done
93
94 exit "$HAS_ERROR"