This is an automated email from the git hooks/post-receive script.

osamu pushed a commit to branch master
in repository devscripts.

commit dbbe24e472687029a9e9e173383929c7e182361d
Author: Osamu Aoki <[email protected]>
Date:   Sat Feb 13 11:18:27 2016 +0900

    uscan: add warning for bad rules
    
    Also fix minor gliches:
     * fail if extra closer
     * fail if non-blank between <...> and <...>
     * skip blanks to allow rules like s<...> <...>g
    
    Closes: #814049
---
 debian/changelog |  8 ++++++++
 scripts/uscan.pl | 53 +++++++++++++++++++++++++++++++++++++++++++++--------
 2 files changed, 53 insertions(+), 8 deletions(-)

diff --git a/debian/changelog b/debian/changelog
index 5ebb155..c9037af 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+devscripts (2.16.2) UNRELEASED; urgency=medium
+
+  [ Osamu Aoki ]
+  * uscan:
+    + Print proper warnings for bad rules.  Closes: #814049
+
+ -- Osamu Aoki <[email protected]>  Sat, 13 Feb 2016 22:10:05 +0900
+
 devscripts (2.16.1) unstable; urgency=medium
 
   [ Antonio Terceiro ]
diff --git a/scripts/uscan.pl b/scripts/uscan.pl
index d78ec94..8b660f8 100755
--- a/scripts/uscan.pl
+++ b/scripts/uscan.pl
@@ -4330,6 +4330,7 @@ sub quoted_regex_parse($) {
            if ($open == 1) {
                if ($in_replacement) {
                    # Separator after end of replacement
+                   uscan_warn "Extra \"$sep\" after end of replacement.\n";
                    $parsed_ok = 0;
                    last;
                } else {
@@ -4346,13 +4347,14 @@ sub quoted_regex_parse($) {
            }
        } elsif ($char eq $closer and ! $last_was_escape) {
            $open--;
-           if ($open) {
+           if ($open > 0) {
                if ($in_replacement) {
                    $replacement .= $char;
                } else {
                    $regexp .= $char;
                }
            } elsif ($open < 0) {
+               uscan_warn "Extra \"$closer\" after end of replacement.\n";
                $parsed_ok = 0;
                last;
            }
@@ -4364,14 +4366,24 @@ sub quoted_regex_parse($) {
                    $flags .= $char;
                }
            } else {
-               $regexp .= $char;
+               if ($open) {
+                   $regexp .= $char;
+               } elsif ($char !~ m/\s/ ){
+                   uscan_warn "Non-whitespace between <...> and <...> (or 
similars).\n";
+                   $parsed_ok = 0;
+                   last;
+               }
+               # skip if blanks between <...> and <...> (or similars)
            }
        }
        # Don't treat \\ as an escape
        $last_was_escape = ($char eq '\\' and ! $last_was_escape);
     }
 
-    $parsed_ok = 0 unless $in_replacement and $open == 0;
+    unless ($in_replacement and $open == 0) {
+       uscan_warn "Empty replacement string.\n";
+       $parsed_ok = 0;
+    }
 
     return ($parsed_ok, $regexp, $replacement, $flags);
 }
@@ -4388,8 +4400,15 @@ sub safe_replace($$) {
     if ($sep eq '{' or $sep eq '(' or $sep eq '[' or $sep eq '<') {
        ($parsed_ok, $regexp, $replacement, $flags) = quoted_regex_parse($pat);
 
-       return 0 unless $parsed_ok;
+       unless ($parsed_ok) {
+           uscan_warn "stop mangling: rule=\"$pat\" on \"$in\"\n" .
+                      "  mangling rule with <...>, (...), {...} failed.\n";
+           return 0;
+       }
     } elsif ($pat !~ 
/^(?:s|tr|y)$esc((?:\\.|[^\\$esc])*)$esc((?:\\.|[^\\$esc])*)$esc([a-z]*)$/) {
+       $sep = "/" if $sep == '';
+       uscan_warn "stop mangling: rule=\"$pat\" on \"$in\"\n" .
+                  "   rule doesn't match \"(s|tr|y)$sep.*$sep.*$sep.*\" or 
similar.\n";
        return 0;
     } else {
        ($regexp, $replacement, $flags) = ($1, $2, $3);
@@ -4398,7 +4417,11 @@ sub safe_replace($$) {
     my $safeflags = $flags;
     if ($op eq 'tr' or $op eq 'y') {
        $safeflags =~ tr/cds//cd;
-       return 0 if $safeflags ne $flags;
+       if ($safeflags ne $flags) {
+           uscan_warn "stop mangling: rule=\"$pat\" on \"$in\"\n" .
+                      "   flags must consist of \"cds\" only.\n";
+           return 0;
+       }
 
        $regexp =~ s/\\(.)/$1/g;
        $replacement =~ s/\\(.)/$1/g;
@@ -4409,13 +4432,19 @@ sub safe_replace($$) {
        eval "\$\$in =~ tr<$regexp><$replacement>$flags;";
 
        if ($@) {
+           uscan_warn "stop mangling: rule=\"$pat\" on \"$in\"\n" .
+                      "   mangling \"tr\" or \"y\" rule execution failed.\n";
            return 0;
        } else {
            return 1;
        }
     } else {
        $safeflags =~ tr/gix//cd;
-       return 0 if $safeflags ne $flags;
+       if ($safeflags ne $flags) {
+           uscan_warn "stop mangling: rule=\"$pat\" on \"$in\"\n" .
+                      "   flags must consist of \"gix\" only.\n";
+           return 0;
+       }
 
        my $global = ($flags =~ s/g//);
        $flags = "(?$flags)" if length $flags;
@@ -4424,7 +4453,11 @@ sub safe_replace($$) {
        if ($regexp =~ /(?<!\\)(\\\\)*\\G/) {
            $slashg = 1;
            # if it's not initial, it is too dangerous
-           return 0 if $regexp =~ /^.*[^\\](\\\\)*\\G/;
+           if ($regexp =~ /^.*[^\\](\\\\)*\\G/) {
+               uscan_warn "stop mangling: rule=\"$pat\" on \"$in\"\n" .
+                          "   dangerous use of \\G with regexp=\"$regexp\".\n";
+               return 0;
+           }
        }
 
        # Behave like Perl and treat e.g. "\." in replacement as "."
@@ -4483,7 +4516,11 @@ sub safe_replace($$) {
                    }
                }
            };
-           return 0 if $@;
+           if ($@) {
+               uscan_warn "stop mangling: rule=\"$pat\" on \"$in\"\n" .
+                          "   mangling \"s\" rule execution failed.\n";
+               return 0;
+           }
 
            # No match; leave the original string  untouched but return
            # success as there was nothing wrong with the pattern

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/collab-maint/devscripts.git

_______________________________________________
devscripts-devel mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/devscripts-devel

Reply via email to