[OE-core] [for-denzil] bitbake: command: add error to return of runCommand
Richard Purdie
richard.purdie at linuxfoundation.org
Tue Dec 18 21:28:05 UTC 2012
On Tue, 2012-12-18 at 11:18 -0600, Matthew McClintock wrote:
> From: Christopher Larson <chris_larson at mentor.com>
>
> Currently, command.py can return an error message from runCommand, due to
> being unable to run the command, yet few of our UIs (just hob) can handle it
> today. This can result in seeing a TypeError with traceback in certain rare
> circumstances.
>
> To resolve this, we need a clean way to get errors back from runCommand,
> without having to isinstance() the return value. This implements such a thing
> by making runCommand also return an error (or None if no error occurred).
>
> As runCommand now has a method of returning errors, we can also alter the
> getCmdLineAction bits such that the returned value is just the action, not an
> additional message. If a sync command wants to return an error, it raises
> CommandError(message), and the message will be passed to the caller
> appropriately.
>
> Example Usage:
>
> result, error = server.runCommand(...)
> if error:
> log.error('Unable to run command: %s' % error)
> return 1
>
> (Bitbake rev: 717831b8315cb3904d9b590e633000bc897e8fb6)
This patch has bugs in it. See recent fixes in master.
> Signed-off-by: Christopher Larson <chris_larson at mentor.com>
> Signed-off-by: Richard Purdie <richard.purdie at linuxfoundation.org>
> ---
> bitbake/lib/bb/command.py | 43 +++++++++++++++----------
> bitbake/lib/bb/server/process.py | 2 +-
> bitbake/lib/bb/ui/crumbs/hobeventhandler.py | 5 ++-
> bitbake/lib/bb/ui/depexp.py | 38 ++++++++++++++--------
> bitbake/lib/bb/ui/goggle.py | 17 +++++-----
> bitbake/lib/bb/ui/knotty.py | 45 ++++++++++++++++++---------
> bitbake/lib/bb/ui/ncurses.py | 21 ++++++++-----
> 7 files changed, 112 insertions(+), 59 deletions(-)
>
> diff --git a/bitbake/lib/bb/command.py b/bitbake/lib/bb/command.py
> index fd8912a..00b854e 100644
> --- a/bitbake/lib/bb/command.py
> +++ b/bitbake/lib/bb/command.py
> @@ -44,6 +44,9 @@ class CommandFailed(CommandExit):
> self.error = message
> CommandExit.__init__(self, 1)
>
> +class CommandError(Exception):
> + pass
> +
> class Command:
> """
> A queue of asynchronous commands for bitbake
> @@ -57,21 +60,25 @@ class Command:
> self.currentAsyncCommand = None
>
> def runCommand(self, commandline):
> - try:
> - command = commandline.pop(0)
> - if command in CommandsSync.__dict__:
> - # Can run synchronous commands straight away
> - return getattr(CommandsSync, command)(self.cmds_sync, self, commandline)
> - if self.currentAsyncCommand is not None:
> - return "Busy (%s in progress)" % self.currentAsyncCommand[0]
> - if command not in CommandsAsync.__dict__:
> - return "No such command"
> - self.currentAsyncCommand = (command, commandline)
> - self.cooker.server_registration_cb(self.cooker.runCommands, self.cooker)
> - return True
> - except:
> - import traceback
> - return traceback.format_exc()
> + command = commandline.pop(0)
> + if hasattr(CommandsSync, command):
> + # Can run synchronous commands straight away
> + command_method = getattr(self.cmds_sync, command)
> + try:
> + result = command_method(self, commandline)
> + except CommandError as exc:
> + return None, exc.args[0]
> + except Exception:
> + return None, traceback.format_exc()
Missing import traceback.
> + else:
> + return result, None
> + if self.currentAsyncCommand is not None:
> + return None, "Busy (%s in progress)" % self.currentAsyncCommand[0]
> + if command not in CommandsAsync.__dict__:
> + return None, "No such command"
> + self.currentAsyncCommand = (command, commandline)
> + self.cooker.server_registration_cb(self.cooker.runCommands, self.cooker)
> + return True, None
>
> def runAsyncCommand(self):
> try:
> @@ -139,7 +146,11 @@ class CommandsSync:
> """
> Get any command parsed from the commandline
> """
> - return command.cooker.commandlineAction
> + cmd_action = command.cooker.commandlineAction
> + if cmd_action['msg']:
> + raise CommandError(msg)
Error, "msg" not defined.
Cheers,
Richard
More information about the Openembedded-core
mailing list