* [PATCH v4 0/2] event: Inject empty lines to make code match lineno in filename
@ 2024-01-09 7:45 liezhi.yang
2024-01-09 7:45 ` [PATCH v4 1/2] bitbake: " liezhi.yang
2024-01-09 7:45 ` [PATCH v4 2/2] bitbake: tests/event: Add test_lineno_in_eventhandler liezhi.yang
0 siblings, 2 replies; 5+ messages in thread
From: liezhi.yang @ 2024-01-09 7:45 UTC (permalink / raw)
To: bitbake-devel
From: Robert Yang <liezhi.yang@windriver.com>
* V4:
- Check lineno is not None
- Add a testcase for it
// Robert
The following changes since commit 070aa227057e4913cf77c2465393a5a8398d5641:
bitbake: toaster/tests: Delay driver first action on create new project page (2024-01-07 22:59:55 +0000)
are available in the Git repository at:
https://github.com/robertlinux/yocto rbt/event
https://github.com/robertlinux/yocto/tree/rbt/event
Robert Yang (2):
bitbake: event: Inject empty lines to make code match lineno in
filename
bitbake: tests/event: Add test_lineno_in_eventhandler
bitbake/lib/bb/event.py | 5 +++--
bitbake/lib/bb/tests/event.py | 24 ++++++++++++++++++++++++
2 files changed, 27 insertions(+), 2 deletions(-)
--
2.35.5
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH v4 1/2] bitbake: event: Inject empty lines to make code match lineno in filename 2024-01-09 7:45 [PATCH v4 0/2] event: Inject empty lines to make code match lineno in filename liezhi.yang @ 2024-01-09 7:45 ` liezhi.yang 2024-01-09 7:45 ` [PATCH v4 2/2] bitbake: tests/event: Add test_lineno_in_eventhandler liezhi.yang 1 sibling, 0 replies; 5+ messages in thread From: liezhi.yang @ 2024-01-09 7:45 UTC (permalink / raw) To: bitbake-devel From: Robert Yang <liezhi.yang@windriver.com> So that we can get the correct error messages. * In python 3.10.9, the error message was: ERROR: Unable to register event handler 'defaultbase_eventhandler': File "/path/to/poky/meta/classes-global/base.bbclass", line 4 # SPDX-License-Identifier: MIT ^^^^^ SyntaxError: invalid syntax This is hard to debug since the error line number 4 is incorrect, but nothing is wrong with the code in line 4. * Now the error message and lineno is correct: ERROR: Unable to register event handler 'defaultbase_eventhandler': File "/path/to/poky/meta/classes-global/base.bbclass", line 256 an error line ^^^^^ SyntaxError: invalid syntax And no impact on parsing time: * Before: $ rm -fr cache tmp; time bitbake -p real 0m27.254s * Now: $ rm -fr cache tmp; time bitbake -p real 0m27.200s Signed-off-by: Robert Yang <liezhi.yang@windriver.com> --- bitbake/lib/bb/event.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bitbake/lib/bb/event.py b/bitbake/lib/bb/event.py index f8acacd80d1..4761c868800 100644 --- a/bitbake/lib/bb/event.py +++ b/bitbake/lib/bb/event.py @@ -257,14 +257,15 @@ def register(name, handler, mask=None, filename=None, lineno=None, data=None): # handle string containing python code if isinstance(handler, str): tmp = "def %s(e, d):\n%s" % (name, handler) + # Inject empty lines to make code match lineno in filename + if lineno is not None: + tmp = "\n" * (lineno-1) + tmp try: code = bb.methodpool.compile_cache(tmp) if not code: if filename is None: filename = "%s(e, d)" % name code = compile(tmp, filename, "exec", ast.PyCF_ONLY_AST) - if lineno is not None: - ast.increment_lineno(code, lineno-1) code = compile(code, filename, "exec") bb.methodpool.compile_cache_add(tmp, code) except SyntaxError: -- 2.35.5 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v4 2/2] bitbake: tests/event: Add test_lineno_in_eventhandler 2024-01-09 7:45 [PATCH v4 0/2] event: Inject empty lines to make code match lineno in filename liezhi.yang 2024-01-09 7:45 ` [PATCH v4 1/2] bitbake: " liezhi.yang @ 2024-01-09 7:45 ` liezhi.yang 2024-01-09 22:08 ` [bitbake-devel] " Christopher Larson 1 sibling, 1 reply; 5+ messages in thread From: liezhi.yang @ 2024-01-09 7:45 UTC (permalink / raw) To: bitbake-devel From: Robert Yang <liezhi.yang@windriver.com> Add test_lineno_in_eventhandler to test lineno in eventhandler. Signed-off-by: Robert Yang <liezhi.yang@windriver.com> --- bitbake/lib/bb/tests/event.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/bitbake/lib/bb/tests/event.py b/bitbake/lib/bb/tests/event.py index d959f2d95db..ef61891d302 100644 --- a/bitbake/lib/bb/tests/event.py +++ b/bitbake/lib/bb/tests/event.py @@ -13,6 +13,7 @@ import pickle import threading import time import unittest +import tempfile from unittest.mock import Mock from unittest.mock import call @@ -468,6 +469,8 @@ class EventClassesTest(unittest.TestCase): def setUp(self): bb.event.worker_pid = EventClassesTest._worker_pid + self.d = bb.data.init() + bb.parse.siggen = bb.siggen.init(self.d) def test_Event(self): """ Test the Event base class """ @@ -950,3 +953,24 @@ class EventClassesTest(unittest.TestCase): event = bb.event.FindSigInfoResult(result) self.assertEqual(event.result, result) self.assertEqual(event.pid, EventClassesTest._worker_pid) + + def test_lineno_in_eventhandler(self): + # The error lineno is 5, not 4 since the first line is '\n' + error_line = """ +# Comment line1 +# Comment line2 +python test_lineno_in_eventhandler() { + This is an error line +} +addhandler test_lineno_in_eventhandler +test_lineno_in_eventhandler[eventmask] = "bb.event.ConfigParsed" +""" + + with self.assertLogs() as logs: + f = tempfile.NamedTemporaryFile(suffix = '.bb') + f.write(bytes(error_line, "utf-8")) + f.flush() + d = bb.parse.handle(f.name, self.d)[''] + + output = "".join(logs.output) + self.assertTrue(" line 5\n" in output) -- 2.35.5 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [bitbake-devel] [PATCH v4 2/2] bitbake: tests/event: Add test_lineno_in_eventhandler 2024-01-09 7:45 ` [PATCH v4 2/2] bitbake: tests/event: Add test_lineno_in_eventhandler liezhi.yang @ 2024-01-09 22:08 ` Christopher Larson 2024-01-10 9:45 ` Robert Yang 0 siblings, 1 reply; 5+ messages in thread From: Christopher Larson @ 2024-01-09 22:08 UTC (permalink / raw) To: liezhi.yang; +Cc: bitbake-devel [-- Attachment #1: Type: text/plain, Size: 3359 bytes --] This does look like a good idea, though I wonder if injecting newlines is truly the best approach. SyntaxError is a bit of a special case, since it occurs before we have the ast to adjust the lineno, but it can be corrected without string manipulation if you catch and re-raise SyntaxError. Ex: def _syntaxerror_offset(value, lineoffset): """Adjust the line number in a SyntaxError exception""" if lineoffset: msg, (efname, elineno, eoffset, badline) = value.args value.args = (msg, (efname, elineno + lineoffset, eoffset, badline)) value.lineno = elineno + lineoffset — Christopher Larson chris_larson@mentor.com, chris.larson@siemens.com, kergoth@gmail.com Principal Software Engineer, Embedded Linux Solutions, Siemens Digital Industries Software > On Jan 9, 2024, at 12:45 AM, Robert Yang via lists.openembedded.org <liezhi.yang=windriver.com@lists.openembedded.org> wrote: > > From: Robert Yang <liezhi.yang@windriver.com> > > Add test_lineno_in_eventhandler to test lineno in eventhandler. > > Signed-off-by: Robert Yang <liezhi.yang@windriver.com> > --- > bitbake/lib/bb/tests/event.py | 24 ++++++++++++++++++++++++ > 1 file changed, 24 insertions(+) > > diff --git a/bitbake/lib/bb/tests/event.py b/bitbake/lib/bb/tests/event.py > index d959f2d95db..ef61891d302 100644 > --- a/bitbake/lib/bb/tests/event.py > +++ b/bitbake/lib/bb/tests/event.py > @@ -13,6 +13,7 @@ import pickle > import threading > import time > import unittest > +import tempfile > from unittest.mock import Mock > from unittest.mock import call > > @@ -468,6 +469,8 @@ class EventClassesTest(unittest.TestCase): > > def setUp(self): > bb.event.worker_pid = EventClassesTest._worker_pid > + self.d = bb.data.init() > + bb.parse.siggen = bb.siggen.init(self.d) > > def test_Event(self): > """ Test the Event base class """ > @@ -950,3 +953,24 @@ class EventClassesTest(unittest.TestCase): > event = bb.event.FindSigInfoResult(result) > self.assertEqual(event.result, result) > self.assertEqual(event.pid, EventClassesTest._worker_pid) > + > + def test_lineno_in_eventhandler(self): > + # The error lineno is 5, not 4 since the first line is '\n' > + error_line = """ > +# Comment line1 > +# Comment line2 > +python test_lineno_in_eventhandler() { > + This is an error line > +} > +addhandler test_lineno_in_eventhandler > +test_lineno_in_eventhandler[eventmask] = "bb.event.ConfigParsed" > +""" > + > + with self.assertLogs() as logs: > + f = tempfile.NamedTemporaryFile(suffix = '.bb') > + f.write(bytes(error_line, "utf-8")) > + f.flush() > + d = bb.parse.handle(f.name, self.d)[''] > + > + output = "".join(logs.output) > + self.assertTrue(" line 5\n" in output) > -- > 2.35.5 > > > -=-=-=-=-=-=-=-=-=-=-=- > Links: You receive all messages sent to this group. > View/Reply Online (#15756): https://lists.openembedded.org/g/bitbake-devel/message/15756 > Mute This Topic: https://lists.openembedded.org/mt/103616263/3617123 > Group Owner: bitbake-devel+owner@lists.openembedded.org > Unsubscribe: https://lists.openembedded.org/g/bitbake-devel/unsub [kergoth@gmail.com] > -=-=-=-=-=-=-=-=-=-=-=- > [-- Attachment #2: Type: text/html, Size: 4699 bytes --] ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [bitbake-devel] [PATCH v4 2/2] bitbake: tests/event: Add test_lineno_in_eventhandler 2024-01-09 22:08 ` [bitbake-devel] " Christopher Larson @ 2024-01-10 9:45 ` Robert Yang 0 siblings, 0 replies; 5+ messages in thread From: Robert Yang @ 2024-01-10 9:45 UTC (permalink / raw) To: Christopher Larson; +Cc: bitbake-devel Hi Christop, On 1/10/24 6:08 AM, Christop her Larson wrote: > This does look like a good idea, though I wonder if injecting newlines is truly > the best approach. SyntaxError is a bit of a special case, since it occurs Injecting newlines are much simple, and it also can catch more errors such as IndentationError, now the IndentationError can be reported correctly: ERROR: Unable to register event handler 'defaultbase_eventhandler': File "/path/to/poky/meta/classes-global/base.bbclass", line 259 d.setVar("ORIGNATIVELSBSTRING", d.getVar("NATIVELSBSTRING", False)) ^ IndentationError: unindent does not match any outer indentation level Such errors were very hard to debug. The _syntaxerror_offset may work, but it is much more complicated than inject newlines. // Robert > before we have the ast to adjust the lineno, but it can be corrected without > string manipulation if you catch and re-raise SyntaxError. Ex: > > def _syntaxerror_offset(value, lineoffset): > """Adjust the line number in a SyntaxError exception""" > if lineoffset: > msg, (efname, elineno, eoffset, badline) = value.args > value.args = (msg, (efname, elineno + lineoffset, eoffset, badline)) > value.lineno = elineno + lineoffset > > — > Christopher Larson > chris_larson@mentor.com, chris.larson@siemens.com, kergoth@gmail.com > Principal Software Engineer, Embedded Linux Solutions, Siemens Digital > Industries Software > >> On Jan 9, 2024, at 12:45 AM, Robert Yang via lists.openembedded.org >> <https://urldefense.com/v3/__http://lists.openembedded.org__;!!AjveYdw8EvQ!YGDlH3GcpHwxON5oeaacPDSvoRd4ElezyHIHZpb7-vl5gV_Ip6p6zmPaMM2MO9LWGJTKQza6t0DNEMRXmNnO$> <liezhi.yang=windriver.com@lists.openembedded.org> wrote: >> >> From: Robert Yang <liezhi.yang@windriver.com> >> >> Add test_lineno_in_eventhandler to test lineno in eventhandler. >> >> Signed-off-by: Robert Yang <liezhi.yang@windriver.com> >> --- >> bitbake/lib/bb/tests/event.py >> <https://urldefense.com/v3/__http://event.py__;!!AjveYdw8EvQ!YGDlH3GcpHwxON5oeaacPDSvoRd4ElezyHIHZpb7-vl5gV_Ip6p6zmPaMM2MO9LWGJTKQza6t0DNENKyLym7$> | 24 ++++++++++++++++++++++++ >> 1 file changed, 24 insertions(+) >> >> diff --git a/bitbake/lib/bb/tests/event.py >> <https://urldefense.com/v3/__http://event.py__;!!AjveYdw8EvQ!YGDlH3GcpHwxON5oeaacPDSvoRd4ElezyHIHZpb7-vl5gV_Ip6p6zmPaMM2MO9LWGJTKQza6t0DNENKyLym7$> b/bitbake/lib/bb/tests/event.py <https://urldefense.com/v3/__http://event.py__;!!AjveYdw8EvQ!YGDlH3GcpHwxON5oeaacPDSvoRd4ElezyHIHZpb7-vl5gV_Ip6p6zmPaMM2MO9LWGJTKQza6t0DNENKyLym7$> >> index d959f2d95db..ef61891d302 100644 >> --- a/bitbake/lib/bb/tests/event.py >> <https://urldefense.com/v3/__http://event.py__;!!AjveYdw8EvQ!YGDlH3GcpHwxON5oeaacPDSvoRd4ElezyHIHZpb7-vl5gV_Ip6p6zmPaMM2MO9LWGJTKQza6t0DNENKyLym7$> >> +++ b/bitbake/lib/bb/tests/event.py >> <https://urldefense.com/v3/__http://event.py__;!!AjveYdw8EvQ!YGDlH3GcpHwxON5oeaacPDSvoRd4ElezyHIHZpb7-vl5gV_Ip6p6zmPaMM2MO9LWGJTKQza6t0DNENKyLym7$> >> @@ -13,6 +13,7 @@ import pickle >> import threading >> import time >> import unittest >> +import tempfile >> from unittest.mock import Mock >> from unittest.mock import call >> >> @@ -468,6 +469,8 @@ class EventClassesTest(unittest.TestCase): >> >> def setUp(self): >> bb.event.worker_pid = EventClassesTest._worker_pid >> + self.d = bb.data.init() >> + bb.parse.siggen = bb.siggen.init(self.d) >> >> def test_Event(self): >> """ Test the Event base class """ >> @@ -950,3 +953,24 @@ class EventClassesTest(unittest.TestCase): >> event = bb.event.FindSigInfoResult(result) >> self.assertEqual(event.result, result) >> self.assertEqual(event.pid >> <https://urldefense.com/v3/__http://event.pid__;!!AjveYdw8EvQ!YGDlH3GcpHwxON5oeaacPDSvoRd4ElezyHIHZpb7-vl5gV_Ip6p6zmPaMM2MO9LWGJTKQza6t0DNENhxad__$>, EventClassesTest._worker_pid) >> + >> + def test_lineno_in_eventhandler(self): >> + # The error lineno is 5, not 4 since the first line is '\n' >> + error_line = """ >> +# Comment line1 >> +# Comment line2 >> +python test_lineno_in_eventhandler() { >> + This is an error line >> +} >> +addhandler test_lineno_in_eventhandler >> +test_lineno_in_eventhandler[eventmask] = "bb.event.ConfigParsed" >> +""" >> + >> + with self.assertLogs() as logs: >> + f = tempfile.NamedTemporaryFile(suffix = '.bb') >> + f.write(bytes(error_line, "utf-8")) >> + f.flush() >> + d = bb.parse.handle(f.name >> <https://urldefense.com/v3/__http://f.name__;!!AjveYdw8EvQ!YGDlH3GcpHwxON5oeaacPDSvoRd4ElezyHIHZpb7-vl5gV_Ip6p6zmPaMM2MO9LWGJTKQza6t0DNEDC-ZnzD$>, self.d)[''] >> + >> + output = "".join(logs.output) >> + self.assertTrue(" line 5\n" in output) >> -- >> 2.35.5 >> >> >> -=-=-=-=-=-=-=-=-=-=-=- >> Links: You receive all messages sent to this group. >> View/Reply Online (#15756): >> https://lists.openembedded.org/g/bitbake-devel/message/15756 >> <https://urldefense.com/v3/__https://lists.openembedded.org/g/bitbake-devel/message/15756__;!!AjveYdw8EvQ!YGDlH3GcpHwxON5oeaacPDSvoRd4ElezyHIHZpb7-vl5gV_Ip6p6zmPaMM2MO9LWGJTKQza6t0DNEHCVD821$> >> Mute This Topic: https://lists.openembedded.org/mt/103616263/3617123 >> <https://urldefense.com/v3/__https://lists.openembedded.org/mt/103616263/3617123__;!!AjveYdw8EvQ!YGDlH3GcpHwxON5oeaacPDSvoRd4ElezyHIHZpb7-vl5gV_Ip6p6zmPaMM2MO9LWGJTKQza6t0DNEIbsb3Sa$> >> Group Owner: bitbake-devel+owner@lists.openembedded.org >> Unsubscribe: https://lists.openembedded.org/g/bitbake-devel/unsub >> <https://urldefense.com/v3/__https://lists.openembedded.org/g/bitbake-devel/unsub__;!!AjveYdw8EvQ!YGDlH3GcpHwxON5oeaacPDSvoRd4ElezyHIHZpb7-vl5gV_Ip6p6zmPaMM2MO9LWGJTKQza6t0DNEG8cswfl$> [kergoth@gmail.com] >> -=-=-=-=-=-=-=-=-=-=-=- >> > ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2024-01-10 9:46 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-01-09 7:45 [PATCH v4 0/2] event: Inject empty lines to make code match lineno in filename liezhi.yang 2024-01-09 7:45 ` [PATCH v4 1/2] bitbake: " liezhi.yang 2024-01-09 7:45 ` [PATCH v4 2/2] bitbake: tests/event: Add test_lineno_in_eventhandler liezhi.yang 2024-01-09 22:08 ` [bitbake-devel] " Christopher Larson 2024-01-10 9:45 ` Robert Yang
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.