Skip to content

Releases: manfred-kaiser/folderdiff

Release list

1.0.0

Choose a tag to compare

@manfred-kaiser manfred-kaiser released this 05 Jul 08:17

Added

  • Support for comparing tar archives (.tar, .tar.gz, .tar.bz2, .tar.xz)
    in addition to zip archives and plain directories
  • Unit test suite (pytest) covering the core comparison logic and the CLI
  • hatch test / pytest integration in hatch run lint:check

Changed

  • Migrated packaging from setup.py to pyproject.toml with hatch as build backend
  • Raised minimum supported Python version to 3.11 (developed and tested with 3.13)
  • Added a restrictive lint environment (black, bandit, ruff, flake8, pylint, mypy --strict) via hatch run lint:check
  • Added GitHub Actions workflows for linting across supported Python versions and for publishing to PyPI via Trusted Publishing
  • Relicensed from GPL-3.0-or-later to MIT
  • Unreadable files (broken symlinks, missing permissions) are now skipped with
    a warning on stderr instead of aborting the whole comparison
  • folderdiff CLI now prints a clean error message and exits with status 2
    instead of a raw traceback when the comparison itself fails

Fixed

  • Files with duplicate content could be silently dropped from the result
    when computing moved/removed/added file sets, hiding genuinely removed or
    added files whenever another file with identical content existed
  • --prefix had no effect when comparing two plain directories; it only
    ever worked for the zip-archive side
  • A corrupt zip archive's CRC-32 self-test result was computed but never
    checked, so a bad archive still crashed later with an unhandled exception
  • Fixed "profix" typo in the --prefix help text
  • Folder-mode relative paths used os.sep while zip entries always use /,
    so comparing a zip archive against a directory would report every file in
    a subfolder as changed on platforms where os.sep != "/"
  • A named pipe or other special file in the compared directory tree caused
    open() to block indefinitely, hanging the whole comparison; such entries
    are now skipped with a warning instead
  • Zip archive members were read fully into memory before hashing, which
    could exhaust memory on a maliciously crafted archive; hashing is now
    streamed in fixed-size chunks