<pre style='margin:0'>
Clemens Lang (neverpanic) pushed a commit to branch master
in repository macports-base.
</pre>
<p><a href="https://github.com/macports/macports-base/commit/486565dafb882078f0e2a22399a08ef1966fb163">https://github.com/macports/macports-base/commit/486565dafb882078f0e2a22399a08ef1966fb163</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'> new 486565d port: append history in interactive sessions
</span>486565d is described below
<span style='display:block; white-space:pre;color:#808000;'>commit 486565dafb882078f0e2a22399a08ef1966fb163
</span>Author: George Plymale II <georgedp@orbitalimpact.com>
AuthorDate: Tue Aug 21 10:02:58 2018 -0400
<span style='display:block; white-space:pre;color:#404040;'> port: append history in interactive sessions
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Hitherto, port.tcl has used bash-style history-writing at the end of
</span><span style='display:block; white-space:pre;color:#404040;'> an interactive session. That is vulnerable to crashes and other abrupt
</span><span style='display:block; white-space:pre;color:#404040;'> interruptions. Switch to writing commands to the history file
</span><span style='display:block; white-space:pre;color:#404040;'> immediately.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Closes: https://trac.macports.org/ticket/56381
</span>---
src/pextlib1.0/readline.c | 40 +++++++++++++++++++++++++++++++++++++++-
src/port/port.tcl | 25 ++++++++++++++-----------
2 files changed, 53 insertions(+), 12 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/pextlib1.0/readline.c b/src/pextlib1.0/readline.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 006f28e..7bf39f2 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/pextlib1.0/readline.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/pextlib1.0/readline.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -11,11 +11,12 @@
</span> #endif
/* required for strdup(3) on Linux and macOS */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#define _XOPEN_SOURCE 600L
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define _BSD_SOURCE
</span>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <errno.h>
</span>
#ifdef HAVE_READLINE_READLINE_H
#include <readline/readline.h>
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -25,6 +26,10 @@
</span> #include <readline/history.h>
#endif
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#if HAVE_SYS_FILE_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/file.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> #include <tcl.h>
#include "readline.h"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -267,6 +272,7 @@ int ReadlineCmd(ClientData clientData UNUSED, Tcl_Interp *interp, int objc, Tcl_
</span> add line
read filename
write filename
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ append filename
</span> stifle max
unstifle
*/
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -277,6 +283,7 @@ int RLHistoryCmd(ClientData clientData UNUSED, Tcl_Interp *interp, int objc, Tcl
</span> char* s = NULL;
int i = 0;
Tcl_Obj *tcl_result;
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ FILE *hist_file;
</span> #endif
if (objc < 2) {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -309,6 +316,37 @@ int RLHistoryCmd(ClientData clientData UNUSED, Tcl_Interp *interp, int objc, Tcl
</span> }
s = Tcl_GetString(objv[2]);
write_history(s);
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else if (0 == strcmp("append", action)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Begin code for history appension
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This action is a bit more convoluted than the others, so I think it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * will benefit from some comments */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Just like the other cases, make sure the arg count in Tcl is correct */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (objc != 3) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Tcl_WrongNumArgs(interp, 1, objv, "append filename");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return TCL_ERROR;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Open the file supplied in Tcl; return an error if it fails */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ s = Tcl_GetString(objv[2]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (NULL == (hist_file = fopen(s, "a"))) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Tcl_AppendResult(interp, "fopen(", s, "): ", strerror(errno), NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return TCL_ERROR;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Lock the history file, write the line to a buffer (catching errors),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * flush it, unlock the file and close it */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ flock(fileno(hist_file), LOCK_EX);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (fprintf(hist_file, "%s\n", current_history()->line) < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Tcl_AppendResult(interp, "fprintf(", current_history()->line, "): ", strerror(errno), NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return TCL_ERROR;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fflush(hist_file);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ flock(fileno(hist_file), LOCK_UN);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fclose(hist_file);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* End code for history appension */
</span> } else if (0 == strcmp("stifle", action)) {
if (objc != 3) {
Tcl_WrongNumArgs(interp, 1, objv, "stifle maxlines");
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port/port.tcl b/src/port/port.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 73a3a7e..5d1b52b 100755
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port/port.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port/port.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4802,7 +4802,7 @@ proc attempt_completion { text word start end } {
</span> }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc get_next_cmdline { in out use_readline prompt linename } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc get_next_cmdline { in out use_readline prompt linename history_file } {
</span> upvar $linename line
set line ""
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4828,7 +4828,19 @@ proc get_next_cmdline { in out use_readline prompt linename } {
</span> set line [string trim $line]
if { $use_readline && $line ne "" } {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Create macports user directory if it does not exist yet
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {![file isdirectory $macports::macports_user_dir]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ file mkdir $macports::macports_user_dir
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Also write the history file if this is the case (this sets
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # the cookie at the top of the file and perhaps other things)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ rl_history write $history_file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Add history item to memory...
</span> rl_history add $line
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ # ... and then append that item to the history file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ rl_history append $history_file
</span> }
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4870,7 +4882,7 @@ proc process_command_file { in } {
</span> }
# Get a command line
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if { [get_next_cmdline $in stdout $use_readline $prompt line] <= 0 } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if { [get_next_cmdline $in stdout $use_readline $prompt line $history_file] <= 0 } {
</span> puts ""
break
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4885,15 +4897,6 @@ proc process_command_file { in } {
</span> }
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>- # Create macports user directory if it does not exist yet
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if {$use_readline && ![file isdirectory $macports::macports_user_dir]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- file mkdir $macports::macports_user_dir
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # Save readine history
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if {$use_readline && [file isdirectory $macports::macports_user_dir]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- rl_history write $history_file
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> # Say goodbye
if { $noisy } {
puts "Goodbye"
</pre><pre style='margin:0'>
</pre>