diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 00ecb60657..e84bd28c36 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2015-06-17 Patrick Palka + + * top.c (gdb_safe_append_history): Do not call + history_truncate_file if the history is not stifled. + 2015-06-17 Andreas Arnez * syscalls/s390-linux.xml: Add syscalls 344 through 354. diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 0e968626e1..e526cb3bda 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-06-17 Patrick Palka + + * gdb.base/gdbinit-history.exp: Add test case to check that + an unlimited history file does not get truncated on exit. + 2015-06-17 Andreas Arnez * gdb.base/gnu_vector.c: Include stdarg.h and stdio.h. diff --git a/gdb/testsuite/gdb.base/gdbinit-history.exp b/gdb/testsuite/gdb.base/gdbinit-history.exp index 8adfd68a78..8c4f4ca4dd 100644 --- a/gdb/testsuite/gdb.base/gdbinit-history.exp +++ b/gdb/testsuite/gdb.base/gdbinit-history.exp @@ -57,5 +57,63 @@ proc test_gdbinit_history_setting { home size } { array set env [array get old_env] } +# Check that the history file does not get truncated to zero when a gdbinit +# file sets the history size to unlimited. + +proc test_no_truncation_of_unlimited_history_file { } { + global env + global INTERNAL_GDBFLAGS + + array set old_env [array get env] + + # The HISTSIZE environment variable takes precedence over whatever + # history size is set in .gdbinit. Make sure the former is not + # set. + unset -nocomplain env(HISTSIZE) + + set saved_internal_gdbflags $INTERNAL_GDBFLAGS + + set temp_gdbinit [standard_output_file "gdbinit-history.gdbinit"] + set temp_histfile [standard_output_file "gdbinit-history.gdb_history"] + file delete $temp_gdbinit + file delete $temp_histfile + + set fd [open $temp_gdbinit "w"] + puts $fd "set history size unlimited\n" + puts $fd "set history filename $temp_histfile\n" + puts $fd "set history save\n" + close $fd + + append INTERNAL_GDBFLAGS " -x $temp_gdbinit" + + # We have to start then exit GDB twice: the first time to test the creation + # of the initial history file, and the second time to test appending to it. + # In either case the initial "print 1" command should persist through the + # history file. + with_test_prefix "truncation" { + gdb_exit + gdb_start + gdb_test "print 1" + + with_test_prefix "creating" { + gdb_exit + gdb_start + gdb_test "server show commands" " . print 1.*" + } + + with_test_prefix "appending" { + gdb_exit + gdb_start + gdb_test "server show commands" " . print 1.*" + } + } + + set INTERNAL_GDBFLAGS $saved_internal_gdbflags + + array set env [array get old_env] +} + test_gdbinit_history_setting "gdbinit-history/unlimited" "unlimited" test_gdbinit_history_setting "gdbinit-history/zero" "0" + +test_no_truncation_of_unlimited_history_file diff --git a/gdb/top.c b/gdb/top.c index 74e1e07137..f8f926b62d 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -941,7 +941,8 @@ gdb_safe_append_history (void) else { append_history (command_count, local_history_filename); - history_truncate_file (local_history_filename, history_max_entries); + if (history_is_stifled ()) + history_truncate_file (local_history_filename, history_max_entries); } ret = rename (local_history_filename, history_filename);