scripts/qmp-shell: Fix empty-transaction invocation

calling "transaction( )" is pointless, but valid. Rework the parser to
allow this kind of invocation. This helps clean up exception handling
later by removing accidental breakages of the parser that aren't
explicitly forbidden.

Signed-off-by: John Snow <jsnow@redhat.com>
Message-id: 20210607200649.1840382-35-jsnow@redhat.com
Signed-off-by: John Snow <jsnow@redhat.com>
This commit is contained in:
John Snow 2021-06-07 16:06:41 -04:00
parent 74688377fe
commit c83055ef1d
1 changed files with 8 additions and 6 deletions

View File

@ -244,11 +244,14 @@ class QMPShell(qmp.QEMUMonitorProtocol):
cmdargs = re.findall(argument_regex, cmdline)
qmpcmd: QMPMessage
# Transactional CLI entry/exit:
if cmdargs[0] == 'transaction(':
# Transactional CLI entry:
if cmdargs and cmdargs[0] == 'transaction(':
self._transmode = True
self._actions = []
cmdargs.pop(0)
elif cmdargs[0] == ')' and self._transmode:
# Transactional CLI exit:
if cmdargs and cmdargs[0] == ')' and self._transmode:
self._transmode = False
if len(cmdargs) > 1:
msg = 'Unexpected input after close of Transaction sub-shell'
@ -257,15 +260,14 @@ class QMPShell(qmp.QEMUMonitorProtocol):
'execute': 'transaction',
'arguments': {'actions': self._actions}
}
self._actions = list()
return qmpcmd
# Nothing to process?
# No args, or no args remaining
if not cmdargs:
return None
# Parse and then cache this Transactional Action
if self._transmode:
# Parse and cache this Transactional Action
finalize = False
action = {'type': cmdargs[0], 'data': {}}
if cmdargs[-1] == ')':