]> granicus.if.org Git - php/commitdiff
Fix bug #67496 Save command history when exiting interactive shell with control-c
authorDmitry Saprykin <saprykin.dmitry@gmail.com>
Thu, 24 Jul 2014 15:58:39 +0000 (17:58 +0200)
committerJohannes Schlüter <johannes@php.net>
Thu, 24 Jul 2014 15:58:39 +0000 (17:58 +0200)
NEWS
ext/readline/readline_cli.c

diff --git a/NEWS b/NEWS
index c4592a35363ee63cc9401b20e2585a84e5b0c851..89d41ab384f8f3d655bf2e0570896246e3b9b80d 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,8 @@ PHP                                                                        NEWS
 - Readline:
   . Fixed bug #55496 (Interactive mode doesn't force a newline before the
     prompt). (Bob, Johannes)
+  . Fixed bug #67496 (Save command history when exiting interactive shell
+    with control-c). (Dmitry Saprykin, Johannes)
 
 ?? ??? 2014, PHP 5.4.31
 
index 9655777775a4cc1262f6cd0dec09b057c2a9eef9..9c27acb193105c20bd07cbfd3b7ecd5354cc3bfd 100644 (file)
@@ -590,6 +590,7 @@ static int readline_shell_run(TSRMLS_D) /* {{{ */
        char *code = emalloc(size);
        char *prompt = cli_get_prompt("php", '>' TSRMLS_CC);
        char *history_file;
+       int history_lines_to_write = 0;
 
        if (PG(auto_prepend_file) && PG(auto_prepend_file)[0]) {
                zend_file_handle *prepend_file_p;
@@ -654,6 +655,7 @@ static int readline_shell_run(TSRMLS_D) /* {{{ */
 
                if (*line) {
                        add_history(line);
+                       history_lines_to_write += 1;
                }
 
                free(line);
@@ -663,6 +665,15 @@ static int readline_shell_run(TSRMLS_D) /* {{{ */
                        continue;
                }
 
+               if (history_lines_to_write) {
+#if HAVE_LIBEDIT
+                       write_history(history_file);
+#else
+                       append_history(history_lines_to_write, history_file);
+#endif
+                       history_lines_to_write = 0;
+               }
+
                zend_try {
                        zend_eval_stringl(code, pos, NULL, "php shell code" TSRMLS_CC);
                } zend_end_try();
@@ -684,7 +695,6 @@ static int readline_shell_run(TSRMLS_D) /* {{{ */
 
                php_last_char = '\0';
        }
-       write_history(history_file);
        free(history_file);
        efree(code);
        efree(prompt);