mirror-dedupe (1.2.2-1) noble; urgency=medium

  * Add Acquire-By-Hash support: yield by-hash/<Algo>/<checksum> sibling
    entries for each Release-listed index file (Release.stream()), so
    apt clients can fetch a permanent hash-named path immune to
    fixed-path staleness from an intermediate cache/CDN
  * Fix man page version drift (was still showing 1.1.4)

 -- Tim Hosking <tim@mungerware.com>  Thu, 30 Jul 2026 23:00:00 +1200

mirror-dedupe (1.2.1-1) noble; urgency=medium

  * Fix arch filter bypass in companion Release node
  * Fix arch filter blocked by len(parts)>=2 gate for top-level entries
  * Fix top_level_filter silently dropped in child-prefix fallback recursion
  * Replace if/elif classifier with table-driven entry type registry
  * Add Contents, dep11/Components, dep11/icons support to classifier

 -- Tim Hosking <tim@mungerware.com>  Wed, 29 Jul 2026 21:00:00 +1200

mirror-dedupe (1.1.3-1) noble; urgency=medium

  * Regenerate all repo configs with glob documentation and updated comments
  * Include nginx configs in .deb package (debian/install)
  * README: add apt install instructions from MungerWare repo

 -- Tim Hosking <tim@mungerware.com>  Tue, 28 Jul 2026 14:00:00 +1200

mirror-dedupe (1.1.2-1) noble; urgency=medium

  * Add glob pattern support (fnmatch) for distributions: noble*, noble/*, */mongodb-org/7.0
  * Remove expand_distributions: replaced by sync-time glob resolution via fnmatch
  * Remove collapse_dists / collapse_distributions entirely
  * Scan always writes full explicit distributions list (no collapse logic)
  * YAML quoting for glob values starting with * ? [ { and other special chars
  * Fix global architecture mask applied even when per-repo architectures absent
  * Add Sources/Sources.gz/Sources.bz2 sync support (directory, checksums, files stanzas)
  * Gate all [apt] debug logs behind --debug flag
  * Fix 3-tuple unpacking in apt.py glob resolution (discovery returns 3-tuples)
  * Fix type annotations in discovery.py (probe_fallback_suites return type)
  * Remove stale collapse_distributions from man pages and config templates

 -- Tim Hosking <tim@mungerware.com>  Tue, 28 Jul 2026 01:30:00 +1200

mirror-dedupe (1.1.1-1) noble; urgency=medium

  * Gate SIGINFO registration on platform support (hasattr check)
  * Fix GPG key URLs: ubuntu-cloud uses cloud-archive keyring, influxdb uses non-compat key
  * Fix dalmatian spelling in ubuntu-cloud config (was "dalamation")
  * Include scripts/ in .deb package (build-repo-paths.sh, list-codenames.sh, sync-hashes.sh)

 -- Tim Hosking <tim@mungerware.com>  Mon, 27 Jul 2026 21:00:00 +1200

mirror-dedupe (1.1.0-1) noble; urgency=medium

  * Fix packaging: include lib/ and repos/ subpackages in .deb
  * Switch pyproject.toml to setuptools auto-discovery
  * Fix NameError: quote all forward references in node_x.py and mdnode.py
  * Fix TypeError: Optional[string forward ref] | None in distribution.py, upstream.py
  * Gate PyPI publishing on build-deb CI success
  * Add explicit module import verification to publish-pypi.yml

 -- Tim Hosking <tim@mungerware.com>  Sun, 26 Jul 2026 18:30:00 +1200

mirror-dedupe (1.0.2-1) noble; urgency=medium

  * Reimplement exclude_packages / exclude_paths filtering (params block)
  * Fix expand_distributions default for mungerware.conf

 -- Tim Hosking <tim@mungerware.com>  Sun, 26 Jul 2026 16:30:00 +1200

mirror-dedupe (1.0.1-1) noble; urgency=medium

  * GPG verification for InRelease/Release files
  * InRelease/anchor support with suite_anchor_exceptions
  * New log_it tabular logging library
  * CLI subcommand refactor; argcomplete support
  * Python >=3.10 required
  * 27 pre-configured repository definitions
  * Updated systemd service command syntax

 -- Tim Hosking <tim@mungerware.com>  Sat, 26 Jul 2026 14:00:00 +1200

mirror-dedupe (1.0.0-1) noble; urgency=medium

  * Complete stream-architecture rewrite:
    - Node-based schema tree model (MDNode) with streaming parsers
    - ThreadPoolExecutor worker model with hash-locked staging
    - Content-addressed pool inventory (hash↔inode bidi tracking)
    - Per-repo path files via single-pass find_stream()
    - APT repo discovery: HTML BFS, codename fallback, explicit candidates
    - Snapshot/restore system with atomic rename
    - RepoLock (flock) per-repo sync isolation
    - SIGINT-safe subprocess tracking
  * New module layout: lib/, repos/apt/, schema/, pool/
  * Changed CLI: --scan with sub-flags
  * Removed: dedupe.py, download.py, indices.py, orchestrate.py,
    sync.py, utils.py (functionality replaced by new architecture)
  * Full git history preserved from both mirror-dedupe and
    mirror-dedupe-dev repositories, joined at this merge commit.

 -- Tim Hosking <tim@mungerware.com>  Wed, 17 Jun 2026 08:30:00 +0000

mirror-dedupe (0.2.12-1) noble; urgency=medium

  * Add configurable rsync_timeout to prevent rsync hangs:
    - run_rsync() accepts a timeout parameter; when > 0, rsync gets
      --timeout=N so stalled upstream connections abort cleanly
    - sync_mirrors() and cleanup_mirrors() read rsync_timeout from
      per-mirror config, falling back to the global mirror-dedupe.conf
    - cli.py merges global config defaults (rsync_timeout, curl_timeout,
      parallel_downloads, etc.) into each mirror config at startup
    - Main config has rsync_timeout: 300 by default
  * Fix run_https_sync() to be a true mirror:
    - Iterates available_indices from the Release file instead of
      hardcoding file patterns, so ALL index types are fetched
      (Packages, Sources, Translations, cnf, dep11, by-hash, etc.)
    - Adds orphan cleanup: removes local files under dists/ not listed
      in the current Release, preventing stale files from a previous
      sync method from causing apt hash mismatches
    - Removes empty directories after orphan cleanup
    Switching between sync_method: rsync and sync_method: https is now
    seamless — both methods leave the mirror fully consistent.

 -- Tim Hosking <tim@mungerware.com>  Tue, 02 Jun 2026 19:30:00 +0000

mirror-dedupe (0.2.11-1) noble; urgency=medium

  * Add force_ipv4 / disable_ipv6 support to the runtime sync pipeline:
    - download_with_curl() now accepts force_ipv4 to pass curl -4
    - run_rsync(), run_https_sync(), download_gpg_key() accept force_ipv4
    - sync_mirrors() and cleanup_mirrors() read disable_ipv6 from mirror
      config and pass it through as force_ipv4
    The scanner (mirror-dedupe-scan) already used -4 everywhere; this brings
    the runtime in line so that mirrors with broken IPv6 (e.g. aarch64 hosts)
    can be configured with disable_ipv6: true and avoid timeouts.

 -- Tim Hosking <tim@mungerware.com>  Sun, 31 May 2026 12:00:00 +0000

mirror-dedupe (0.2.10-1) noble; urgency=medium

  * Teach mirror-dedupe-scan to discover a concrete rsync_upstream using
    rsync daemon probes and only enable rsync when a working dists/ tree
    is found; wire rsync_upstream into the runtime so that rsync-based
    metadata syncs always use the discovered module path.
  * Add a new rsync_upstream key to repos-available/*.conf, populated by
    mirror-dedupe-scan when rsync discovery succeeds, and document this
    behaviour in config/repos-available/README.md and
    mirror-dedupe-scan(1).
  * Refresh shipped repos-available/*.conf, the example nginx
    mirror.conf and related documentation to match current configs.

 -- Tim Hosking <tim@mungerware.com>  Tue, 09 Dec 2025 14:30:00 +0000

mirror-dedupe (0.2.9-1) noble; urgency=medium

  * Add optional per-mirror storage_filters to repos-available/*.conf,
    allowing specific packages or pool paths to be excluded from download
    and storage without rewriting upstream indices. This is primarily
    intended for non-critical third-party mirrors (e.g. pruning nightly
    builds) and is not enabled by default.
  * Document storage_filters, exclude_packages and exclude_paths in the
    mirror-dedupe(1) manpage, including the implications for faithful
    mirroring.
  * Refresh the example nginx mirror.conf to match the set of Ubuntu
    mirror configs shipped with this release.

 -- Tim Hosking <tim@mungerware.com>  Mon, 08 Dec 2025 22:55:00 +0000

mirror-dedupe (0.2.8-1) noble; urgency=medium

  * Fix systemd service ExecStart to pass --config /etc/mirror-dedupe
    instead of a bare positional argument, so the service starts cleanly.
  * Stop installing config/repos-enabled/.gitkeep into /etc so the package
    no longer ships that placeholder file.

 -- Tim Hosking <tim@mungerware.com>  Sun, 07 Dec 2025 17:55:00 +0000

mirror-dedupe (0.2.7-1) noble; urgency=medium

  * Change mirror-dedupe-scan default distribution behaviour:
    - Stop auto-selecting a "primary" series via Release Version.
    - Use explicit --dist/--releases values exactly (with special "all").
    - When no suites are specified, behave as if --releases all was given.
  * Improve architecture discovery and logging:
    - Prefer curl -4 for fetching /dists/ and Release files.
    - Discover architectures/components across all selected suites.
    - Clean up per-suite logging during [3/4] discovery.
  * Add automatic GPG key verification using gpg with a temporary keyring
    against InRelease or Release/Release.gpg.
  * Make gpg a runtime dependency in debian/control.
  * Add a global architectures mask to mirror-dedupe.conf so all mirrors can
    be constrained to a specific arch set.
  * Refresh shipped repos-available/*.conf for Ubuntu, Debian and major
    third-party repos, and add nodesource-node22.
  * Expand and cross-link documentation:
    - Add full mirror-dedupe-scan reference and examples to
      config/repos-available/README.md.
    - Point the top-level README.md at the scanner docs.
    - Update mirror-dedupe-scan(1) man page for new distribution semantics.

 -- Tim Hosking <tim@mungerware.com>  Sun, 07 Dec 2025 17:10:00 +0000

mirror-dedupe (0.2.6-1) noble; urgency=medium

  * Add mirror-dedupe-scan console script to pyproject so debs install scanner.

 -- Tim Hosking <tim@mungerware.com>  Sun, 07 Dec 2025 16:45:00 +0000

mirror-dedupe (0.2.5-1) noble; urgency=medium

  * Fix Debian packaging so mirror-dedupe-scan console script is installed.

 -- Tim Hosking <tim@mungerware.com>  Sun, 07 Dec 2025 16:15:00 +0000

mirror-dedupe (0.2.4-1) noble; urgency=medium

  * Add ubuntu-cloud UCA mirror (epoxy, flamingo).
  * Update nginx mirror.conf with /ubuntu-cloud and symlinks.
  * Fix systemd unit to use /usr/bin/mirror-dedupe entrypoint.

 -- Tim Hosking <tim@mungerware.com>  Sun, 07 Dec 2025 15:40:00 +0000

mirror-dedupe (0.2.3-1) noble; urgency=medium

  * Fix: Add debhelper override to prevent service auto-start during installation
  * Use --no-start flag in dh_installsystemd to prevent dpkg hangs

 -- Tim Hosking <tim@mungerware.com>  Fri, 08 Nov 2025 21:16:00 +0000

mirror-dedupe (0.2.2-1) noble; urgency=medium

  * Fix: Remove [Install] section from service to prevent auto-start during package installation
  * Prevents dpkg hanging while waiting for long-running mirror sync to complete

 -- Tim Hosking <tim@mungerware.com>  Fri, 08 Nov 2025 20:55:00 +0000

mirror-dedupe (0.2.1-1) noble; urgency=medium

  * Fix: Replace Unicode symbols with ASCII for better terminal compatibility
  * Fix: Improve hardlink savings calculation accuracy

 -- Tim Hosking <tim@mungerware.com>  Tue, 29 Oct 2025 00:47:00 +0000

mirror-dedupe (0.2.0-1) noble; urgency=medium

  * Restructure to repos-available/repos-enabled pattern
  * Add pre-configured repository definitions (ubuntu, grafana, influxdb)
  * Simplify repository management with symlink-based enabling/disabling

 -- Tim Hosking <tim@mungerware.com>  Mon, 28 Oct 2025 23:04:00 +0000

mirror-dedupe (0.1.0-1) noble; urgency=medium

  * Initial release
  * Mirror synchronisation with intelligent deduplication
  * Support for multiple mirrors with global deduplication
  * Configurable via YAML files
  * Systemd timer support

 -- Tim Hosking <tim@mungerware.com>  Mon, 28 Oct 2025 19:33:00 +0000
