414cb538c21a9ec91989b7a40371a3ff1a2ff669
[xfstests-dev.git] / tools / mkgroupfile
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (c) 2021 Oracle.  All Rights Reserved.
4 #
5 # Generate a group file from the _begin_fstest call in each test.
6
7 if [ "$1" = "--help" ]; then
8         echo "Usage: (cd tests/XXX/ ; ../../tools/mkgroupfile [output])"
9         exit 1
10 fi
11
12 test_dir="$PWD"
13 groupfile="$1"
14 new_groups="/tmp/groups.$$"
15 GROUPNAME_DOC_FILE="$(readlink -m ../../doc/group-names.txt)"
16
17 if [ ! -x ../../check ]; then
18         echo "$0: Run this from tests/XXX/."
19         exit 1
20 fi
21
22 . ../../common/test_names
23
24 cleanup()
25 {
26         rm -f $new_groups.check
27         rm -f $new_groups
28 }
29
30 ret=1   # trigger cleanup of temporary files unless we succeed
31 trap 'cleanup; exit $ret' EXIT INT TERM QUIT
32
33 # Make sure each group is in the documentation file.
34 _check_groups() {
35         test -n "$GROUPNAME_DOC_FILE" || return 0
36
37         local groups="$1"
38         declare -a missing=()
39
40         for group in `grep -v '#' $groups`; do
41                 if ! grep -q "^${group}[[:space:]]" "$GROUPNAME_DOC_FILE"; then
42                         missing+=("\"${group}\"")
43                 fi
44         done
45         test "${#missing}" -eq 0 && return 0
46
47         local suffix=
48         test "${#missing}" -gt 1 && suffix="s"
49         echo "group$suffix ${missing[@]} not mentioned in documentation." 1>&2
50         ret=1
51         exit 1
52 }
53
54 generate_groupfile() {
55         cat << ENDL > $new_groups
56 # QA groups control file, automatically generated.
57 # See _begin_fstest in each test for details.
58
59 ENDL
60
61         cd ../../
62
63         # Aggregate the groups each test belongs to for the group file
64         grep -I -R "^_begin_fstest" $test_dir/ | \
65                 sed -e "s/^.*\/\($VALID_TEST_NAME\):_begin_fstest/\1/" \
66                 >> $new_groups
67
68         # Create the list of unique groups for existence checking
69         grep -I -R "^_begin_fstest" $test_dir/ | \
70                 sed -e 's/^.*_begin_fstest //' -e 's/ /\n/g' | \
71                 sort -u > $new_groups.check
72
73         _check_groups $new_groups.check
74
75         cd "$test_dir"
76 }
77
78 if [ -z "$groupfile" ] || [ "$groupfile" = "-" ]; then
79         # Dump the group file to stdout and exit
80         unset groupfile
81         generate_groupfile
82         cat $new_groups
83 else
84         # Otherwise, write the group file to disk somewhere.
85         generate_groupfile
86         mv -f "$new_groups" "$groupfile"
87 fi
88
89 # Success!
90 ret=0