Author: adam-guest
Date: 2008-06-20 17:55:12 +0000 (Fri, 20 Jun 2008)
New Revision: 1515

Modified:
   trunk/debian/changelog
   trunk/scripts/checkbashisms.pl
Log:
Quote test expressions using qr to allow perl to optionally compile
or otherwise optimise them. Thanks to Frank Lichtenheld for the idea.

Modified: trunk/debian/changelog
===================================================================
--- trunk/debian/changelog      2008-06-19 18:03:09 UTC (rev 1514)
+++ trunk/debian/changelog      2008-06-20 17:55:12 UTC (rev 1515)
@@ -7,6 +7,8 @@
   * checkbashisms:
     + Add a check for $UID being set to -x
     + Apply a small fix to part of the "quoted block detection"
+    + Quote test expressions using qr to allow perl to optionally compile
+      or otherwise optimise them. Thanks to Frank Lichtenheld for the idea.
   * debchange, nmudiff: Replace calls to date -R with strftime(). Thanks
     Stephen Gran (Closes: #486594)
   * uscan: Add an example of a newer form of watch file synax for SourceForge

Modified: trunk/scripts/checkbashisms.pl
===================================================================
--- trunk/scripts/checkbashisms.pl      2008-06-19 18:03:09 UTC (rev 1514)
+++ trunk/scripts/checkbashisms.pl      2008-06-20 17:55:12 UTC (rev 1515)
@@ -407,112 +407,112 @@
 }
 
 sub init_hashes {
-    my $LEADIN = '(?:(^|[`&;(|{])\s*|(if|do|while)\s+)';
+    my $LEADIN = qr'(?:(^|[`&;(|{])\s*|(if|do|while)\s+)';
     %bashisms = (
-       '(?:^|\s+)function \w+\(\s*\)' =>   q<'function' is useless>,
-       $LEADIN . 'select\s+\w+' =>     q<'select' is not POSIX>,
-       $LEADIN . 'source\s+(?:\.\/|\/|\$)[^\s]+' =>
+       qr'(?:^|\s+)function \w+\(\s*\)' =>   q<'function' is useless>,
+       $LEADIN . qr'select\s+\w+' =>     q<'select' is not POSIX>,
+       $LEADIN . qr'source\s+(?:\.\/|\/|\$)[^\s]+' =>
                                       q<should be '.', not 'source'>,
-       '(test|-o|-a)\s*[^\s]+\s+==\s' =>
+       qr'(test|-o|-a)\s*[^\s]+\s+==\s' =>
                                       q<should be 'b = a'>,
-       '\[\s+[^\]]+\s+==\s' =>        q<should be 'b = a'>,
-       '\s\|\&' =>                    q<pipelining is not POSIX>,
-       '[^\\\]\{([^\s\\\}]+?,)+[^\\\}\s]+\}' =>
+       qr'\[\s+[^\]]+\s+==\s' =>        q<should be 'b = a'>,
+       qr'\s\|\&' =>                    q<pipelining is not POSIX>,
+       qr'[^\\]\{([^\s\\\}]+?,)+[^\\\}\s]+\}' =>
                                       q<brace expansion>,
-       '(?:^|\s+)\w+\[\d+\]=' =>      q<bash arrays, H[0]>,
-       $LEADIN . '(read\s*(-[^r]+)*(?:;|$))' => q<should be read [-r] 
variable>,
-       $LEADIN . 'echo\s+(-n\s+)?-n?en?\s' =>      q<echo -e>,
-       $LEADIN . 'exec\s+-[acl]' =>    q<exec -c/-l/-a name>,
-       $LEADIN . 'let\s' =>            q<let ...>,
-       '(?<![\$\(])\(\(.*\)\)' =>     q<'((' should be '$(('>,
-       '\$\[[^][]+\]' =>              q<'$[' should be '$(('>,
-       '(?:^|\s+)(\[|test)\s+-a' =>            q<test with unary -a (should be 
-e)>,
-       '\&>' =>                       q<should be \>word 2\>&1>,
-       '(<\&|>\&)\s*((-|\d+)[^\s;|)`&\\\\]|[^-\d\s]+)' =>
+       qr'(?:^|\s+)\w+\[\d+\]=' =>      q<bash arrays, H[0]>,
+       $LEADIN . qr'(read\s*(-[^r]+)*(?:;|$))' => q<should be read [-r] 
variable>,
+       $LEADIN . qr'echo\s+(-n\s+)?-n?en?\s' =>      q<echo -e>,
+       $LEADIN . qr'exec\s+-[acl]' =>    q<exec -c/-l/-a name>,
+       $LEADIN . qr'let\s' =>            q<let ...>,
+       qr'(?<![\$\(])\(\(.*\)\)' =>     q<'((' should be '$(('>,
+       qr'\$\[[^][]+\]' =>            q<'$[' should be '$(('>,
+       qr'(?:^|\s+)(\[|test)\s+-a' =>            q<test with unary -a (should 
be -e)>,
+       qr'\&>' =>                     q<should be \>word 2\>&1>,
+       qr'(<\&|>\&)\s*((-|\d+)[^\s;|)`&\\\\]|[^-\d\s]+)' =>
                                       q<should be \>word 2\>&1>,
-       $LEADIN . 'kill\s+-[^sl]\w*' => q<kill -[0-9] or -[A-Z]>,
-       $LEADIN . 'trap\s+["\']?.*["\']?\s+.*[1-9]' => q<trap with signal 
numbers>,
-       '\[\[(?!:)' => q<alternative test command ([[ foo ]] should be [ foo 
])>,
-       '/dev/(tcp|udp)'            => q</dev/(tcp|udp)>,
-       $LEADIN . 'suspend\s' =>        q<suspend>,
-       $LEADIN . 'caller\s' =>         q<caller>,
-       $LEADIN . 'complete\s' =>       q<complete>,
-       $LEADIN . 'compgen\s' =>        q<compgen>,
-       $LEADIN . 'declare\s' =>        q<declare>,
-       $LEADIN . 'typeset\s' =>        q<typeset>,
-       $LEADIN . 'disown\s' =>         q<disown>,
-       $LEADIN . 'builtin\s' =>        q<builtin>,
-       $LEADIN . 'set\s+-[BHT]+' =>    q<set -[BHT]>,
-       $LEADIN . 'alias\s+-p' =>       q<alias -p>,
-       $LEADIN . 'unalias\s+-a' =>     q<unalias -a>,
-       $LEADIN . 'local\s+-[a-zA-Z]+' => q<local -opt>,
-       $LEADIN . 'local\s+\w+=' =>     q<local foo=bar>,
-       '(?:^|\s+)\s*\(?\w*[^\(\w\s]+\S*?\s*\(\)[^\"]?'
+       $LEADIN . qr'kill\s+-[^sl]\w*' => q<kill -[0-9] or -[A-Z]>,
+       $LEADIN . qr'trap\s+["\']?.*["\']?\s+.*[1-9]' => q<trap with signal 
numbers>,
+       qr'\[\[(?!:)' => q<alternative test command ([[ foo ]] should be [ foo 
])>,
+       qr'/dev/(tcp|udp)'          => q</dev/(tcp|udp)>,
+       $LEADIN . qr'suspend\s' =>        q<suspend>,
+       $LEADIN . qr'caller\s' =>         q<caller>,
+       $LEADIN . qr'complete\s' =>       q<complete>,
+       $LEADIN . qr'compgen\s' =>        q<compgen>,
+       $LEADIN . qr'declare\s' =>        q<declare>,
+       $LEADIN . qr'typeset\s' =>        q<typeset>,
+       $LEADIN . qr'disown\s' =>         q<disown>,
+       $LEADIN . qr'builtin\s' =>        q<builtin>,
+       $LEADIN . qr'set\s+-[BHT]+' =>    q<set -[BHT]>,
+       $LEADIN . qr'alias\s+-p' =>       q<alias -p>,
+       $LEADIN . qr'unalias\s+-a' =>     q<unalias -a>,
+       $LEADIN . qr'local\s+-[a-zA-Z]+' => q<local -opt>,
+       $LEADIN . qr'local\s+\w+=' =>     q<local foo=bar>,
+       qr'(?:^|\s+)\s*\(?\w*[^\(\w\s]+\S*?\s*\(\)[^\"]?'
                => q<function names should only contain [a-z0-9_]>,
-       $LEADIN . '(push|pop)d\b' =>    q<(push|pod)d>,
-       $LEADIN . 'export\s+-[^p]' =>  q<export only takes -p as an option>,
-       $LEADIN . 'ulimit\b' =>         q<ulimit>,
-       $LEADIN . 'shopt\b' =>          q<shopt>,
-       $LEADIN . 'type\s' =>          q<type>,
-       $LEADIN . 'time\s' =>          q<time>,
-       $LEADIN . 'dirs\b' =>          q<dirs>,
-       '(?:^|\s+)[<>]\(.*?\)'      => q<\<() process substituion>,
-       '(?:^|\s+)readonly\s+-[af]' => q<readonly -[af]>,
-       $LEADIN . '(sh|\$\{?SHELL\}?) -[rD]' => q<sh -[rD]>,
-       $LEADIN . '(sh|\$\{?SHELL\}?) --\w+' =>  q<sh --long-option>,
-       $LEADIN . '(sh|\$\{?SHELL\}?) [-+]O' =>  q<sh [-+]O>,
+       $LEADIN . qr'(push|pop)d\b' =>    q<(push|pod)d>,
+       $LEADIN . qr'export\s+-[^p]' =>  q<export only takes -p as an option>,
+       $LEADIN . qr'ulimit\b' =>         q<ulimit>,
+       $LEADIN . qr'shopt\b' =>          q<shopt>,
+       $LEADIN . qr'type\s' =>          q<type>,
+       $LEADIN . qr'time\s' =>          q<time>,
+       $LEADIN . qr'dirs\b' =>          q<dirs>,
+       qr'(?:^|\s+)[<>]\(.*?\)'            => q<\<() process substituion>,
+       qr'(?:^|\s+)readonly\s+-[af]' => q<readonly -[af]>,
+       $LEADIN . qr'(sh|\$\{?SHELL\}?) -[rD]' => q<sh -[rD]>,
+       $LEADIN . qr'(sh|\$\{?SHELL\}?) --\w+' =>  q<sh --long-option>,
+       $LEADIN . qr'(sh|\$\{?SHELL\}?) [-+]O' =>  q<sh [-+]O>,
     );
 
     %string_bashisms = (
-       '\$\[\w+\]' =>                 q<arithmetic not allowed>,
-       '\$\{\w+\:\d+(?::\d+)?\}' =>   q<${foo:3[:1]}>,
-       '[EMAIL PROTECTED]' =>           q<${!prefix[*|@]>,
-       '\$\{!\w+\}' =>                q<${!name}>,
-       '\$\{\w+(/.+?){1,2}\}' =>      q<${parm/?/pat[/str]}>,
-       '[EMAIL PROTECTED]' => q<bash arrays, ${name[0|*|@]}>,
-       '\$\{?RANDOM\}?\b' =>          q<$RANDOM>,
-       '\$\{?(OS|MACH)TYPE\}?\b'   => q<$(OS|MACH)TYPE>,
-       '\$\{?HOST(TYPE|NAME)\}?\b' => q<$HOST(TYPE|NAME)>,
-       '\$\{?DIRSTACK\}?\b'        => q<$DIRSTACK>,
-       '\$\{?EUID\}?\b'            => q<$EUID should be "id -u">,
-       '\$\{?UID\}?\b'             => q<$UID should be "id -ru">,
-       '\$\{?SECONDS\}?\b'         => q<$SECONDS>,
-       '\$\{?BASH_[A-Z]+\}?\b'     => q<$BASH_SOMETHING>,
-       '\$\{?SHELLOPTS\}?\b'       => q<$SHELLOPTS>,
-       '\$\{?PIPESTATUS\}?\b'      => q<$PIPESTATUS>,
-       '\$\{?SHLVL\}?\b'           => q<$SHLVL>,
-       '<<<'                       => q<\<\<\< here string>,
-       $LEADIN . 
'echo\s+(?:-[^e]+\s+)?([\"])[^\"]*(\\\[abcEfnrtv\\\0])+.*?[\"]' => q<unsafe 
echo with backslash>,
+       qr'\$\[\w+\]' =>                 q<arithmetic not allowed>,
+       qr'\$\{\w+\:\d+(?::\d+)?\}' =>   q<${foo:3[:1]}>,
+       qr'[EMAIL PROTECTED]' =>           q<${!prefix[*|@]>,
+       qr'\$\{!\w+\}' =>                q<${!name}>,
+       qr'\$\{\w+(/.+?){1,2}\}' =>      q<${parm/?/pat[/str]}>,
+       qr'[EMAIL PROTECTED]' => q<bash arrays, ${name[0|*|@]}>,
+       qr'\$\{?RANDOM\}?\b' =>          q<$RANDOM>,
+       qr'\$\{?(OS|MACH)TYPE\}?\b'   => q<$(OS|MACH)TYPE>,
+       qr'\$\{?HOST(TYPE|NAME)\}?\b' => q<$HOST(TYPE|NAME)>,
+       qr'\$\{?DIRSTACK\}?\b'        => q<$DIRSTACK>,
+       qr'\$\{?EUID\}?\b'          => q<$EUID should be "id -u">,
+       qr'\$\{?UID\}?\b'                   => q<$UID should be "id -ru">,
+       qr'\$\{?SECONDS\}?\b'       => q<$SECONDS>,
+       qr'\$\{?BASH_[A-Z]+\}?\b'     => q<$BASH_SOMETHING>,
+       qr'\$\{?SHELLOPTS\}?\b'       => q<$SHELLOPTS>,
+       qr'\$\{?PIPESTATUS\}?\b'      => q<$PIPESTATUS>,
+       qr'\$\{?SHLVL\}?\b'           => q<$SHLVL>,
+       qr'<<<'                       => q<\<\<\< here string>,
+       $LEADIN . 
qr'echo\s+(?:-[^e]+\s+)?([\"])[^\"]*(\\[\\abcEfnrtv0])+.*?[\"]' => q<unsafe 
echo with backslash>,
        #'(?<![\$\\\])\$\"[^\"]+\"'   => q<$"foo" should be eval_gettext "foo">,
     );
 
     %singlequote_bashisms = (
-       $LEADIN . 
'echo\s+(?:-[^e]+\s+)?([\'])[^\']*(\\\[abcEfnrtv\\\0])+.*?[\']' => q<unsafe 
echo with backslash>,
+       $LEADIN . 
qr'echo\s+(?:-[^e]+\s+)?([\'])[^\']*(\\[\\abcEfnrtv0])+.*?[\']' => q<unsafe 
echo with backslash>,
        #'(?<![\$\\\])\$\'[^\']+\''              => q<$'...' should be 
"$(printf '...')">,
     );
 
     if ($opt_echo) {
-       $bashisms{'echo\s+-[n]'} = q<echo -n>;
+       $bashisms{qr'echo\s+-[n]'} = q<echo -n>;
     }
 
     if ($makefile) {
-       $string_bashisms{'(\$\(|\`)\s*\<\s*([^\s\)]{2,}|[^DF])\s*(\)|\`)'} =
+       $string_bashisms{qr'(\$\(|\`)\s*\<\s*([^\s\)]{2,}|[^DF])\s*(\)|\`)'} =
            q<'$(\< foo)' should be '$(cat foo)'>;
     } else {
-       $bashisms{$LEADIN . '\w+\+='} = q<should be VAR="${VAR}foo">;
-       $string_bashisms{'(\$\(|\`)\s*\<\s*\S+\s*(\)|\`)'} = q<'$(\< foo)' 
should be '$(cat foo)'>;
+       $bashisms{$LEADIN . qr'\w+\+='} = q<should be VAR="${VAR}foo">;
+       $string_bashisms{qr'(\$\(|\`)\s*\<\s*\S+\s*(\)|\`)'} = q<'$(\< foo)' 
should be '$(cat foo)'>;
     }
            
     if ($opt_extra) {
-       $string_bashisms{'\$\{?BASH\}?\b'} = q<$BASH>;
-       $string_bashisms{'(?:^|\s+)RANDOM='} = q<RANDOM=>;
-       $string_bashisms{'(?:^|\s+)(OS|MACH)TYPE='} = q<(OS|MACH)TYPE=>;
-       $string_bashisms{'(?:^|\s+)HOST(TYPE|NAME)='} = q<HOST(TYPE|NAME)=>;
-       $string_bashisms{'(?:^|\s+)DIRSTACK='} = q<DIRSTACK=>;
-       $string_bashisms{'(?:^|\s+)EUID='} = q<EUID=>;
-       $string_bashisms{'(?:^|\s+)UID='} = q<UID=>;
-       $string_bashisms{'(?:^|\s+)BASH(_[A-Z]+)?='} = q<BASH(_SOMETHING)=>;
-       $string_bashisms{'(?:^|\s+)SHELLOPTS='} = q<SHELLOPTS=>;
-       $string_bashisms{'\$\{?POSIXLY_CORRECT\}?\b'} = q<$POSIXLY_CORRECT>;
+       $string_bashisms{qr'\$\{?BASH\}?\b'} = q<$BASH>;
+       $string_bashisms{qr'(?:^|\s+)RANDOM='} = q<RANDOM=>;
+       $string_bashisms{qr'(?:^|\s+)(OS|MACH)TYPE='} = q<(OS|MACH)TYPE=>;
+       $string_bashisms{qr'(?:^|\s+)HOST(TYPE|NAME)='} = q<HOST(TYPE|NAME)=>;
+       $string_bashisms{qr'(?:^|\s+)DIRSTACK='} = q<DIRSTACK=>;
+       $string_bashisms{qr'(?:^|\s+)EUID='} = q<EUID=>;
+       $string_bashisms{qr'(?:^|\s+)UID='} = q<UID=>;
+       $string_bashisms{qr'(?:^|\s+)BASH(_[A-Z]+)?='} = q<BASH(_SOMETHING)=>;
+       $string_bashisms{qr'(?:^|\s+)SHELLOPTS='} = q<SHELLOPTS=>;
+       $string_bashisms{qr'\$\{?POSIXLY_CORRECT\}?\b'} = q<$POSIXLY_CORRECT>;
     }
 }



-- 
To unsubscribe, send mail to [EMAIL PROTECTED]

Reply via email to