<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>