summaryrefslogtreecommitdiff
path: root/tests/sh.test
blob: 3382dad3bc74aee5bb42b8e654088f6d4ce96623 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#! /bin/sh
# sh.test - check for some nonportable or dubious or undesired shell
#           constructs in shell scripts.
#
#   Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2010 Free
#   Software Foundation, Inc.
#   Written by Gary V. Vaughan, 2003
#
#   This file is part of GNU Libtool.
#
# GNU Libtool is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# GNU Libtool is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GNU Libtool; see the file COPYING.  If not, a copy
# can be downloaded from  http://www.gnu.org/licenses/gpl.html,
# or obtained by writing to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
####

. tests/defs || exit 1

# Check all the "portable" shell scripts.
status=$EXIT_SUCCESS

# Check for bad binary operators.
if $EGREP -n -e 'if[ 	]+["'\'']?\$[^ 	]+[ 	]+(=|-[lg][te]|-eq|-ne)' $scripts; then
  echo "use \`if test \$something =' instead of \`if \$something ='"
  status=$EXIT_FAILURE
fi

# Check for bad unary operators.
if $EGREP -n -e 'if[ 	]+-' $scripts; then
  echo "use \`if test -X' instead of \`if -X'"
  status=$EXIT_FAILURE
fi

# Check for using `[' instead of `test'.
if $EGREP -n -e 'if[ 	]+\[' $scripts; then
  echo "use \`if test' instead of \`if ['"
  status=$EXIT_FAILURE
fi

# Check for using test X... instead of test "X...
if $EGREP -n -e 'test[ 	]+(![ 	])?(-.[ 	]+)?X' $scripts; then
  echo "use \`test \"X...\"' instead of \`test X'"
  status=$EXIT_FAILURE
fi

# Check for using test $... instead of test "$...
if $EGREP -n -e 'test[ 	]+(![ 	])?(-.[ 	]+)?X?\$' $scripts; then
  echo "use \`test \"\$...\"' instead of \`test \$'"
  status=$EXIT_FAILURE
fi

# Never use test -e.
if $EGREP -n -e 'test[ 	]+(![ 	])?-e' $scripts; then
  echo "use \`test -f' instead of \`test -e'"
  status=$EXIT_FAILURE
fi

# Check for uses of Xsed without corresponding echo "X
if $EGREP -n -e '\$Xsed' $scripts | $EGREP -v -n -e '\$ECHO \\*"X'; then
  echo "occurrences of \`\$Xsed\' without \`echo \"X\' on the same line"
  status=$EXIT_FAILURE
fi

# Check for quotes within backquotes within quotes "`"bar"`"
if $EGREP -n -e '"[^`"]*`[^"`]*"[^"`]*".*`[^`"]*"' $scripts | \
   $EGREP -v "### testsuite: skip nested quoting test$"; then
  echo "nested quotes are dangerous"
  status=$EXIT_FAILURE
fi

# Check for using set -- instead of set dummy
if $EGREP -n -e 'set[ 	]+--[ 	]+' $scripts; then
  echo "use \`set dummy ...' instead of \`set -- ...'"
  status=$EXIT_FAILURE
fi

# Check for using shift after set dummy (same or following line).
for s in $scripts
do
  if $SED -n '
      /set[ 	][ 	]*dummy/{
	  /set.*dummy.*;.*shift/d
	  N
	  /\n.*shift/D
	  p
      }' "$s" | $EGREP .; then
    echo "use \`shift' after \`set dummy' in $s"
    status=$EXIT_FAILURE
  fi
done

# Check for opening brace on next line in shell function definition.
# redirect stderr so we also barf when sed issues diagnostics.
for s in $scripts
do
  if $SED -n '
      /^func_.*(/{
	  N
	  /^func_[^ 	]* ()\n{$/d
	  p
      }' "$s" 2>&1 | $EGREP .; then
    echo "Function definitions should look like this in $s:
func_foo ()
{
  # ...
}"
    status=$EXIT_FAILURE
  fi
done

# Check for correct usage of $cc_basename.
# redirect stderr so we also barf when sed issues diagnostics.
for s in "$abs_macro_dir/libtool.m4"
do
  if $SED -n '/case \$cc_basename in/,/esac/ {
	      /^[ 	]*[a-zA-Z][a-zA-Z0-9+]*[^*][ 	]*)/p
	      }'  $s 2>&1 | $EGREP .; then
    echo "\$cc_basename matches should include a trailing \`*' in $s."
    status=$EXIT_FAILURE
  fi
done

exit $status