All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v3] qmp-shell: add persistent command history
@ 2017-04-27 22:36 John Snow
  2017-04-28 15:30 ` Stefan Hajnoczi
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: John Snow @ 2017-04-27 22:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: armbru, kchamart, John Snow

Use the existing readline history function we are utilizing
to provide persistent command history across instances of qmp-shell.

This assists entering debug commands across sessions that may be
interrupted by QEMU sessions terminating, where the qmp-shell has
to be relaunched.

Signed-off-by: John Snow <jsnow@redhat.com>
---

v3: Hardcoded limit of 1024 lines of history for now,
    as setting limits in ~/.inputrc does not appear to work (Nir)

v2: Adjusted the errors to whine about non-ENOENT errors, but still
    intercept all errors as non-fatal.
    Save history atexit() to match bash standard behavior

 scripts/qmp/qmp-shell | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/scripts/qmp/qmp-shell b/scripts/qmp/qmp-shell
index eccb88a..6ece6e7 100755
--- a/scripts/qmp/qmp-shell
+++ b/scripts/qmp/qmp-shell
@@ -70,6 +70,9 @@ import json
 import ast
 import readline
 import sys
+import os
+import errno
+import atexit
 
 class QMPCompleter(list):
     def complete(self, text, state):
@@ -109,6 +112,8 @@ class QMPShell(qmp.QEMUMonitorProtocol):
         self._pretty = pretty
         self._transmode = False
         self._actions = list()
+        self._histfile = os.path.join(os.path.expanduser('~'),
+                                      '.qmp-shell_history')
 
     def __get_address(self, arg):
         """
@@ -132,11 +137,27 @@ class QMPShell(qmp.QEMUMonitorProtocol):
     def __completer_setup(self):
         self._completer = QMPCompleter()
         self._fill_completion()
+        readline.set_history_length(1024)
         readline.set_completer(self._completer.complete)
         readline.parse_and_bind("tab: complete")
         # XXX: default delimiters conflict with some command names (eg. query-),
         # clearing everything as it doesn't seem to matter
         readline.set_completer_delims('')
+        try:
+            readline.read_history_file(self._histfile)
+        except Exception as e:
+            if isinstance(e, IOError) and e.errno == errno.ENOENT:
+                # File not found. No problem.
+                pass
+            else:
+                print "Failed to read history '%s'; %s" % (self._histfile, e)
+        atexit.register(self.__save_history)
+
+    def __save_history(self):
+        try:
+            readline.write_history_file(self._histfile)
+        except Exception as e:
+            print "Failed to save history file '%s'; %s" % (self._histfile, e)
 
     def __parse_value(self, val):
         try:
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] [PATCH v3] qmp-shell: add persistent command history
  2017-04-27 22:36 [Qemu-devel] [PATCH v3] qmp-shell: add persistent command history John Snow
@ 2017-04-28 15:30 ` Stefan Hajnoczi
  2017-04-28 21:13 ` Kashyap Chamarthy
  2017-05-02 11:33 ` Markus Armbruster
  2 siblings, 0 replies; 4+ messages in thread
From: Stefan Hajnoczi @ 2017-04-28 15:30 UTC (permalink / raw)
  To: John Snow; +Cc: qemu-devel, armbru

[-- Attachment #1: Type: text/plain, Size: 871 bytes --]

On Thu, Apr 27, 2017 at 06:36:28PM -0400, John Snow wrote:
> Use the existing readline history function we are utilizing
> to provide persistent command history across instances of qmp-shell.
> 
> This assists entering debug commands across sessions that may be
> interrupted by QEMU sessions terminating, where the qmp-shell has
> to be relaunched.
> 
> Signed-off-by: John Snow <jsnow@redhat.com>
> ---
> 
> v3: Hardcoded limit of 1024 lines of history for now,
>     as setting limits in ~/.inputrc does not appear to work (Nir)
> 
> v2: Adjusted the errors to whine about non-ENOENT errors, but still
>     intercept all errors as non-fatal.
>     Save history atexit() to match bash standard behavior
> 
>  scripts/qmp/qmp-shell | 21 +++++++++++++++++++++
>  1 file changed, 21 insertions(+)

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 455 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] [PATCH v3] qmp-shell: add persistent command history
  2017-04-27 22:36 [Qemu-devel] [PATCH v3] qmp-shell: add persistent command history John Snow
  2017-04-28 15:30 ` Stefan Hajnoczi
@ 2017-04-28 21:13 ` Kashyap Chamarthy
  2017-05-02 11:33 ` Markus Armbruster
  2 siblings, 0 replies; 4+ messages in thread
From: Kashyap Chamarthy @ 2017-04-28 21:13 UTC (permalink / raw)
  To: John Snow; +Cc: qemu-devel, armbru

On Thu, Apr 27, 2017 at 06:36:28PM -0400, John Snow wrote:
> Use the existing readline history function we are utilizing
> to provide persistent command history across instances of qmp-shell.
> 
> This assists entering debug commands across sessions that may be
> interrupted by QEMU sessions terminating, where the qmp-shell has
> to be relaunched.
> 
> Signed-off-by: John Snow <jsnow@redhat.com>
> ---
> 
> v3: Hardcoded limit of 1024 lines of history for now,
>     as setting limits in ~/.inputrc does not appear to work (Nir)

Yeah, as-is, this is strict improvement, so it's alright for now.

> v2: Adjusted the errors to whine about non-ENOENT errors, but still
>     intercept all errors as non-fatal.
>     Save history atexit() to match bash standard behavior
>
> 
>  scripts/qmp/qmp-shell | 21 +++++++++++++++++++++
>  1 file changed, 21 insertions(+)

Reviewed-by: Kashyap Chamarthy <kchamart@redhat.com>
Tested-by: Kashyap Chamarthy <kchamart@redhat.com>
 
Can confim the, expected, 'atexit' behavior -- only upon termination
does the history file get saved:

    $ cat ~/.qmp-shell_history 
    query-block
    query-named-block-nodes
    query-kvm
    quit

Tested with:

  $ git describe
  v3.9.0-304-gca7305b

Most of my test procedure is noted in my response to the earlier
revisions:

https://lists.nongnu.org/archive/html/qemu-devel/2017-03/msg00356.html

> diff --git a/scripts/qmp/qmp-shell b/scripts/qmp/qmp-shell
> index eccb88a..6ece6e7 100755
> --- a/scripts/qmp/qmp-shell
> +++ b/scripts/qmp/qmp-shell
> @@ -70,6 +70,9 @@ import json
>  import ast
>  import readline
>  import sys
> +import os
> +import errno
> +import atexit
>  
>  class QMPCompleter(list):
>      def complete(self, text, state):
> @@ -109,6 +112,8 @@ class QMPShell(qmp.QEMUMonitorProtocol):
>          self._pretty = pretty
>          self._transmode = False
>          self._actions = list()
> +        self._histfile = os.path.join(os.path.expanduser('~'),
> +                                      '.qmp-shell_history')

Thanks for changing the name :-)  Now the raw QMP history file
(~/.qmp_history) and 'qmp-shell' history file (~/qmp-shell_history)
won't collide.

>      def __get_address(self, arg):
>          """
> @@ -132,11 +137,27 @@ class QMPShell(qmp.QEMUMonitorProtocol):
>      def __completer_setup(self):
>          self._completer = QMPCompleter()
>          self._fill_completion()
> +        readline.set_history_length(1024)
>          readline.set_completer(self._completer.complete)
>          readline.parse_and_bind("tab: complete")
>          # XXX: default delimiters conflict with some command names (eg. query-),
>          # clearing everything as it doesn't seem to matter
>          readline.set_completer_delims('')
> +        try:
> +            readline.read_history_file(self._histfile)
> +        except Exception as e:
> +            if isinstance(e, IOError) and e.errno == errno.ENOENT:
> +                # File not found. No problem.
> +                pass
> +            else:
> +                print "Failed to read history '%s'; %s" % (self._histfile, e)
> +        atexit.register(self.__save_history)
> +
> +    def __save_history(self):
> +        try:
> +            readline.write_history_file(self._histfile)
> +        except Exception as e:
> +            print "Failed to save history file '%s'; %s" % (self._histfile, e)
>  
>      def __parse_value(self, val):
>          try:
> -- 
> 2.9.3
> 

-- 
/kashyap

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] [PATCH v3] qmp-shell: add persistent command history
  2017-04-27 22:36 [Qemu-devel] [PATCH v3] qmp-shell: add persistent command history John Snow
  2017-04-28 15:30 ` Stefan Hajnoczi
  2017-04-28 21:13 ` Kashyap Chamarthy
@ 2017-05-02 11:33 ` Markus Armbruster
  2 siblings, 0 replies; 4+ messages in thread
From: Markus Armbruster @ 2017-05-02 11:33 UTC (permalink / raw)
  To: John Snow; +Cc: qemu-devel

John Snow <jsnow@redhat.com> writes:

> Use the existing readline history function we are utilizing
> to provide persistent command history across instances of qmp-shell.
>
> This assists entering debug commands across sessions that may be
> interrupted by QEMU sessions terminating, where the qmp-shell has
> to be relaunched.
>
> Signed-off-by: John Snow <jsnow@redhat.com>

Applied to qapi-next, thanks!

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2017-05-02 11:33 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-27 22:36 [Qemu-devel] [PATCH v3] qmp-shell: add persistent command history John Snow
2017-04-28 15:30 ` Stefan Hajnoczi
2017-04-28 21:13 ` Kashyap Chamarthy
2017-05-02 11:33 ` Markus Armbruster

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.