version 1.4.0:  2026-02-13

  The filehash, notabs, notrail, opt-gif, opt-jpg, opt-pdf, opt-png, rot-jpg,
  and recomp-jpg utilities were all rewritten in Python.  These utilities now
  use fewer temp files and (most) offer multi-threaded operation, making all
  (except filehash) much faster.

  The original bash- and C-based repeats utility was deleted.  Now repeats is a
  symlink to repeats.py.

  A Python-based preplace now accompanies lreplace.  It is faster and uses
  straight string replacements instead of regular expressions.

  In recognition of these extensive changes, littleutils is being promoted to
  version 1.4.0.  New and changed options for utilities include the following:

    filedate:  Gained the -U(TC_time) option.
    filehash:  Gained the -T(hreads) option.
    notabs:  Gained the -f(ilelist) and -p(ipe) options.
    notrail:  Gained the -a(ll_whitespace), -f(ilelist), and -p(ipe) options.
    opt-gif:  Gained the -f(ilelist), -p(ipe), and -T(hreads) options.
    opt-jpg:  Gained the -f(ilelist), -p(ipe), -r(otate), -M(ax_quality), and
              -T(hreads) options.
    opt-pdf:  Gained the -f(ilelist), -p(ipe), and -T(hreads) options.  API
              CHANGE!!  The previous -f(orce) option was changed to -F(orce).
    opt-png:  Gained the -f(ilelist), -p(ipe), and -T(hreads) options.  Now
              tries optipng in addition to pngcrush.
    recomp-jpg:  Gained the -f(ilelist), -p(ipe), and -T(hreads) options.  Now
                 runs opt-jpg in the background.
    rot-jpg:  Gained the -f(ilelist), -p(ipe), and -T(hreads) options.  Now
              runs opt-jpg in the background.

version 1.2.9:  UNRELEASED

  API CHANGE!!  The fileown utility now prints "uid:gid" instead of "uid.gid",
  as expected by more recent versions of chown.

  The imagsize utility has been updated to read all possible JPEG SOFx markers,
  enabling it to work with a broader range of JPEG images, including those that
  are arithmetic-encoded.

version 1.2.8:  2025-10-17

  New littleutil pdfbw4, which is used to reduce the size of images embedded in
  PDF documents by converting them to black-and-white (not grayscale).  Like
  pdfquant, it is targeted at PDF files created by scanning software.  For
  strictly black-and-white PDFs, it does a better job.

  The pren, uppercase, and lowercase utilities now have a -g option that will
  use the git command to rename files instead of perl's internal rename
  function.  It is useful for doing large-scale renames in git repositories.

  BUG FIX!  A long-standing error in repeats.py that caused options -7 and -8
  to use different b2sum tree depths rather than different digest sizes was
  fixed.  This resulted in greater memory consumption when -7 was used.

  The repeats.pl and repeats.py utilities were tweaked significantly to improve
  speed, particularly when scanning a large number of small files.

version 1.2.7:  2024-12-15

  The imagsize utility now handles WEBP image files.

  Changed the default "fuzz distance" in pdfidiff from 1 to 15.

  API CHANGE!!  All three duplicate file finders (repeats, repeats.pl, and the
  new repeats.py) will now use the -i option in place of the -m option.  The
  functionality is exactly the same, with only the name of the option having
  been changed.

  Added the -m option to repeats.pl and repeats.py to limit the search for
  duplicates to files of a minimum size.  This is intended to be used for
  "quick-and-dirty" searches for large duplicates that can be deleted (or
  replaced with links) to quickly save storage space.

  When reporting statistics, repeats.pl and repeats.py now report the total
  size of extra copies along with the total size of all files that have
  duplicates.  This better indicates the total amount of space that could be
  saved by replacing duplicates with links.

version 1.2.6:  2023-06-25

  API CHANGE!!  The to-bzip utility has been renamed to-bzip2 to better
  differentiate from the new to-bzip3.

  Added to-bzip3.  Additionally, the to-7zip, to-lzip, to-lzma, to-xz, and
  to-zst utilities will now all convert .bz3 files.

  The filehash utility now uses unlocked I/O for most algorithms, which can be
  faster in certain circumstances.  It also prints hash results in base64 if
  the -B option is used and in BSD-style format if the -C option is used.

  The recomp-jpg utility now recompresses grayscale JPEG images as grayscale.
  There is also a new -d option to select between 'float', 'int', and 'fast'
  DCT methods.

  The repeats utility now reads 16384 bytes per file in stage 2 instead of
  65536.  This reduces the I/O and CPU time for most data sets.  Also,
  repeats.pl has been updated to silently skip unreadable files and directories
  instead of aborting, and a new repeat.py utility that functions similarly to
  repeats.pl has been added.

version 1.2.5:  2021-10-29

  Upgrade build system from autoconf-2.69 to 2.71.

  New littleutil pdfquant, which is used to reduce the size of the colormap
  used by images embedded in PDF documents.  It is targeted at PDF files
  created by scanning software.

  The filesize utility will now totalize the sum of all filesizes if the -t
  option is used.

  The tempname utility will now add 8 random characters to the filename prefix
  instead of 6.

  The randomize and tempname utilities now use CLOCK_MONOTONIC time as a
  fallback for /dev/urandom.

  The filehash utility will now print hash results in base64url instead of
  hexadecimal if the -b option is used.

version 1.2.4:  2021-03-28

  Major update of scripts to use modern bash(1) techniques.  Functionality is
  unchanged.

  Fixed Cygwin memory reporting in lsysinfo.

version 1.2.3:  2020-11-27

  Added repeats.pl, which is perl-based utility that functions very similarly
  to repeats.  [This was previously called repeats_clone.pl in the source code
  but was never installed.]

  Massively cleaned up manpages, with a particular emphasis on better layout in
  wider terminal windows.

version 1.2.2:  2020-09-26

  Portability fixes for recent releases of img2pdf and ghostscript.

version 1.2.1:  2020-07-25

  The pdfidiff utility now uses poppler (via pdftocairo) as the default PDF
  rendering engine.  The -g option may be used to select the previous
  ghostscript (gs) engine.

  The opt-pdf utility now tries both poppler and ghostscript to minimize the
  size of a PDF file.

  The repeats utility now reads 65536 bytes per file in stage 2 instead of only
  4096.  This greatly reduces the number of files evaluated in stage 3 and
  saves time for most data sets.

version 1.2.0:  2020-03-22

  The build intrastructure now supports out-of-tree builds.  In celebration of
  this new feature, littleutils is being promoted to version 1.2.0.

  Added -x and -X options to uppercase and lowercase to support extension-only
  file renames.

  Added new littleutil to-zst, to recompress files using Zstd.  Additionally,
  to-lzip, to-lzma, and to-xz have been updated to convert .zst files to their
  respective target file formats.

  Added -7 and -8 options to filehash to support BLAKE2B 256-bit and 512-bit
  hashes.  The repeats utility now uses BLAKE2B-512 as the default to reduce
  the risk of false positives and to speed things up (by a factor of 3 in some
  cases, but normally less) relative to the previous default of SHA256.

version 1.0.44:  2020-01-18

  Added the new rot-jpg utility, used to losslessly rotate JPEG images from
  the command line.

  Added the new lsysinfo utility, which prints out information from the
  sysinfo(2) and sysconf(3) calls.

version 1.0.43:  2019-09-09

  Updated rar2tarcat and zip2tarcat to use python3 instead of python2, plus
  other minor fixes.

version 1.0.42:  2019-07-12

  Replaced -v option in pdfidiff with -q, as run times are long enough that
  most users will want progress information.

  As an error-proofing measure, lreplace now refuses to process zero-length
  input or output.  The new -z and -Z options can be specified to explicitly
  permit these, respectively.

  Fixed an error in rar2tarcat using bug report and patch from Lazy Kent.

version 1.0.41:  2019-04-06

  Fix -f option in imagdiff.  Added -f option to pdfidiff.

version 1.0.40:  2019-02-09

  Added checks for header files to improve portability on MacOS, per a bug
  report by Yves@DMX.

  Added -t option to all opt-* scripts to preserve timestamps on modified
  files.

  New littleutils imagdiff and pdfidiff, which can be used to create "delta"
  files showing the differences between two image files or two PDF files,
  respectively.

  Added -r option to opt-png and pngstrip to explicitly set the assumed pixel
  resolution.  Also update pngstrip to preserve pHYs chunk information if the
  resolution is not explicitly set.

version 1.0.39:  2018-07-08

  Fixed makefile that resulted in to-7zip being created without a script
  interpreter.  From bug report by Lazy Kent.

version 1.0.38:  2018-07-06

  Added -4 and -6 options to all to-* scripts to  specify that IPv4 or IPv6
  should be preferred for URL downloads, respectively.

  Added code to randomize and tempname to seed the random number generator with
  bytes from /dev/urandom, if it's available.

  Added logic to opt-pdf to avoid running Ghostscript on PDF files that have
  already been processed.  Requires that pdfinfo from poppler be present on the
  system.

  Added -c option to filehash to print output in classic format.

  Resynced tempname and filehash with upstream.

version 1.0.37:  2017-01-19

  Cached stat calls in lower/uppercase and pren to improve performance under
  Cygwin in a networked environment.  Additional tweaks to opt-pdf, opt-png,
  and to-* scripts.

version 1.0.36:  2016-07-30

  Added file download capability to the various to-* file recompression
  utilities (via wget), so that a file may be downloaded and recompressed with
  a single command.

version 1.0.35:  2016-02-29

  Added extra checks to ensure proper recompressor behavior regardless of
  installation environment.  Change to lbzip2 for parallel engine inside
  to-bzip2.

version 1.0.34:  2015-11-14

  Added options to use multi-threaded compressors inside to-gzip, to-bzip,
  to-lzip, to-lzma, and to-xz recompression utilities, per SourceForge user
  Lazy Kent suggestion.

  BUGFIX!  The -b and -c options in wipe-free were being ignored.  This has now
  been fixed.

version 1.0.33:  2015-03-27

  Added rarfile-handling and timestamp-preserving functionality to all to-*
  archive conversion scripts, compliments of a patch by SourceForge user D.
  Gloger.  This includes the new rar2tarcat utility.

version 1.0.32:  2014-08-08

  Added zipfile-handling and timestamp-preserving functionality to all to-*
  archive conversion scripts, compliments of a patch by SourceForge user D.
  Gloger.  This includes the new zip2tarcat utility.

  Fixed a portability fix for OS X, based on a patch by SourceForge user Zeese
  Blevens.

version 1.0.31:  2014-02-07

  Numerous resyncs with upstream, plus a few manpage tweaks.  No actual change
  in functionality.

version 1.0.30:  2013-12-08

  Added new littleutil opt-pdf, intended to make PDF files smaller and/or more
  correct.

  Added lzma conversion capability to to-xz and to-lzip, based on a patch from
  SourceForge user D. Gloger.

version 1.0.29:  2013-06-26

  Finally added cmp-based paranoia check to repeats.

version 1.0.28:  2013-06-02

  Replace needless double-quotes with single-quotes throughout shell scripts
  for improved performance.

  Minor portability fixes for PNG-associated programs.

version 1.0.27:  2012-12-04

  Numerous documentation tweaks.

  Replace "bash" with "dash" in most shell scripts for improved performance.
  This is particularly important when running instances of short-duration
  scripts in parallel, where the total time used to repeatedly invoke the shell
  becomes significant.  [Special thanks to V. Hamner for the suggestion.]

version 1.0.26:  2012-06-17

  Added nanosecond timestamp support to filedate for systems and output formats
  that support it.

  Made filenode compatible with 64-bit inode numbers.

  Updated the FAQ and several manpages to better explain how the littleutils
  compare to coreutils.

  Updated to autoconf-2.69.

version 1.0.25:  2012-01-12

  Rename the realpath utility to lrealpath.  The old name is the same as that
  of a new utility distributed with coreutils-8.15.  The new name should be
  collision-free.

  Added new littleutil to-gzip.

  Added .lzo file handling capability to to-bzip, to-lzip, to-lzma, and to-xz.

version 1.0.24:  2011-03-06

  Added new littleutil wipe-free, which overwrites all free space in a
  filesystem with zeros.

  Added -a option to opt-jpg and recomp-jpg to control whether or not trials
  with arithmetic encoding will be allowed.  This alternate encoding improves
  compression performance, but at the potential expense of lost compatibility
  with older graphics software.

  Updated lreplace, notabs, and notrail to print a comment when a file is
  modified.  This can be suppressed with the -q option, or comments on ALL
  files examined can be generated with the -v option.

  The filehash utility now uses about 2% less CPU time, which in turn means
  that the repeats utility now uses about 2% less CPU time.

  Added notes to several manpages that describe how to take advantage of
  parallel processing.

  Updated to autoconf-2.68.

version 1.0.23:  2009-11-11

  Improved 32-bit vs 64-bit installation techniques, to facilitate downstream
  packaging efforts.  None of the actual utilities are changed from version
  1.0.22.

version 1.0.22:  2009-11-01

  Updated to autoconf-2.64.

  Added new littleutil fileown, which allows a query of a file's uid/username
  or gid/group name.

  Added -m option to opt-jpg to control whether comments and other extra
  markers are copied with the JPEG files.

version 1.0.21:  2009-04-11

  Updated to autoconf-2.63.

  Removed .7z-to-.lzma conversion capability from to-lzma.  This was always
  fairly pointless, given the similarity in compression ratios.  Removing it
  simplifies maintenance.

  Added new littleutils to-lzip and to-xz, which are markedly similar to
  to-lzma, except that lzip from LZIP and xz from the XZ utils are used
  instead.

version 1.0.20:  2008-03-17

  Removed memchurn utility entirely.  Anyone looking to do real memory testing
  should be using memtest86 or memtest86+ instead.

  Improved portability for to-7zip script in the "extra" subdirectory.

  BUGFIX!  The -t option in filedate didn't actually create output that was
  compatible with the -t option of touch.  This has been fixed.

  BUGFIX!  The pngstrip utility (and the opt-png script that called it) would
  sometimes delete the transparency chunk even without the -a option.  This
  long-standing bug identified by an anonymous SourceForge user has been fixed.

version 1.0.19:  2008-01-23

  BUGFIX!  The 1.0.18 version of repeats fails to remove temporary working
  files.  This has now been fixed.

  Reworked to-lzma to use either Ville Koskinen's lzma utility (part of LZMA
  Utils), which uses gzip-style options, or Igor Pavlov's lzma_alone (part of
  LZMA SDK), which uses 7zip-style options.

  Tweaked numerous manpages.

version 1.0.18:  2008-01-23

  Substantially reworked filehash utility, allowing it to print any of the MD5,
  SHA1, SHA224, SHA256, SHA384, and/or SHA512 algorithms.  These are selected
  using the -1, -2, -3, -4, -5, and -6 options, respectively.  Printing
  filesizes is now optional with the -s option.  The -q and -v options can be
  used to enforce or suppress filename printing, in the same manner as most
  of the other "file*" utilities.

  The repeats utility now only uses a single selectable hash instead of two
  fixed hashes (previously MD5 and SHA1).  The default is now the SHA256
  algorithm.  It now reads each file only once instead of twice, potentially
  making utility execution faster, particular on very large files.

  Added frenum utility (generously donated by Renuk de Silva).  This clever
  utility allows mass renaming/renumbering of files using a number of different
  schemes.

  BUGFIX!  Fixed some broken autoconfig logic regarding getopt include file
  handling.  Amazing, no bug reports associated with this have been reported.

version 1.0.17:  2007-10-18

  Re-released most utilities under GPL version 3.

  The tempname utility now features a -D option which can be used to create a
  temporary directory instead of a temporary file.

  Removed -q option from realpath utility.  It now operates in quiet mode
  always unless explicitly called to do otherwise with the -v option.

version 1.0.16:  2006-11-18

  Feature enhancement.  The tempname utility can now use the -c option and the
  -s option simultaneously.  Using the -c option is *still* not recommended.

  Feature enhancement.  The to-7zip utility (in the extra directory) now tries
  the PPMd compression algorithm in addition to LZMA.  Whichever algorithm
  yields better results is used.

version 1.0.15a:  2006-10-15

  BUGFIX!  The to-lzma utility in the extra directory (only installed with the
  "make install-extra" command) was completely broken due to bad temporary file
  handling.  This patch fixes the problem.

  [Special thanks to Rus V. Brushkoff for the error report and a preliminary
  version of the patch.]

version 1.0.15:  2006-10-12

  Build fixes.  Build was broken entirely on Solaris 2.8.  This is now fixed.

  Also, manpage for new recomp-jpg utility was not properly installed.  This is
  also fixed.

  [Sigh...  I obviously didn't test 1.0.14 enough.  My apologies.]

version 1.0.14:  2006-10-11

  Added new littleutil recomp-jpg, used for shrinking down oversized JPEG image
  files.

  Minor bugfix.  Help message in filehash utility said "filesize".  It now says
  "filehash" as it should.

  Minor bugfix.  Make options handling in lreplace more robust, to ensure that
  both the -i and -o options are set.

  Minor feature enhancement.  Make repeats immune to declaring as repeats two
  files on different devices that happen to have the same filesize and inode
  number.

  Tweaked autoconf scripts to eliminate spurious "seems to ignore the
  --datarootdir setting" warnings created by autoconf-2.60.  Manpages are now
  installed under /usr/local/share/man instead of /usr/local/man.

version 1.0.13:  2006-06-08

  Rename the replace utility to lreplace.  The old replace name was the same
  as a common MySQL command.  The new name should be collision-free.

  [Special thanks to "crazy" of Frugalware, who spotted this issue.  The
  Frugalware folks renamed replace to lreplace, so I decided to do the same.]

  Added examples to several manpages.

version 1.0.12:  2006-05-08

  Various minor documentation clean-ups.  No actual code changes.

version 1.0.11:  2006-03-22

  Added to-lzma utility.

  Added -d option to to-bzip, to-7zip, and to-lzma utilities to delete original
  version of the compressed data.

  Added -k option to to-bzip, to-7zip, and to-lzma utilities to keep whichever
  version of the compressed data is smallest.

version 1.0.10:  2006-02-22

  Added to-bzip to to-7zip utilities.

version 1.0.9:  2005-12-02

  The repeats utility no longer lists hardlinked files as duplicates.  The old
  behavior can be re-enabled with the -l option.

  Significant cleanups to manpages and other documentation.

version 1.0.8:  2005-11-05

  BUGFIX!  The uppercase, lowercase, and pren utility couldn't rename
  directories on Unix because of a security check glitch.  This has been fixed.

version 1.0.7:  2005-11-03

  Added lowercase and uppercase utilities.

  Added optional pren (perl rename) utility, found in the extra subdirectory.
  Install with "make install-extra".

  BUGFIX!  The "-d" option in replace was accidentally disabled.  This is now
  fixed.

version 1.0.6:  2005-10-13

  Most littleutils will now print version information along with help info.

  BUGFIX!  Fixed memory allocation in randomize that caused memory exhaustion
  when standard input was used.

version 1.0.5:  2005-07-04

  BUGFIX!  Fixed option-parsing glitch in randomize that prevented -0/-z option
  from working.

  BUGFIX!  Previously, the -g option of pngstrip would not convert
  palette-based PNG images to grayscale.  This has been fixed.

  Now when then memchurn utility runs out of memory now, it will simply stop
  allocating (and proceed with what it has) instead of aborting completely.

  Removed opt-gjpg and gray-png scripts.  Added -g flags to opt-jpg and opt-png
  to compensate.

version 1.0.4:  2005-06-21

  Reworked randomize to allow for arbitrary length lines and multiple input
  files.  It previously had a 1024 character limit on line length.  It is
  also now much more efficient with memory.

version 1.0.3:  2005-01-03

  Corrected largefile issues on filehash (Cygwin in particular).

  Improved error handling on most scripts.

version 1.0.2:  2004-11-06

  Added memchurn utility.

  Reworked opt-gif script to use gifsicle as a core instead of converting to
  PNG and back.  It's much faster and even works with animated GIF images.

version 1.0.1:  2004-07-28

  Renamed from miscutils to littleutils.  The miscutils namespace was already
  pretty crowded.

  Added replace script.

version 1.0.0:  2004-07-25

  Initial public release.
