Skip to content

Latest commit

 

History

History
1086 lines (670 loc) · 32 KB

CHANGELOG.md

File metadata and controls

1086 lines (670 loc) · 32 KB

4.*

4.0.1

August 19, 2024

Bug fixes

  • bfs no longer prints a "suppressed errors" warning unless -noerror is actually suppressing errors 5d03c9d

4.0

August 16, 2024

New features

  • To match BSD find (and the POSIX Utility Syntax Guidelines), multiple flags can now be given in a single argument like -LEXO2. Previously, you would have had to write -L -E -X -O2. (c0fd33a)

  • Explicit timestamps can now be written as @SECONDS_SINCE_EPOCH. For example, bfs -newermt @946684800 will print files modified since January 1, 2000 (UTC). (c6bb003)

  • The new -noerror option suppresses all error messages during traversal. (#142)

Changes

  • -mount now excludes mount points entirely, to comply with the recently published POSIX 2024 standard. Use -xdev to include the mount point itself, but not its contents. bfs has been warning about this change since version 1.5.1 (September 2019). (33b85e1)

  • -perm now takes the current file creation mask into account when parsing a symbolic mode like +rw, as clarified by POSIX defect 1392. This matches the behaviour of BSD find, contrary to the behaviour of GNU find. (6290ce4)

Bug fixes

  • Fixed commands like ./configure CC=clang --enable-release that set variables before other options (49a5d48)

  • Fixed the build on RISC-V with GCC versions older than 14 (e93a1dc)

  • Fixed running bfs under Valgrind (a01cfac)

  • Fixed the exit code when failing to execute a non-existent command with -exec/-ok on some platforms including OpenBSD and HPPA (8c130ca)

  • Fixed $LS_COLORS case-sensitivity to match GNU ls more closely when the same extension is specified multiple times (08030ae)

  • Fixed the -status bar on Solaris/Illumos

3.*

3.3.1

June 3, 2024

Bug fixes

  • Reduced the scope of the symbolic link loop change in version 3.3. -xtype l remains true for symbolic link loops, matching a change in GNU findutils 4.10.0. However, -L will report an error, just like bfs prior to 3.3 and other find implementations, as required by POSIX.

3.3

May 28, 2024

New features

  • The -status bar can now be toggled by SIGINFO (Ctrl+T) on systems that support it, and SIGUSR1 on other systems

  • -regextype now supports all regex types from GNU find (#21)

  • File birth times are now supported on OpenBSD

Changes

  • Symbolic link loops are now treated like other broken links, rather than an error

  • ./configure now expects --with-libacl, --without-libcap, etc. rather than --enable-/--disable-

  • The (space) flag is now restricted to numeric -printf specifiers

Bug fixes

  • -regextype emacs now supports shy (non-capturing) groups

  • Fixed -status bar visual corruption when the terminal is resized

  • bfs now prints a reset escape sequence when terminated by a signal in the middle of colored output (#138)

  • ./configure CFLAGS=... no longer overrides flags from pkg-config during configuration

3.2

May 2, 2024

New features

  • New -limit N action that quits immediately after N results

  • Implemented -context (from GNU find) for matching SELinux contexts (#27)

  • Implemented -printf %Z for printing SELinux contexts

Changes

  • The build system has been rewritten, and there is now a configure step:

    $ ./configure
    $ make
    

    See ./configure --help or docs/BUILDING.md for more details.

  • Improved platform support

    • Implemented -acl on Solaris/Illumos
    • Implemented -xattr on DragonFly BSD

Bug fixes

  • Fixed some rarely-used code paths that clean up after allocation failures

3.1.3

March 6, 2024

Bug fixes

  • On Linux, the io_uring feature probing introduced in bfs 3.1.2 only applied to one thread, causing all other threads to avoid using io_uring entirely. The probe results are now copied to all threads correctly. (f64f76b)

3.1.2

February 29, 2024

Bug fixes

  • On Linux, we now check for supported io_uring operations before using them, which should fix bfs on 5.X series kernels that support io_uring but not all of openat()/close()/statx() (8bc72d6)

  • Fixed a test failure triggered by certain filesystem types for /tmp (#131)

  • Fixed parsing and interpretation of timezone offsets for explicit reference times used in -*since and -newerXt (a9f3cde)

  • Fixed the build on m68k (c749c11)

3.1.1

February 16, 2024

Changes

  • Performance and scalability improvements

  • The file count in bfs -status now has a thousands separator

3.1

February 6, 2024

New features

  • On Linux, bfs now uses io_uring for async I/O

  • On all platforms, bfs can now perform stat() calls in parallel, accelerating queries like -links, -newer, and -size, as well as colorized output

  • On FreeBSD, -type w now works to find whiteouts like the system find

Changes

  • Improved bfs -j2 performance (b2ab7a1)

  • Optimized -exec by using posix_spawn() when possible, which can avoid the overhead of fork() (95fbde1)

  • -execdir and -okdir are now rejected if $PATH contains a relative path, matching the behaviour of GNU find (163baf1)

  • Leading whitespace is no longer accepted in integer command line arguments like -links ' 1' (e0d7dc5)

Bug fixes

  • -quit and -exit could be ignored in the iterative deepening modes (-S {ids,eds}). This is now fixed (670ebd9). The bug was introduced in version 3.0.3 (commit 5f16169).

  • Fixed two possible errors in sort mode (-s):

  • Fixed handling of FreeBSD union mounts (3ac3bee)

  • Fixed NO_COLOR handling when it's set to the empty string (79aee58)

  • Fixed some portability issues:

3.0.4

October 12, 2023

Bug fixes

  • Fixed a segfault when reporting errors under musl (d40eb87)

3.0.3

October 12, 2023

Changes

  • Iterative deepening modes (-S {ids,eds}) were optimized by delaying teardown until the very end (5f16169)

  • Parallel depth-first search (-S dfs) was optimized to avoid enqueueing every file separately (2572273)

Bug fixes

  • Iterative deepening modes (-S {ids,eds}) were performing iterative breadth-first searches since bfs 3.0, negating any advantages they may have had over normal breadth-first search. They now do iterative depth-first searches as expected. (a029d95)

  • Fixed a linked-list corruption that could lead to an infinite loop on macOS and other non-Linux, non-FreeBSD platforms (773f4a4)

3.0.2

September 6, 2023

Changes

  • -files0-from now allows an empty set of paths to be given, matching GNU findutils 4.9.0

  • Reduced memory consumption in multi-threaded searches

  • Many man page updates

Bug fixes

  • Fixed an out-of-bounds memory read that could occur when escaping a string containing an incomplete multi-byte character

3.0.1

July 18, 2023

Bug fixes

  • Traversal fixes that mostly affect large directory trees (#107)

    • bfs could encounter EMFILE, close a file, and retry many times, particularly with -j1

    • Breadth-first search could become highly unbalanced, negating many of the benefits of bfs

    • On non-{Linux,FreeBSD} plaforms, directories could stay open longer than necessary, consuming extra memory

3.0

July 13, 2023

New features

  • bfs now reads directories asynchronously and in parallel (#101). Performance is significantly improved as a result. Parallelism is controlled by the new -j flag, e.g. -j1, -j2, etc.

Changes

  • bfs now uses the C17 standard version, up from C11

  • Due to #101, bfs now requires some additional C and POSIX features:

  • $LS_COLORS extensions written in different cases (e.g. *.jpg=35:*.JPG=01;35) are now matched case-sensitively, to match the new behaviour of GNU ls since coreutils version 9.2

  • Added a warning/error if $LS_COLORS can't be parsed, depending on whether -color is requested explicitly

  • Filenames with control characters are now escaped when printing with -color

  • Build flags like WITH_ONIGURUMA have been renamed to USE_ONIGURUMA

Bug fixes

  • Fixed handling of the "normal text" color (no in $LS_COLORS) to match GNU ls

2.*

2.6.3

January 31, 2023

  • Fixed running the tests as root on Linux 8b24de3

  • Fixed some tests on Android 2724dfb 0a5a80c

  • Stopped relying on non-POSIX touch(1) features in the tests. This should fix the tests on at least OpenBSD. 2d5edb3

  • User/group caches are now filled lazily instead of eagerly b41dca5

  • More caches and I/O streams are flushed before -exec/-ok f98a1c4

  • Fixed various memory safety issues found by fuzzing
    712b137 5ce883d da02def c55e855

  • Fixed a test failure on certain macOS versions 8b24de3

  • Mitigated a race condition when determining filesystem types (#97)

  • Lots of refactoring and optimization

2.6.2

October 21, 2022

  • Fixed use of uninitialized memory on parsing errors involving -fprintf

  • Fixed Android build issues (#96)

  • Refactored the test suite

2.6.1

July 7, 2022

  • Fix stat() errors on GNU Hurd systems with glibc older than 2.35

  • Added fish shell tab completion (#94). Thanks @xfgusta!

2.6

May 21, 2022

  • Fixed deleting large NFS directories on FreeBSD (#67).

  • Added support for a bfs-specific BFS_COLORS environment variable.

  • Refactored the build system, directory structure, and documentation (#88, #89, #91). Thanks @ElectronicsArchiver!

  • Added zsh completion (#86). Thanks @VorpalBlade!

  • Updated the default color scheme to match GNU coreutils 9.1. Files with capabilities set are no longer colored differently by default, resulting in a significant performance improvement.

  • Became less aggressive at triggering automounts

  • Added support for out-of-tree builds with BUILDDIR

2.5

March 27, 2022

  • Added compiler-style context for errors and warnings. Errors look like this:

    $ bfs -nam needle
    bfs: error: bfs -nam needle
    bfs: error:     ~~~~
    bfs: error: Unknown argument; did you mean -name?
    

    and warnings look like this:

    $ bfs -print -name 'needle'
    bfs: warning: bfs -print -name needle
    bfs: warning:            ~~~~~~~~~~~~
    bfs: warning: The result of this expression is ignored.
    
  • Updated from C99 to C11

  • Fixed the tests when built against musl

  • Fixed a build error reported on Manjaro

2.4.1

February 24, 2022

  • Fixed the build when Oniguruma is not installed in the default search paths (#82)

  • Fixed string encoding bugs with Oniguruma enabled

  • Fixed regex error reporting bugs

2.4

February 22, 2022

  • Added the Oniguruma regular expression library as an (optional, but enabled by default) dependency (#81). Oniguruma supports more regular expression syntax types than the POSIX regex API, and often performs better. To build bfs without this new dependency, do make WITH_ONIGURUMA= to disable it. Thanks @data-man!

  • Added support for the ed, emacs, grep, and sed regular expression types (#21)

  • Before executing a process with -exec[dir]/-ok[dir], bfs now ensures all output streams are flushed. Previously, I/O from subprocesses could be interleaved unpredictably with buffered I/O from bfs itself.

2.3.1

January 21, 2022

  • Fixed the build on Debian kFreeBSD

  • Fixed a crash on GNU Hurd when piping bfs's output

  • Fixed a double-close() on non-Linux platforms if fdopendir() fails

  • Reduced memory allocations on startup

2.3

November 25, 2021

  • More tweaks to PAGER and LESS handling for bfs -help (#76)

  • Use 512-byte blocks for -ls when POSIXLY_CORRECT is set (#77)

  • Implemented -files0-from FILE to take a list of '\0'-separated starting paths. GNU find will implement the same feature in an upcoming release.

  • Added colors to -printf output (#62)

  • Faster recovery from E2BIG during -exec

2.2.1

June 2, 2021

  • Fixed some incorrect coloring of broken links when links are being followed (-L)

  • Made the tests work when run as root by dropping privileges. This may be helpful for certain packaging or CI environments, but is not recommended.

  • Treat empty PAGER and LESS environment variables like they're unset, for bfs -help (#71). Thanks @markus-oberhumer!

  • The soft RLIMIT_NOFILE is now raised automatically to a fairly large value when possible. This provides a minor performance benefit for large directory trees.

  • Implemented time units for -mtime as found in FreeBSD find (#75)

2.2

March 6, 2021

  • Fixed -hidden on hidden start paths

  • Added a Bash completion script. Thanks @bmundt6!

  • Fixed rounding in -used. Corresponding fixes were made to GNU find in version 4.8.0.

  • Optimized the open directory representation. On Linux, much libc overhead is bypassed by issuing syscalls directly. On all platforms, a few fewer syscalls and open file descriptors will be used.

  • Implemented -flags from BSD find

2.1

November 11, 2020

  • Added a new -status option that displays the search progress in a bar at the bottom of the terminal

  • Fixed an optimizer bug introduced in version 2.0 that affected some combinations of -user/-group and -nouser/-nogroup

2.0

October 14, 2020

  • #8: New -exclude <expression> syntax to more easily and reliably filter out paths. For example:

    bfs -name config -exclude -name .git
    

    will find all files named config, without searching any directories (or files) named .git. In this case, the same effect could have been achieved (more awkwardly) with -prune:

    bfs ! \( -name .git -prune \) -name config
    

    But -exclude will work in more cases:

    # -exclude works with -depth, while -prune doesn't:
    bfs -depth -name config -exclude -name .git
    
    # -exclude applies even to paths below the minimum depth:
    bfs -mindepth 3 -name config -exclude -name .git
    
  • #30: -nohidden is now equivalent to -exclude -hidden. This changes the behavior of command lines like

    bfs -type f -nohidden
    

    to do what was intended.

  • Optimized the iterative deepening (-S ids) implementation

  • Added a new search strategy: exponential deepening search (-S eds). This strategy provides many of the benefits of iterative deepening, but much faster due to fewer re-traversals.

  • Fixed an optimizer bug that could skip -empty/-xtype if they didn't always lead to an action

  • Implemented -xattrname to find files with a particular extended attribute (from macOS find)

  • Made -printf %l still respect the width specifier (e.g. %10l) for non-links, to match GNU find

  • Made bfs fail if -color is given explicitly and LS_COLORS can't be parsed, rather than falling back to non-colored output

1.*

1.7

April 22, 2020

  • Fixed -ls printing numeric IDs instead of user/group names in large directory trees
  • Cached the user and group tables for a performance boost
  • Fixed interpretation of "default" ACLs
  • Implemented -s flag to sort results

1.6

February 25, 2020

  • Implemented -newerXt (explicit reference times), -since, -asince, etc.
  • Fixed -empty to skip special files (pipes, devices, sockets, etc.)

1.5.2

January 9, 2020

  • Fixed the build on NetBSD
  • Added support for NFSv4 ACLs on FreeBSD
  • Added a + after the file mode for files with ACLs in -ls
  • Supported more file types (whiteouts, doors) in symbolic modes for -ls/-printf %M
  • Implemented -xattr on FreeBSD

1.5.1

September 14, 2019

  • Added a warning to -mount, since it will change behaviour in the next POSIX revision
  • Added a workaround for environments that block statx() with seccomp(), like older Docker
  • Fixed coloring of nonexistent leading directories
  • Avoided calling stat() on all mount points at startup

1.5

June 27, 2019

  • New -xattr predicate to find files with extended attributes
  • Fixed the -acl implementation on macOS
  • Implemented depth-first (-S dfs) and iterative deepening search (-S ids)
  • Piped -help output into $PAGER by default
  • Fixed crashes on some invalid LS_COLORS values

1.4.1

April 5, 2019

  • Added a nicer error message when the tests are run as root
  • Fixed detection of comparison expressions with signs, to match GNU find for things like -uid ++10
  • Added support for https://no-color.org/
  • Decreased the number of stat() calls necessary in some cases

1.4

April 15, 2019

  • New -unique option that filters out duplicate files (#48)
  • Optimized the file coloring implementation
  • Fixed the coloring implementation to match GNU ls more closely in many corner cases
    • Implemented escape sequence parsing for LS_COLORS
    • Implemented ln=target for coloring links like their targets
    • Fixed the order of fallbacks used when some color keys are unset
  • Add a workaround for incorrect file types for bind-mounted files on Linux (#37)

1.3.3

February 10, 2019

  • Fixed unpredictable behaviour for empty responses to -ok/-okdir caused by an uninitialized string
  • Writing to standard output now causes bfs to fail if the descriptor was closed
  • Fixed incomplete file coloring in error messages
  • Added some data flow optimizations
  • Fixed -nogroup/-nouser in big directory trees
  • Added -type w for whiteouts, as supported by FreeBSD find
  • Re-wrote the -help message and manual page

1.3.2

January 11, 2019

  • Fixed an out-of-bounds read if LS_COLORS doesn't end with a :
  • Allowed multiple debug flags to be specified like -D opt,tree

1.3.1

January 3, 2019

  • Fixed some portability problems affecting FreeBSD

1.3

January 2, 2019

New features:

  • -acl finds files with non-trivial Access Control Lists (from FreeBSD)
  • -capable finds files with capabilities set
  • -D all turns on all debugging flags at once

Fixes:

  • LS_COLORS handling has been improved:
    • Extension colors are now case-insensitive like GNU ls
    • or (orphan) and mi (missing) files are now treated differently
    • Default colors can be unset with di=00 or similar
    • Specific colors fall back to more general colors when unspecified in more places
    • LS_COLORS no longer needs a trailing colon
  • -ls/-fls now prints the major/minor numbers for device nodes
  • -exec ; is rejected rather than segfaulting
  • bfs now builds on old Linux versions that require -lrt for POSIX timers
  • For files whose access/change/modification times can't be read, bfs no longer fails unless those times are needed for tests
  • The testsuite is now more correct and portable

1.2.4

September 24, 2018

  • GNU find compatibility fixes for -printf:
    • %Y now prints ? if an error occurs resolving the link
    • %B is now supported for birth/creation time (as well as %W/%w)
    • All standard strftime() formats are supported, not just the ones from the GNU find manual
  • Optimizations are now re-run if any expressions are reordered
  • -exec and friends no longer leave zombie processes around when exec() fails

1.2.3

July 15, 2018

  • Fixed test_depth_error on filesystems that don't fill in d_type
  • Fixed the build on Linux architectures that don't have the statx() syscall (ia64, sh4)
  • Fixed use of AT_EMPTY_PATH for fstatat on systems that don't support it (Hurd)
  • Fixed ARG_MAX accounting on architectures with large pages (ppc64le)
  • Fixed the build against the upcoming glibc 2.28 release that includes its own statx() wrapper

1.2.2

June 23, 2018

  • Minor bug fixes:
    • Fixed -exec ... '{}' + argument size tracking after recovering from E2BIG
    • Fixed -fstype if /proc is available but /etc/mtab is not
    • Fixed an uninitialized variable when given -perm +rw...
    • Fixed some potential "error: 'path': Success" messages
  • Reduced reliance on GNU coreutils in the testsuite
  • Refactored and simplified the internals of bftw()

1.2.1

February 8, 2018

  • Performance optimizations

1.2

January 20, 2018

  • Added support for the -perm +7777 syntax deprecated by GNU find (equivalent to -perm /7777), for compatibility with BSD finds
  • Added support for file birth/creation times on platforms that report it
    • -Bmin/-Btime/-Bnewer
    • B flag for -newerXY
    • %w and %Wk directives for -printf
    • Uses the statx(2) system call on new enough Linux kernels
  • More robustness to E2BIG added to the -exec implementation

1.1.4

October 27, 2017

  • Added a man page
  • Fixed cases where multiple actions write to the same file
  • Report errors that occur when closing files/flushing streams
  • Fixed "argument list too long" errors with -exec ... '{}' +

1.1.3

October 4, 2017

  • Refactored the optimizer
  • Implemented data flow optimizations

1.1.2

September 10, 2017

  • Fixed -samefile and similar predicates when passed broken symbolic links
  • Implemented -fstype on Solaris
  • Fixed -fstype under musl
  • Implemented -D search
  • Implemented a cost-based optimizer

1.1.1

August 10, 2017

  • Re-licensed under the BSD Zero Clause License
  • Fixed some corner cases with -exec and -ok parsing

1.1

July 22, 2017

  • Implemented some primaries from NetBSD find:
    • -exit [STATUS] (like -quit, but with an optional explicit exit status)
    • -printx (escape special characters for xargs)
    • -rm (alias for -delete)
  • Warn if -prune will have no effect due to -depth
  • Handle y/n prompts according to the user's locale
  • Prompt the user to correct typos without having to re-run bfs
  • Fixed handling of paths longer than PATH_MAX
  • Fixed spurious "Inappropriate ioctl for device" errors when redirecting -exec ... + output
  • Fixed the handling of paths that treat a file as a directory (e.g. a/b/c where a/b is a regular file)
  • Fixed an expression optimizer bug that broke command lines like bfs -name '*' -o -print

1.0.2

June 15, 2017

Bugfix release.

  • Fixed handling of \0 inside -printf format strings
  • Fixed -perm interpretation of permcopy actions (e.g. u=rw,g=r)

1.0.1

May 17, 2017

Bugfix release.

  • Portability fixes that mostly affect GNU Hurd
  • Implemented -D exec
  • Made -quit not disable the implicit -print

1.0

April 24, 2017

This is the first release of bfs with support for all of GNU find's primitives.

Changes since 0.96:

  • Implemented -fstype
  • Implemented -exec/-execdir ... +
  • Implemented BSD's -X
  • Fixed the tests under Bash 3 (mostly for macOS)
  • Some minor optimizations and fixes

0.*

0.96

March 11, 2017

73/76 GNU find features supported.

  • Implemented -nouser and -nogroup
  • Implemented -printf and -fprintf
  • Implemented -ls and -fls
  • Implemented -type with multiple types at once (e.g. -type f,d,l)
  • Fixed 32-bit builds
  • Fixed -lname on "symlinks" in Linux /proc
  • Fixed -quit to take effect as soon as it's reached
  • Stopped redirecting standard input from /dev/null for -ok and -okdir, as that violates POSIX
  • Many test suite improvements

0.88

December 20, 2016

67/76 GNU find features supported.

  • Fixed the build on macOS, and some other UNIXes
  • Implemented -regex, -iregex, -regextype, and BSD's -E
  • Implemented -x (same as -mount/-xdev) from BSD
  • Implemented -mnewer (same as -newer) from BSD
  • Implemented -depth N from BSD
  • Implemented -sparse from FreeBSD
  • Implemented the T and P suffices for -size, for BSD compatibility
  • Added support for -gid NAME and -uid NAME as in BSD

0.84.1

November 24, 2016

Bugfix release.

  • Fixed #7 again
  • Like GNU find, don't print warnings by default if standard input is not a terminal
  • Redirect standard input from /dev/null for -ok and -okdir
  • Skip . when -delete'ing
  • Fixed -execdir when the root path has no slashes
  • Fixed -execdir in /
  • Support -perm +MODE for symbolic modes
  • Fixed the build on FreeBSD

0.84

October 29, 2016

64/76 GNU find features supported.

  • Spelling suggestion improvements
  • Handle --
  • (Untested) support for exotic file types like doors, ports, and whiteouts
  • Improved robustness in the face of closed std{in,out,err}
  • Fixed the build on macOS
  • Implement -ignore_readdir_race, -noignore_readdir_race
  • Implement -perm

0.82

September 4, 2016

62/76 GNU find features supported.

  • Rework optimization levels
    • -O1
      • Simple boolean simplification
    • -O2
      • Purity-based optimizations, allowing side-effect-free tests like -name or -type to be moved or removed
    • -O3 (default):
      • Re-order tests to reduce the expected cost (TODO)
    • -O4
      • Aggressive optimizations that may have surprising effects on warning/error messages and runtime, but should not otherwise affect the results
    • -Ofast:
      • Always the highest level, currently the same as -O4
  • Color files with multiple hard links correctly
  • Treat -, ), and , as paths when required to by POSIX
    • ) and , are only supported before the expression begins
  • Implement -D opt
  • Implement -D rates
  • Implement -fprint
  • Implement -fprint0
  • Implement BSD's -f
  • Suggest fixes for typo'd arguments

0.79

May 27, 2016

60/76 GNU find features supported.

  • Remove an errant debug printf() from -used
  • Implement the {} ; variants of -exec, -execdir, -ok, and -okdir

0.74

March 12, 2016

56/76 GNU find features supported.

  • Color broken symlinks correctly
  • Fix #7
  • Fix -daystart's rounding of midnight
  • Implement (most of) -newerXY
  • Implement -used
  • Implement -size

0.70

February 23, 2016

53/76 GNU find features supported.

  • New make install and make uninstall targets
  • Squelch non-positional warnings for -follow
  • Reduce memory footprint by as much as 64% by closing DIR*s earlier
  • Speed up bfs by ~5% by using a better FD cache eviction policy
  • Fix infinite recursion when evaluating ! expr
  • Optimize unused pure expressions (e.g. -empty -a -false)
  • Optimize double-negation (e.g. ! ! -name foo)
  • Implement -D stat and -D tree
  • Implement -O

0.67

February 14, 2016

Initial release.

51/76 GNU find features supported.