= Release History

== 5.8: March 2, 2026

 - MacOS: set open_max limit using MAXFILESPERPROC
 - Add usage hint and '-h' flag to display option summary
 - Add return value checks for malloc(3) and pipe(2)
 - Make signal number configurable with ENTR_RESTART_SIGNAL
 - Monitor symlinks on Linux and MacOS
 - Avoid expanding filenames using realpath(3)
 - Linux: return correct status if poll(2) is interrupted
 - Always accept directories as input, making '-d' flag optional

== 5.7: February 6, 2025

 - Update MANPREFIX for FreeBSD
 - Format source using clang-format
 - Reorganize system tests to run without a TTY
 - Remove unused X option character

== 5.6: July 1, 2024

 - Process exit status messages using background awk scripts
 - Use min(OPEN_MAX, rl.rlim_max) to set rlim_cur on MacOS
 - Detect and use native strlcpy(3)
 - Always build with GNU_SOURCE set on Linux

== 5.5: November 17, 2023

 - Report correct error if open(3) fails
 - Use kern.maxfilesperproc to determine file open limit on MacOS

== 5.4: August 1, 2023

 - 'make test' runs a quick smoketest, 'make check' runs regressions
 - Set IN_CLOEXEC only for inotify_init, kqueue uses similar setting by default
 - Unconditionally try to set soft file limit to 2^16 on MacOS
 - Use non-reentrant calls sparingly in signal handlers
 - configure: use TARGET_OS to override the output of uname(1)

== 5.3: January 20, 2023

 - Symlink changes detected on Linux by setting 'ENTR_INOTIFY_SYMLINK'
 - Use /dev/null rather then closed pipe for stdin in -r mode
 - Utilize {O,FD}_CLOEXEC flag for unintentional leaks of descriptors to
   executed utilities
 - Remove C unit tests
 - Only respond to attribute/inode changes on Linux

== 5.2: May 05, 2022

 - Update copy of strlcpy(3) for Linux
 - Detect file deletion from directories on Linux
 - Print the signal that terminated a child when using '-s'
 - Return 128+signal that terminated a child when using '-z'
 - Ensure terminal settings are reset when '-z' is set

== 5.1: December 28, 2021

 - Detect files moved to or from directories on Linux
 - Allow detection of directory entries beginning with '.' by specifying '-d' twice
 - Only reset terminal settings in exit handler if settings were changed

== 5.0: July 2, 2021

 - Add missing call to getrlimit(3) on MacOS
 - Eliminate memory management warnings on Linux
 - EV_TRACE prints file mode and file name
 - Ignore asynchronous attribute changes on MacOS 11

== 4.9: May 3, 2021

 - EV_TRACE also prints file/notify descriptor limit
 - Don't raise rlim_cur on MacOS
 - Set 2^16 watches if inotify limits cannot be read
 - Raise an error and suggest '-n' if terminal attributes cannot be read

== 4.8: February 26, 2021

 - Set a maximum of 2^19 watches to guard against absurd file open limits on
   MacOS
 - Use control sequences to clear the display and specify '-c' twice to erase
   the scrollback buffer

== 4.7: January 29, 2021

 - Use system file descriptor limits when max_user_watches is not accessible
 - Return the exit status of the child process when the '-z' option is used
 - Handle SIGHUP so child process are terminated when a terminal is closed
 - More accurately return shell exit code using '-s' option

== 4.6: July 1, 2020

 - Always call waitpid(2) to avoid dead processes
 - Duplicate STDIN file descriptor before closing; for the '-r' option

== 4.5: April 20, 2020

 - New '-z' "one-shot" option self-terminates after the utility exits
 - Termination by 'q' or 'SIGINT' results in an exit status of 0

== 4.4: January 02, 2020

 - Use a single inotify queue on Linux, limited by
   /proc/sys/fs/inotify/max_user_watches
 - Set the environment variable 'ENTR_INOTIFY_WORKAROUND' to enable a
   compatibility mode for platforms with deformed inotify support

== 4.3: September 25, 2019

 - Move hosting from bitbucket.org to github.com
 - Rename tag names from entr-X.Y to X.Y
 - Replace hg with git as a dependency for system-test.sh

== 4.2: March 28, 2019

 - Use pledge(2) on OpenBSD
 - New '-a' option enables response to events that occur while the utility is
   running
 - Error messages direct users to http://eradman.com/entrproject/limits.html
 - Correctly report error when a file cannot be reopened

== 4.1: June 13, 2018

 - New '-n' non-interactive option disables keyboard input
 - EV_TRACE environment variable enables file system event tracing
 - Track changes to the inode number as a workaround for missing delete
   events on the Linux kernel

== 4.0: February 02, 2018

 - Warn instead of error if kqueue fails to register on STDIN
 - Close STDIN before running the utility when the restart option is used
 - Restore terminal settings if terminated by a signal

== 3.9: September 19, 2017

 - Fix use of poll(2) to avoid possible busy-loop on Linux
 - Disable keyboard input if reading STDIN fails

== 3.8: August 11, 2017

 - Run the utility if the spacebar is pressed
 - 'q' for quit

== 3.7: February 27, 2017

 - Terminate subprocess in restart mode if a file under watch disappears
 - Allow NOTE_ATTRIB to set '/_' only if file mode changes
 - New '-s' option executes commands using $SHELL -c
 - Print usage and exit if input is from a terminal instead of a pipe

== 3.6: July 01, 2016

 - Do not print warning if _TTY_PATH cannot be opened (for chroot, docker, ...)
 - Non-existent input files produce a warning instead of an error
 - Trigger run when permissions change on regular files

== 3.5: April 01, 2016

 - Removed contrib/*
 - Detect new subdirectories on Linux
 - Direct users to http://entrproject.org/limits.html if inotify hits a kernel
   limit

== 3.4: December 12, 2015

 - Terminate the child process before exiting when the reload option is combined
   with the directory watch option
 - Direct users to http://entrproject.org/limits.html if the maximum number of
   open files is exceeded

== 3.3: October 23, 2015

 - Substitute '/_' only with regular files when using the directory watch option
 - Bugfix when tracking the first file to change
 - Display release number along with usage


== 3.2: April 9, 2015

 - Execute the utility immediately after registering watch events. Old behavior
   is restored using new postpone option ('-p')
 - Relocated 'reload-browser' to http://entrproject.org/scripts/reload-browser
 - Drop FIFO support to further simply code and documentation. FIFO mode was
   conceptually good, but EXEC mode is intelligent hand easily handles the vast
   majority of use cases
 - Remove kFreeBSD as a target platform

== 3.1: March 4, 2015

 - Return error code indicating exit reason after handling signals
 - Restart mode sets process group to ensure that wrapper scripts do not prevent
   signals from reaching child processes
 - Removed DEBUG printf statements

== 3.0: December 19, 2014

 - Man page highlights the flexibility of executing a commands using a shell
 - 'reload-browser', a cross-platform script for reloading the current tab in
   one or more browsers
 - system_test.sh auto-upgrades to bash if the default shell does not support
   the ERR trap
 - Workaround implemented for Linux using fstat(2) to detect if a binary was
   removed if inotify issues IN_ATTRIB but not IN_DELETE_SELF
 - Use calloc(3) to take advantage of overflow detection

== 2.9: June 10, 2014

 - Moved alternate Makefiles to contrib/
 - Trigger actions when a file is truncated on BSD
 - Improved format of DEBUG messages
 - Added missing extern for missing/fmemopen.c to avoid warning on MacOS 10.7+
 - No longer register NOTE_EXTEND; this event is not always merged with
   NOTE_WRITE on MacOS
 - New directory-watch option ('-d'). In this mode a shell while-loop can be
   used to track the addition of new files


== 2.8: March 15, 2014

 - Iteratively check for new file system events using a 1ms timeout after a file
   has been renamed or removed in order to prevent the utility from being
   executed before successive changes from a version control system have
   completed
 - Regression tests use Vim and Mercurial
 - Timing on regression tests has been tightened to only support real hardware;
   they are not expected to pass in emulated environments
 - More correctly identify the first file to trigger a file change notification
 - Renamed regress.sh to system_test.sh, and drop dependency on ksh

== 2.7: February 12, 2014

 - Changed function pointer prefixes from '_' to 'x' to avoid runtime symbol
   collisions in libc. Required to build on DragonFlyBSD
 - Add this NEWS file to provide detailed release history for port maintainers
 - Substitute '/_' argument with the first file that changed
 - Man page formatted with more semantically correct markup
 - Multiple events on the same file are merged on Linux to prevent duplicate
   writes to a named pipe

== 2.6: January 23, 2014

 - Added -c option to clear the screen before calling execvp(3)
 - Changed command line option '{}' to '/_'
 - Renamed Makefile.linux-lbsd to Makefile.debian
 - Include CPPFLAGS since some build systems (namely Debian) use it to specify
   hardening options
 - Raise ARG_MAX from 4K to 2MB on Linux, since _SC_ARG_MAX returns an incorrect
   value on Linux
 - Handle RENAME events that are not followed by DELETE. This enables us to cope
   with the backup option in Vim

== 2.5: December 30, 2013

 - Restore full 50ms period for consolidating events on Linux. Required for the
   Geany editor
 - Remove use of setproctitle(3), no plans to implement this on Linux and MacOS
   This also eliminates use of the 3-clause license
 - New feature: the first occurrence of '{}' on the command line will be
   replaced with the name of the first file under watch
 - Set PAGER to an absolute path (/bin/cat)
 - Prevent interactive utilities from paging output

== 2.4: December 18, 2013

 - Reintroduce ${DESTDIR} for STAGEDIR installation on FreeBSD and pkgsrc
 - License file describes the copyright holders for the compatibility libraries

== 2.3: December 12, 2013

 - Wait for processes to terminate in restart mode
 - Set process title for blocking events
 - Correct multiple bugs in the inotify->kqueue translation layer
 - Print out detailed instructions if the user provides configure arguments
 - Remove ${DESTDIR} from Makefile which appears to interfere with OpenBSD ports
 - The handler for SIGSEGV prints file name and line number if a unit test fails
 - Reduce the number of attempts to re-open files to 10 (total of 1 second)
 - Define architecture in Makefile instead of testing for __linux or __APPLE__

== 2.2: August 07, 2013

 - Process every delete or rename event to ensure files remain tracked
 - Always process DELETE or RENAME events to prevent a files from escaping watch
 - inotify(7) events are consolidated for a duration of 50ms as a workaround for
   an apparent  bug in glib/gio where a file is written and then removed
 - Execute mode can run a file under watch by retrying if text file is busy
 - Exit non-zero if list of regular files exceeds the hard limit set by the
   current login class
 - Ignore directories and special files; exit with error code 1 if no regular
   files are provided as input

== 2.1: July 01, 2013

 - Zero-dependency build on Linux using built-in compatibility layer
 - Add poll with optional timeout in order to prevent change events from
   accumulating while running a command
 - Invalidate file->fd after inotify event is closed. Do not respond to
   IN_MOVE_SELF since this event only occurs on Linux NFS mounts
 - Optional build on GNU/Linux using external compatibility libraries libkqueue
   and libbsd
 - Fix bug in finding the correct filename to write to a FIFO
 - Correct build on MacOS

== 2.0: June 17, 2013

 - Support for old architectures without C99 support
 - More aggressively remove duplicate events
 - install/uninstall uses DESTDIR to be compatible with pkgsrc

== 1.9: April 13, 2013

 - New auto-reload option ('-r')
 - Add a simple configure script, BSD is the default
 - Do not install directories...they should already exist
 - Man page installation path can be set with MANPATH. MacOS expects it to be
   under /usr/local/share

== 1.8: May 12, 2013

 - Ensure that losing a file under watch is results in an error

== 1.7: November 20, 2012

 - Allocate an memory based on _SC_OPEN_MAX, not rl.rlim_max
 - Stat deleted file until success before running a command
 - Handle SIGTERM and remove named pipe on exit

== 1.6: August 10, 2012

 - Separate makefile for Linux to make building easier
 - No need for pthreads on BSD
 - Respond to RENAME and LINK events to improve behavior on NFS

== 1.5: July 29, 2012

 - Support interactive applications by opening a TTY
 - Successfully stat deleted files before running a command

== 1.4: May 22, 2013

 - Added regression tests
 - Delete events instead of relying on implicit removal by close(2) for better
   compatibility with libkqueue on Linux

== 1.3: May 17, 2012

 - Added FIFO support
 - Use min(OPEN_MAX, rl.rlim_max) to be more compatible of Mac OS
 - More correct use of fgets(3) when reading STDIN

== 1.2: April 26, 2012

 - Added support for Linux via libkqueue

== 1.1: April 17, 2012

 - Added support for Mac OS

== 1.0: April 12, 2012

 - Initial release at https://bitbucket.org/eradman/entr
 - Builds on all major BSD platforms
