b5ca5d070761780c3a93b0a5509412e142ce4b04
[xfstests-dev.git] / common
1 ##/bin/sh 
2 #
3 # Copyright (c) 2000-2005 Silicon Graphics, Inc.  All Rights Reserved.
4 #
5 # common procedures for QA scripts
6 #
7 # $Header: /disk7/depot/linux/pcp/dev/qa/RCS/common,v 2.52 2000/04/05 18:24:51 kenmcd Exp $
8 #
9
10 _setenvironment()
11 {
12     MSGVERB="text:action"
13     export MSGVERB
14 }
15
16 here=`pwd`
17 rm -f $here/$iam.out
18 _setenvironment
19
20 check=${check-true}
21
22 diff="diff -u"
23 verbose=false
24 group=false
25 xgroup=false
26 showme=false
27 sortme=false
28 expunge=true
29 have_test_arg=false
30 randomize=false
31 rm -f $tmp.list $tmp.tmp $tmp.sed
32
33 # Autodetect fs type based on what's on $TEST_DEV
34 if [ "$HOSTOS" == "Linux" ]
35 then
36     export FSTYP=`blkid -s TYPE -o value $TEST_DEV`
37 else
38     export FSTYP=xfs
39 fi
40
41 for r
42 do
43
44     if $group
45     then
46         # arg after -g
47         group_list=`sed -n <group -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
48 s/ .*//p
49 }'`
50         if [ -z "$group_list" ]
51         then
52             echo "Group \"$r\" is empty or not defined?"
53             exit 1
54         fi
55         [ ! -s $tmp.list ] && touch $tmp.list
56         for t in $group_list
57         do
58             if grep -s "^$t\$" $tmp.list >/dev/null
59             then
60                 :
61             else
62                 echo "$t" >>$tmp.list
63             fi
64         done
65         group=false
66         continue
67
68     elif $xgroup
69     then
70         # arg after -x
71         [ ! -s $tmp.list ] && ls [0-9][0-9][0-9] [0-9][0-9][0-9][0-9] >$tmp.list 2>/dev/null
72         group_list=`sed -n <group -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
73 s/ .*//p
74 }'`
75         if [ -z "$group_list" ]
76         then
77             echo "Group \"$r\" is empty or not defined?"
78             exit 1
79         fi
80         numsed=0
81         rm -f $tmp.sed
82         for t in $group_list
83         do
84             if [ $numsed -gt 100 ]
85             then
86                 sed -f $tmp.sed <$tmp.list >$tmp.tmp
87                 mv $tmp.tmp $tmp.list
88                 numsed=0
89                 rm -f $tmp.sed
90             fi
91             echo "/^$t\$/d" >>$tmp.sed
92             numsed=`expr $numsed + 1`
93         done
94         sed -f $tmp.sed <$tmp.list >$tmp.tmp
95         mv $tmp.tmp $tmp.list
96         xgroup=false
97         continue
98     fi
99
100     xpand=true
101     case "$r"
102     in
103
104         -\? | -h | --help)      # usage
105             echo "Usage: $0 [options] [testlist]"'
106
107 common options
108     -v                  verbose
109
110 check options
111     -xfs                test XFS (default)
112     -udf                test UDF
113     -nfs                test NFS
114     -l                  line mode diff
115     -xdiff              graphical mode diff
116     -udiff              show unified diff (default)
117     -n                  show me, do not run tests
118     -q                  quick [deprecated]
119     -T                  output timestamps
120     -r                  randomize test order
121     
122 testlist options
123     -g group[,group...] include tests from these groups
124     -x group[,group...] exclude tests from these groups
125     NNN                 include test NNN
126     NNN-NNN             include test range (eg. 012-021)
127 '
128             exit 0
129             ;;
130
131         -udf)   # -udf ... set FSTYP to udf
132             FSTYP=udf
133             xpand=false
134             ;;
135
136         -xfs)   # -xfs ... set FSTYP to xfs
137             FSTYP=xfs
138             xpand=false
139             ;;
140
141         -nfs)   # -nfs ... set FSTYP to nfs
142             FSTYP=nfs
143             xpand=false
144             ;;
145
146         -g)     # -g group ... pick from group file
147             group=true
148             xpand=false
149             ;;
150
151         -l)     # line mode for diff, was default before
152             diff="diff"
153             xpand=false
154             ;;
155
156         -xdiff) # graphical diff mode
157             xpand=false
158
159             if [ ! -z "$DISPLAY" ]
160             then
161                 which xdiff >/dev/null 2>&1 && diff=xdiff
162                 which gdiff >/dev/null 2>&1 && diff=gdiff
163                 which tkdiff >/dev/null 2>&1 && diff=tkdiff
164                 which xxdiff >/dev/null 2>&1 && diff=xxdiff
165             fi
166             ;;
167
168         -udiff) # show a unified diff, default now, keep for backward compat
169             xpand=false
170             diff="$diff -u"
171             ;;
172
173         -q)     # "quick", no longer used - always quick :-)
174             xpand=false
175             ;;
176
177         -n)     # show me, don't do it
178             showme=true
179             xpand=false
180             ;;
181         -r)     # randomize test order
182             randomize=true
183             xpand=false
184             ;;
185
186         -T)     # turn on timestamp output
187             timestamp=true
188             xpand=false
189             ;;
190
191         -v)
192             verbose=true
193             xpand=false
194             ;;
195         -x)     # -x group ... exclude from group file
196             xgroup=true
197             xpand=false
198             ;;
199         '[0-9][0-9][0-9] [0-9][0-9][0-9][0-9]')
200             echo "No tests?"
201             status=1
202             exit $status
203             ;;
204
205         [0-9]*-[0-9]*)
206             eval `echo $r | sed -e 's/^/start=/' -e 's/-/ end=/'`
207             ;;
208
209         [0-9]*-)
210             eval `echo $r | sed -e 's/^/start=/' -e 's/-//'`
211             end=`echo [0-9][0-9][0-9] [0-9][0-9][0-9][0-9] | sed -e 's/\[0-9]//g' -e 's/  *$//' -e 's/.* //'`
212             if [ -z "$end" ]
213             then
214                 echo "No tests in range \"$r\"?"
215                 status=1
216                 exit $status
217             fi
218             ;;
219
220         *)
221             start=$r
222             end=$r
223             ;;
224
225     esac
226
227     # get rid of leading 0s as can be interpreted as octal
228     start=`echo $start | sed 's/^0*//'`
229     end=`echo $end | sed 's/^0*//'`
230
231     if $xpand
232     then
233         have_test_arg=true
234         $AWK_PROG </dev/null '
235 BEGIN   { for (t='$start'; t<='$end'; t++) printf "%03d\n",t }' \
236         | while read id
237         do
238             if grep -s "^$id " group >/dev/null
239             then
240                 # in group file ... OK
241                 echo $id >>$tmp.list
242             else
243                 if [ -f expunged ] && $expunge && egrep "^$id([         ]|\$)" expunged >/dev/null
244                 then
245                     # expunged ... will be reported, but not run, later
246                     echo $id >>$tmp.list
247                 else
248                     # oops
249                     echo "$id - unknown test, ignored"
250                 fi
251             fi
252         done
253     fi
254
255 done
256
257 if [ -s $tmp.list ]
258 then
259     # found some valid test numbers ... this is good
260     :
261 else
262     if $have_test_arg
263     then
264         # had test numbers, but none in group file ... do nothing
265         touch $tmp.list
266     else
267         # no test numbers, do everything from group file
268         sed -n -e '/^[0-9][0-9][0-9]*/s/[       ].*//p' <group >$tmp.list
269     fi
270 fi
271
272 # should be sort -n, but this did not work for Linux when this
273 # was ported from IRIX
274 #
275 list=`sort $tmp.list`
276 rm -f $tmp.list $tmp.tmp $tmp.sed
277
278 if $randomize
279 then
280     list=`echo $list | awk -f randomize.awk`
281 fi
282
283 case "$FSTYP" in
284     xfs)
285          [ "$XFS_LOGPRINT_PROG" = "" ] && _fatal "xfs_logprint not found"
286          [ "$XFS_REPAIR_PROG" = "" ] && _fatal "xfs_repair not found"
287          [ "$XFS_CHECK_PROG" = "" ] && _fatal "xfs_check not found"
288          [ "$XFS_DB_PROG" = "" ] && _fatal "xfs_db not found"
289          [ "$MKFS_XFS_PROG" = "" ] && _fatal "mkfs_xfs not found" 
290          ;;
291     udf)
292          [ "$MKFS_UDF_PROG" = "" ] && _fatal "mkfs_udf/mkudffs not found"
293          ;;
294     nfs)
295          ;;
296 esac