* [PATCH 2/2] bb.parse: properly error out on filesystem errors
2015-07-31 18:16 [PATCH 1/2] bb.cookerdata: don't show traceback for ParseError/ExpansionError Christopher Larson
@ 2015-07-31 18:16 ` Christopher Larson
2015-07-31 18:17 ` [PATCH 1/2] bb.cookerdata: don't show traceback for ParseError/ExpansionError Christopher Larson
1 sibling, 0 replies; 3+ messages in thread
From: Christopher Larson @ 2015-07-31 18:16 UTC (permalink / raw)
To: bitbake-devel; +Cc: Christopher Larson
From: Christopher Larson <chris_larson@mentor.com>
We've had a long-standing bug where a legitimate error reading a file (IOError
or OSError) is always suppressed as though it was a 'file not found' case. As
a concrete example, if you do a `chmod 000 conf/local.conf`, it'll silently
not parse local.conf, rather than erroring to let the user know about the
problem.
Fix this by handling the ENOENT case specifically.
Signed-off-by: Christopher Larson <chris_larson@mentor.com>
---
lib/bb/parse/__init__.py | 7 ++++---
lib/bb/parse/parse_py/ConfHandler.py | 21 ++++++++++++++-------
2 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/lib/bb/parse/__init__.py b/lib/bb/parse/__init__.py
index 4a78e18..1becaa4 100644
--- a/lib/bb/parse/__init__.py
+++ b/lib/bb/parse/__init__.py
@@ -26,9 +26,10 @@ File parsers for the BitBake build tools.
handlers = []
+import errno
+import logging
import os
import stat
-import logging
import bb
import bb.utils
import bb.siggen
@@ -122,12 +123,12 @@ def resolve_file(fn, d):
for af in attempts:
mark_dependency(d, af)
if not newfn:
- raise IOError("file %s not found in %s" % (fn, bbpath))
+ raise IOError(errno.ENOENT, "file %s not found in %s" % (fn, bbpath))
fn = newfn
mark_dependency(d, fn)
if not os.path.isfile(fn):
- raise IOError("file %s not found" % fn)
+ raise IOError(errno.ENOENT, "file %s not found" % fn)
return fn
diff --git a/lib/bb/parse/parse_py/ConfHandler.py b/lib/bb/parse/parse_py/ConfHandler.py
index 250a557..fbd75b1 100644
--- a/lib/bb/parse/parse_py/ConfHandler.py
+++ b/lib/bb/parse/parse_py/ConfHandler.py
@@ -24,8 +24,9 @@
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-import re, os
-import logging
+import errno
+import re
+import os
import bb.utils
from bb.parse import ParseError, resolve_file, ast, logger, handle
@@ -92,11 +93,17 @@ def include(parentfn, fn, lineno, data, error_out):
logger.warn("Duplicate inclusion for %s in %s" % (fn, data.getVar('FILE', True)))
try:
- ret = bb.parse.handle(fn, data, True)
- except (IOError, OSError):
- if error_out:
- raise ParseError("Could not %(error_out)s file %(fn)s" % vars(), parentfn, lineno)
- logger.debug(2, "CONF file '%s' not found", fn)
+ bb.parse.handle(fn, data, True)
+ except (IOError, OSError) as exc:
+ if exc.errno == errno.ENOENT:
+ if error_out:
+ raise ParseError("Could not %s file %s" % (error_out, fn), parentfn, lineno)
+ logger.debug(2, "CONF file '%s' not found", fn)
+ else:
+ if error_out:
+ raise ParseError("Could not %s file %s: %s" % (error_out, fn, exc.strerror), parentfn, lineno)
+ else:
+ raise ParseError("Error parsing %s: %s" % (fn, exc.strerror), parentfn, lineno)
# We have an issue where a UI might want to enforce particular settings such as
# an empty DISTRO variable. If configuration files do something like assigning
--
2.2.1
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH 1/2] bb.cookerdata: don't show traceback for ParseError/ExpansionError
2015-07-31 18:16 [PATCH 1/2] bb.cookerdata: don't show traceback for ParseError/ExpansionError Christopher Larson
2015-07-31 18:16 ` [PATCH 2/2] bb.parse: properly error out on filesystem errors Christopher Larson
@ 2015-07-31 18:17 ` Christopher Larson
1 sibling, 0 replies; 3+ messages in thread
From: Christopher Larson @ 2015-07-31 18:17 UTC (permalink / raw)
To: bitbake-devel@lists.openembedded.org; +Cc: Christopher Larson
[-- Attachment #1: Type: text/plain, Size: 4063 bytes --]
On Fri, Jul 31, 2015 at 11:16 AM, Christopher Larson <kergoth@gmail.com>
wrote:
> From: Christopher Larson <chris_larson@mentor.com>
>
> Tracebacks are of extremely limited usefulness in this context. The
> exceptions
> carry the necessary context already, and the user doesn't care about the
> calls
> in bitbake internals that led to an expansion or parse failure.
>
> Signed-off-by: Christopher Larson <chris_larson@mentor.com>
Example of a parse error:
ERROR: Traceback (most recent call last):
File "/scratch/poky/bitbake/lib/bb/cookerdata.py", line 175, in
wrapped
return func(fn, *args)
File "/scratch/poky/bitbake/lib/bb/cookerdata.py", line 185, in
parse_config_file
return bb.parse.handle(fn, data, include)
File "/scratch/poky/bitbake/lib/bb/parse/__init__.py", line 108, in
handle
return h['handle'](fn, data, include)
File "/scratch/poky/bitbake/lib/bb/parse/parse_py/ConfHandler.py",
line 155, in handle
statements.eval(data)
File "/scratch/poky/bitbake/lib/bb/parse/ast.py", line 39, in eval
statement.eval(data)
File "/scratch/poky/bitbake/lib/bb/parse/ast.py", line 63, in eval
bb.parse.ConfHandler.include(self.filename, s, self.lineno, data,
False)
File "/scratch/poky/bitbake/lib/bb/parse/parse_py/ConfHandler.py",
line 106, in include
raise ParseError("Error parsing %s: %s" % (fn, exc.strerror),
parentfn, lineno)
ParseError: ParseError at /scratch/poky/meta/conf/bitbake.conf:679:
Error parsing /scratch/build/conf/local.conf: Permission denied
ERROR: Unable to parse conf/bitbake.conf: ParseError at
/scratch/poky/meta/conf/bitbake.conf:679: Error parsing
/scratch/build/conf/local.
conf: Permission denied
Example of an expansion error:
ERROR: Traceback (most recent call last):
File "/scratch/poky/bitbake/lib/bb/cookerdata.py", line 175, in
wrapped
return func(fn, *args)
File "/scratch/poky/bitbake/lib/bb/cookerdata.py", line 185, in
parse_config_file
return bb.parse.handle(fn, data, include)
File "/scratch/poky/bitbake/lib/bb/parse/__init__.py", line 108, in
handle
return h['handle'](fn, data, include)
File "/scratch/poky/bitbake/lib/bb/parse/parse_py/ConfHandler.py",
line 155, in handle
statements.eval(data)
File "/scratch/poky/bitbake/lib/bb/parse/ast.py", line 39, in eval
statement.eval(data)
File "/scratch/poky/bitbake/lib/bb/parse/ast.py", line 63, in eval
bb.parse.ConfHandler.include(self.filename, s, self.lineno, data,
False)
File "/scratch/poky/bitbake/lib/bb/parse/parse_py/ConfHandler.py",
line 96, in include
bb.parse.handle(fn, data, True)
File "/scratch/poky/bitbake/lib/bb/parse/__init__.py", line 108, in
handle
return h['handle'](fn, data, include)
File "/scratch/poky/bitbake/lib/bb/parse/parse_py/ConfHandler.py",
line 155, in handle
statements.eval(data)
File "/scratch/poky/bitbake/lib/bb/parse/ast.py", line 39, in eval
statement.eval(data)
File "/scratch/poky/bitbake/lib/bb/parse/ast.py", line 111, in eval
val = e.expand(groupd["value"], key + "[:=]")
File "/scratch/poky/bitbake/lib/bb/data_smart.py", line 380, in expand
return self.expandWithRefs(s, varname).value
File "/scratch/poky/bitbake/lib/bb/data_smart.py", line 370, in
expandWithRefs
raise ExpansionError(varname, s, exc)
ExpansionError: Failure expanding variable FOO[:=], expression was
${@alpha beta theta} which triggered exception SyntaxError: invalid syntax
(FOO[:=], line 1)
ERROR: Unable to parse conf/bitbake.conf: Failure expanding variable
FOO[:=], expression was ${@alpha beta theta} which triggered exception
SyntaxError: invalid syntax (FOO[:=]
, line 1)
--
Christopher Larson
kergoth at gmail dot com
Founder - BitBake, OpenEmbedded, OpenZaurus
Maintainer - Tslib
Senior Software Engineer, Mentor Graphics
[-- Attachment #2: Type: text/html, Size: 5455 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread