OpenPKG CVS Repository
http://cvs.openpkg.org/
____________________________________________________________________________
Server: cvs.openpkg.org Name: Ralf S. Engelschall
Root: /e/openpkg/cvs Email: [EMAIL PROTECTED]
Module: openpkg-re Date: 23-Jul-2003 15:34:17
Branch: HEAD Handle: 2003072314341600
Modified files:
openpkg-re speclint.pl
Log:
ok, and now make sure all subshells use correct error handling
Summary:
Revision Changes Path
1.48 +58 -1 openpkg-re/speclint.pl
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: openpkg-re/speclint.pl
============================================================================
$ cvs diff -u -r1.47 -r1.48 speclint.pl
--- openpkg-re/speclint.pl 23 Jul 2003 07:07:01 -0000 1.47
+++ openpkg-re/speclint.pl 23 Jul 2003 13:34:16 -0000 1.48
@@ -830,7 +830,64 @@
}
}
- # TODO: parenthesis style for sub-shells
+ # check for sub-shell parenthesis style
+ # (this is such complicated because the Bourne Shell has a
+ # construct "case <value> in <pattern> ) <script> ;; ... esac"
+ # where the closing parenthesis makes heavy problems for our
+ # check. So we first have to get rid of this. Unfortunately this
+ # is again not easy because there exists nested(!) case/esac
+ # constructs. Hence, we have to use a small recursive descent
+ # parser which replaces the ")" in case/esac constructs with
+ # "PCLOSE". A similar thing is done with string literals, although
+ # here the job is more trivial).
+ if ($section !~ m/^\%files$/s) {
+ $done = $outer_done; $this = ''; $todo = $outer_this;
+ $todo =~ s/`[^`]*`/STRING/sg;
+ $todo =~ s/'[^']*'/STRING/sg;
+ $todo =~ s/"[^"]*"/STRING/sg;
+ $todo = (&parse_sh("", $todo))[0];
+ sub parse_sh {
+ my ($done, $todo) = @_;
+ while ($todo =~ m/^(.*?)(case|;;)/s) {
+ if ($2 eq 'case') {
+ ($done, $todo) = &parse_case($done.$1, $2.$');
+ }
+ else {
+ ($done, $todo) = ($done.$1, $2.$');
+ return ($done, $todo);
+ }
+ }
+ ($done, $todo) = ($done . $todo, "");
+ return ($done, $todo);
+ }
+ sub parse_case {
+ my ($done, $todo) = @_;
+ $todo =~ m|^\s*case\s+\S+\s+in\b|s or return (undef, undef);
+ ($done, $todo) = ($done . $&, $');
+ while ($todo =~ m|^(\s*[^)\n]+)(\))|s) {
+ ($done, $todo) = ($done . $1 . "PCLOSE", $');
+ ($done, $todo) = &parse_sh($done, $todo) or return (undef, undef);
+ $todo =~ m|^\s*;;|s or return (undef, undef);
+ ($done, $todo) = ($done . $&, $');
+ }
+ $todo =~ m|^\s*esac|s or return (undef, undef);
+ ($done, $todo) = ($done . $&, $');
+ return ($done, $todo);
+ }
+ if ($todo eq '') {
+ &lint_warning($file, $outer_done, $outer_this,
+ "unable to correctly parse case/esac constructs in
shell-script" .
+ " (sub-shell parenthesis check skipped)");
+ }
+ else {
+ while ($todo =~ m/\)[ \t]*\n/s) {
+ $done .= $`; $this = $&; $todo = $';
+ &lint_warning($file, $done, $this, "problematic sub-shell construct
without error handling " .
+ "(use \"...) || exit \$?\" to make sure it correctly
exits on nested failure)");
+ $done .= $this;
+ }
+ }
+ }
}
## _________________________________________________________________
@@ .
______________________________________________________________________
The OpenPKG Project www.openpkg.org
CVS Repository Commit List [EMAIL PROTECTED]