• v2.26.0 — rsync 3.4.1 drop-in parity
    CI / lint (push) Successful in 1m40s
    CI / sanitizers (undefined) (push) Successful in 44s
    CI / sanitizers (address) (push) Successful in 50s
    CI / build-and-test (push) Successful in 58s
    CI / coverage (push) Successful in 40s
    CI / fuzz-build (push) Successful in 46s
    CI / valgrind (push) Successful in 2m12s
    Stable

    TapTap released this 2026-09-18 19:11:03 +02:00 | 164 commits to main since this release

    FastSync v2.26.0 — rsync 3.4.1 drop-in parity

    This release makes FastSync a drop-in replacement for rsync 3.4.1 across the vast majority of its option surface, and closes the issues tracked in #285–#297.

    Protocol

    • 2.22.0 → 2.26.0 — breaking wire change. Upgrade client and server together; the handshake is strict same-version (no mixed-version peers). --protocol accepts only 2.26.0.

    Highlights

    • Delete timing: true --delete-during / --delete-delay via per-directory delete plans (STATUS_DELETE_PLAN), with -R prefix scoping and dry-run safety.
    • Wire stats: receiver counters (STATUS_STATS) now drive --stats, --progress, and --out-format %b/%c/%C, in both the sequential and --threads paths.
    • Codecs & checksums: lz4/zlib/zlibx compression and md4/sha1/none checksums with negotiation; defaults xxh128/zstd.
    • Selection & paths: general -R/--relative, --no-implied-dirs, -d/--dirs, --iconv, the full filter grammar (merge/dir-merge/hide/show/protect/risk/clear + modifiers), receiver-side --chown TO-name resolution, absolute basis dirs + --link-dest relink, --preallocate over --sparse, --fuzzy, --ignore-existing short-circuit.
    • Compatibility matrix (RSYNC_COMPAT.md): 156 rows — 106 ✅ Parity / 27 ⚠️ Caveat / 23 ❌ Divergent (was 83 / 63 / 4). Every ⚠️ and ❌ row names its residual or rationale.

    Fixes

    • Uninitialized File.matched_bytes leaking garbage into --stats output.
    • --append / --append-verify crash on streamed (large / --sendfile) files.
    • Filter merge-file rollback could double-free after a clear rule.
    • Reject the xattr-name filter modifier x instead of silently treating it as a filename rule.
    • ASan leak in receiver pipeline teardown.
    • valgrind unit-test hang (io-fd redirection leaking across test suites) and uninitialized per_dir_filter_count.

    Known caveats

    27 rows remain ⚠️ with a documented residual (e.g. --progress leading whole-transfer line, %b/%c byte accounting, silent --info/--debug categories, --delete-delay deleted-count, absolute --temp-dir, -M over TCP, --bwlimit units). The 23 ❌ rows are intentional divergences (native daemon config/auth, rsync batch container, privilege namespaces, --protocol downgrade, non-portable --crtimes). See RSYNC_COMPAT.md for the full, honest table.

    Verification

    • Unit tests 43/43; full integration 729 passed / 23 skipped / 1 xpassed; PR gate 301 passed.
    • lint, build-and-test, sanitizers (address|undefined), fuzz-build, coverage, and valgrind all green on both dev and main.
    Downloads