[oe-commits] [bitbake] 04/04: bitbake: pysh: Improve error handling for shell code

git at git.openembedded.org git at git.openembedded.org
Sat Dec 8 22:39:27 UTC 2018


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

rpurdie pushed a commit to branch master-next
in repository bitbake.

commit 44790597951638e32eb1672de2e40bd5a603326b
Author: Robert Yang <liezhi.yang at windriver.com>
AuthorDate: Tue Dec 4 10:06:03 2018 +0800

    bitbake: pysh: Improve error handling for shell code
    
    The p_error() is used for printing errors when parse shell code, but it can't
    the EOF error correctly
    
    - Add the following lines to quilt.inc
      do_configure_prepend () {
          find ${s} -name "*.in" -exec sed -i -e "1s,^#\!.*@perl@ -w$,#\! @perl@\nuse warnings;," {} \;
          if [ hello ]; then
      }
    
    - Before the patch:
      $ rm -fr cache/ tmp/cache/; bitbake -p
      [snip]
      WARNING: /path/to/quilt/quilt-native_0.65.bb: Error during finalise of /path/to/quilt/quilt-native_0.65.bb
      [snip]
      bb.pysh.sherrors.ShellSyntaxError: None
      followed by:
    
      We can see that this isn't easy to debug, let p_error() check wheter it is EOF
      and print appropriate errors can improve the error message. And don't let
      codeparser.py except pyshlex.NeedMore (in fact, it never worked since p_error()
      only raise ShellSyntaxError), but make it print the last 5 lines which might be
      useful for debuging.
    
    - After the patch
      $ rm -fr cache/ tmp/cache/; bitbake -p
      [snip]
      ERROR: /path/to/quilt/quilt_0.65.bb: Error during parse shell code, the last 5 lines are:
          find /path/to/quilt/0.65-r0/quilt-0.65 -name "*.in" -exec sed -i -e "1s,^#\!.*@PERL@ -w$,#\! @PERL@\nuse warnings;," {} \;
          if [ hello ]; then
          autotools_do_configure
          sed -e 's,^COMPAT_SYMLINKS.*:=.*,COMPAT_SYMLINKS    :=,' -i /path/to/quilt/0.65-r0/quilt-0.65/Makefile
      [snip]
        File "/path/to/bb/pysh/pyshyacc.py", line 649, in p_error(p=None):
                   w('Unexpected EOF')
          >    raise sherrors.ShellSyntaxError(''.join(msg))
    
      bb.pysh.sherrors.ShellSyntaxError: Unexpected EOF
    
    Signed-off-by: Robert Yang <liezhi.yang at windriver.com>
    Signed-off-by: Richard Purdie <richard.purdie at linuxfoundation.org>
---
 lib/bb/codeparser.py    |  5 +++--
 lib/bb/pysh/pyshyacc.py | 17 ++++++++++-------
 2 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/lib/bb/codeparser.py b/lib/bb/codeparser.py
index ddd1b97..3f8ac1d 100644
--- a/lib/bb/codeparser.py
+++ b/lib/bb/codeparser.py
@@ -368,8 +368,9 @@ class ShellParser():
     def _parse_shell(self, value):
         try:
             tokens, _ = pyshyacc.parse(value, eof=True, debug=False)
-        except pyshlex.NeedMore:
-            raise sherrors.ShellSyntaxError("Unexpected EOF")
+        except Exception:
+            bb.error('Error during parse shell code, the last 5 lines are:\n%s' % '\n'.join(value.split('\n')[-5:]))
+            raise
 
         self.process_tokens(tokens)
 
diff --git a/lib/bb/pysh/pyshyacc.py b/lib/bb/pysh/pyshyacc.py
index ba4cefd..de565dc 100644
--- a/lib/bb/pysh/pyshyacc.py
+++ b/lib/bb/pysh/pyshyacc.py
@@ -636,13 +636,16 @@ def p_empty(p):
 def p_error(p):
     msg = []
     w = msg.append
-    w('%r\n' % p)
-    w('followed by:\n')
-    for i in range(5):
-        n = yacc.token()
-        if not n:
-            break
-        w('  %r\n' % n)
+    if p:
+        w('%r\n' % p)
+        w('followed by:\n')
+        for i in range(5):
+            n = yacc.token()
+            if not n:
+                break
+            w('  %r\n' % n)
+    else:
+        w('Unexpected EOF')
     raise sherrors.ShellSyntaxError(''.join(msg))
 
 # Build the parser

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Openembedded-commits mailing list