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