# Rsync Feature Compatibility This document maps rsync's full feature set to FastSync's current implementation status. ## Summary | Status | Count | Description | |--------|-------|-------------| | ✅ Implemented | 34 | Feature works end-to-end | | 🔀 Alt Arg | 3 | Functionality exists but under different flag/semantics | | ⚠️ Partial | 1 | Flag parsed/stored but behavior incomplete | | ❌ Not Implemented | 98 | Flag not recognized or no behavior | | **Total** | **136** | | --- ## 1. General Options | Flag | Rsync Description | FastSync Status | Notes | |------|-------------------|-----------------|-------| | `-a`, `--archive` | Archive mode is -rlptgoD | 🔀 Alt Arg | Maps to -c -m -M (compression + multithread + metadata) | | `-v`, `--verbose` | Increase verbosity | ✅ Implemented | Sets `log_level=DEBUG` | | `-q`, `--quiet` | Suppress non-error messages | ❌ Not Implemented | Removed because it had no effect | | `--help` | Show help | ✅ Implemented | Prints usage and exits; `-h` is not accepted | | `-V`, `--version` | Print version | ✅ Implemented | | | `--info=FLAGS` | Fine-grained info verbosity | ❌ Not Implemented | Removed because it had no effect | | `--debug=FLAGS` | Fine-grained debug verbosity | ❌ Not Implemented | Removed because it had no effect | | `--stderr=MODE` | Change stderr output mode | ❌ Not Implemented | | | `--no-motd` | Suppress daemon MOTD | ❌ Not Implemented | | | `--exclude=PATTERN` | Exclude files matching pattern | ✅ Implemented | Glob matching in scanner | | `--include=PATTERN` | Include files matching pattern | ✅ Implemented | Glob matching in scanner | | `-C`, `--cvs-exclude` | Auto-ignore CVS files | ❌ Not Implemented | Removed because it had no effect | ## 2. Modifying Output | Flag | Rsync Description | FastSync Status | Notes | |------|-------------------|-----------------|-------| | `--stats` | Give transfer stats | ✅ Implemented | Prints file/byte counts | | `-h`, `--human-readable` | Human-readable numbers | ❌ Not Implemented | Removed because it had no effect | | `-i`, `--itemize-changes` | Per-file change summary | ❌ Not Implemented | Removed because it had no effect | | `--progress` | Show progress | ✅ Implemented | Progress callback in sender | | `-P` | Same as --partial --progress | ❌ Not Implemented | | | `--out-format=FORMAT` | Custom output format | ❌ Not Implemented | Removed because it had no effect | | `--log-file=FILE` | Log to file | ✅ Implemented | `log_file` config field | | `--log-file-format=FMT` | Log format | ❌ Not Implemented | | | `--8-bit-output` | Leave high-bit chars unescaped | ❌ Not Implemented | | | `--list-only` | List files instead of copying | ❌ Not Implemented | Removed because it had no effect | ## 3. File Selection | Flag | Rsync Description | FastSync Status | Notes | |------|-------------------|-----------------|-------| | `--exclude-from=FILE` | Read exclude patterns from file | ✅ Implemented | Reads patterns from file | | `--include-from=FILE` | Read include patterns from file | ✅ Implemented | Reads patterns from file | | `--filter=RULE` | Add file-filtering rule | ❌ Not Implemented | Removed because it had no effect | | `--files-from=FILE` | Read source file list from file | ❌ Not Implemented | Removed because it had no effect | | `-0`, `--from0` | Delimit *-from files with NULs | ❌ Not Implemented | | | `--max-size=SIZE` | Skip files larger than SIZE | ✅ Implemented | `max_size` in scanner | | `--min-size=SIZE` | Skip files smaller than SIZE | ✅ Implemented | `min_size` in scanner | | `-I`, `--ignore-times` | Don't skip files matching size+time | ❌ Not Implemented | | | `--size-only` | Skip based on size only | ❌ Not Implemented | | | `-@`, `--modify-window=NUM` | Mod-time comparison accuracy | ❌ Not Implemented | | | `--existing` | Skip creating new files on receiver | ❌ Not Implemented | | | `--ignore-existing` | Skip updating existing files | ❌ Not Implemented | | | `--remove-source-files` | Sender removes synced files | ❌ Not Implemented | | ## 4. Directory Options | Flag | Rsync Description | FastSync Status | Notes | |------|-------------------|-----------------|-------| | `-r`, `--recursive` | Recurse into directories | ✅ Implemented | Default behavior | | `-R`, `--relative` | Use relative path names | ❌ Not Implemented | Removed because it had no effect | | `--no-implied-dirs` | Don't send implied dirs with -R | ❌ Not Implemented | | | `-d`, `--dirs` | Transfer dirs without recursing | ❌ Not Implemented | | | `--mkpath` | Create missing path components | ❌ Not Implemented | | ## 5. Transfer Modifications | Flag | Rsync Description | FastSync Status | Notes | |------|-------------------|-----------------|-------| | `-u`, `--update` | Skip files newer on receiver | ❌ Not Implemented | Removed because it had no effect | | `--inplace` | Update files in-place | ✅ Implemented | Direct write mode | | `--append` | Append data to shorter files | ❌ Not Implemented | Removed because it had no effect | | `--append-verify` | Append with old-data checksum | ❌ Not Implemented | Removed because it had no effect | | `-W`, `--whole-file` | Copy whole file (no delta) | ❌ Not Implemented | | | `--block-size=SIZE` | Force checksum block-size | ⚠️ Partial | Parsed as `--delta-block`; controls delta transfer block size | ## 6. Destination Handling | Flag | Rsync Description | FastSync Status | Notes | |------|-------------------|-----------------|-------| | `-n`, `--dry-run` | Trial run with no changes | ✅ Implemented | `dry_run` config field | | `-b`, `--backup` | Make backups of overwritten files | ✅ Implemented | Backup before overwrite | | `--backup-dir=DIR` | Backup directory hierarchy | ✅ Implemented | `backup_dir` config field | | `--suffix=SUFFIX` | Backup suffix (default ~) | ✅ Implemented | `suffix` config field | | `--delay-updates` | Put updated files in place at end | ❌ Not Implemented | | ## 7. Deletion | Flag | Rsync Description | FastSync Status | Notes | |------|-------------------|-----------------|-------| | `--delete` | Delete extraneous files from dest | ✅ Implemented | `use_delete` config field | | `--delete-before` | Delete before transfer | ❌ Not Implemented | Removed because it had no effect | | `--delete-during` | Delete during transfer | ❌ Not Implemented | | | `--delete-delay` | Find deletions during, delete after | ❌ Not Implemented | | | `--delete-after` | Delete after transfer | ❌ Not Implemented | Removed because it had no effect | | `--delete-excluded` | Also delete excluded files | ❌ Not Implemented | Removed because it had no effect | | `--max-delete=NUM` | Max files to delete | ❌ Not Implemented | Removed because it had no effect | | `--ignore-errors` | Delete even with I/O errors | ❌ Not Implemented | | | `--force` | Force deletion of non-empty dirs | ❌ Not Implemented | | | `--prune-empty-dirs` | Prune empty dir chains | ❌ Not Implemented | Removed because it had no effect | ## 8. Metadata Preservation | Flag | Rsync Description | FastSync Status | Notes | |------|-------------------|-----------------|-------| | `-M`, `--preserve` | Preserve file metadata | ✅ Implemented | Mode, uid, gid, mtime | | `-p`, `--perms` | Preserve permissions | 🔀 Alt Arg | `-p` means SSH port; permissions preserved via `-M`/`--preserve` | | `-o`, `--owner` | Preserve owner | ✅ Implemented | Part of -M | | `-g`, `--group` | Preserve group | ✅ Implemented | Part of -M | | `-t`, `--times` | Preserve modification times | ✅ Implemented | Part of -M | | `-E`, `--executability` | Preserve executability | ❌ Not Implemented | | | `--chmod=CHMOD` | Affect file permissions | ❌ Not Implemented | | | `-A`, `--acls` | Preserve ACLs | ❌ Not Implemented | Removed because it had no effect | | `-X`, `--xattrs` | Preserve extended attributes | ❌ Not Implemented | Removed because it had no effect | | `-H`, `--hard-links` | Preserve hard links | ❌ Not Implemented | Removed because it had no effect | | `-D` | Same as --devices --specials | ❌ Not Implemented | Removed because device-file handling is not implemented | | `--devices` | Preserve device files | ❌ Not Implemented | Removed because it had no effect | | `--specials` | Preserve special files | ❌ Not Implemented | | | `--copy-devices` | Copy device contents as file | ❌ Not Implemented | | | `--write-devices` | Write to devices as files | ❌ Not Implemented | | | `-U`, `--atimes` | Preserve access times | ❌ Not Implemented | | | `-N`, `--crtimes` | Preserve create times | ❌ Not Implemented | | | `-O`, `--omit-dir-times` | Omit dirs from --times | ❌ Not Implemented | | | `-J`, `--omit-link-times` | Omit symlinks from --times | ❌ Not Implemented | | | `--super` | Receiver attempts super-user activities | ❌ Not Implemented | | | `--fake-super` | Store/recover privileged attrs via xattrs | ❌ Not Implemented | | ## 9. Symlink Handling | Flag | Rsync Description | FastSync Status | Notes | |------|-------------------|-----------------|-------| | `-l`, `--links` | Copy symlinks as symlinks | ⚠️ Partial | Scanner includes symlinks; target path not transmitted | | `-L`, `--copy-links` | Transform symlink to referent | ✅ Implemented | `copy_links` config field | | `--copy-unsafe-links` | Transform unsafe symlinks | ✅ Implemented | `copy_unsafe_links` config field | | `--safe-links` | Ignore symlinks outside tree | ✅ Implemented | `safe_links` config field | | `--munge-links` | Munge symlinks for safety | ❌ Not Implemented | | | `-k`, `--copy-dirlinks` | Transform symlink to dir | ❌ Not Implemented | | | `-K`, `--keep-dirlinks` | Treat symlinked dir as dir | ❌ Not Implemented | | ## 10. Sparse & Device | Flag | Rsync Description | FastSync Status | Notes | |------|-------------------|-----------------|-------| | `-S`, `--sparse` | Sparse block handling | ✅ Implemented | `preserve_sparse` config field | | `--preallocate` | Allocate dest files before writing | ❌ Not Implemented | | ## 11. Checksum & Comparison | Flag | Rsync Description | FastSync Status | Notes | |------|-------------------|-----------------|-------| | `--checksum` | Skip based on checksum | ❌ Not Implemented | Removed because it had no effect; `-c` means compression | | `--checksum-choice=STR` | Choose checksum algorithm | ❌ Not Implemented | xxHash used internally | | `--compare-dest=DIR` | Compare dest files relative to DIR | ❌ Not Implemented | Removed because it had no effect | | `--copy-dest=DIR` | Include copies of unchanged files | ❌ Not Implemented | Removed because it had no effect | | `--link-dest=DIR` | Hardlink to files when unchanged | ❌ Not Implemented | Removed because it had no effect | | `--fuzzy`, `--no-fuzzy` | Find similar file for basis | ❌ Not Implemented | | ## 12. Compression | Flag | Rsync Description | FastSync Status | Notes | |------|-------------------|-----------------|-------| | `-z`, `--compress` | Compress file data | 🔀 Alt Arg | Always uses zstd (rsync supports multiple algorithms) | | `--compress-choice=STR` | Choose compression algorithm | ❌ Not Implemented | Removed because it had no effect; FastSync always uses zstd | | `--compress-level=NUM` | Set compression level | ✅ Implemented | 1-22, default 5 | | `--compress-threads=NUM` | Set compression threads | ❌ Not Implemented | | | `--skip-compress=LIST` | Skip compress for suffixes | ❌ Not Implemented | Internal skip for hardcoded types; not user-configurable | ## 13. Connectivity | Flag | Rsync Description | FastSync Status | Notes | |------|-------------------|-----------------|-------| | `-e`, `--rsh=COMMAND` | Remote shell to use | ❌ Not Implemented | Removed; SSH invokes `ssh` directly | | `--rsync-path=PROGRAM` | rsync binary on remote | ❌ Not Implemented | Removed; use `--fastsync-server-path` | | `--port=PORT` | Alternate daemon port | ✅ Implemented | `server_port` config field | | `--sockopts=OPTIONS` | Custom TCP options | ❌ Not Implemented | | | `--blocking-io` | Use blocking I/O for remote shell | ❌ Not Implemented | | | `--outbuf=N\|L\|B` | Set output buffering | ❌ Not Implemented | | | `--address=ADDRESS` | Bind address for outgoing socket | ❌ Not Implemented | Removed because it had no effect | | `-4`, `--ipv4` | Prefer IPv4 | ❌ Not Implemented | Removed because it had no effect | | `-6`, `--ipv6` | Prefer IPv6 | ❌ Not Implemented | Removed because it had no effect | ## 14. Daemon Mode | Flag | Rsync Description | FastSync Status | Notes | |------|-------------------|-----------------|-------| | `--daemon` | Run as rsync daemon | ❌ Not Implemented | Removed because it had no effect | | `--config=FILE` | Alternate rsyncd.conf file | ❌ Not Implemented | Removed because it had no effect | | `--dparam=OVERRIDE` | Override global daemon config | ❌ Not Implemented | | | `--no-detach` | Don't detach from parent | ❌ Not Implemented | | | `--password-file=FILE` | Read daemon password from file | ❌ Not Implemented | | | `--early-input=FILE` | Use FILE for daemon early exec | ❌ Not Implemented | | ## 15. Safety & Security | Flag | Rsync Description | FastSync Status | Notes | |------|-------------------|-----------------|-------| | Path escape detection | Ensure files stay within root | ✅ Implemented | `has_path_traversal()` + realpath | | Symlink-safe delete | Skip symlinks in delete walk | ✅ Implemented | `delete_extras_walk()` | | Protocol version check | Verify compatible versions | ✅ Implemented | `config_receive()` | | Max data/string/chunk sizes | Prevent OOM attacks | ✅ Implemented | Per-message limits | | Per-connection memory limit | 1GB per connection | ✅ Implemented | `MAX_CONNECTION_MEMORY` | | `--trust-sender` | Trust remote sender's file list | ❌ Not Implemented | | | `--old-args` | Disable modern arg protection | ❌ Not Implemented | | | `--ignore-missing-args` | Ignore missing source args | ❌ Not Implemented | | | `--delete-missing-args` | Delete missing source args | ❌ Not Implemented | | ## 16. Batch Operations | Flag | Rsync Description | FastSync Status | Notes | |------|-------------------|-----------------|-------| | `--write-batch=FILE` | Write batched update to file | ❌ Not Implemented | | | `--only-write-batch=FILE` | Write batch without updating dest | ❌ Not Implemented | | | `--read-batch=FILE` | Read batched update from file | ❌ Not Implemented | | ## 17. Advanced | Flag | Rsync Description | FastSync Status | Notes | |------|-------------------|-----------------|-------| | `--stop-after=MINS` | Stop after N minutes | ❌ Not Implemented | | | `--stop-at=TIME` | Stop at specified time | ❌ Not Implemented | | | `--fsync` | Fsync every written file | ❌ Not Implemented | | | `--protocol=NUM` | Force older protocol version | ❌ Not Implemented | | | `--iconv=CONVERT_SPEC` | Charset conversion | ❌ Not Implemented | | | `--checksum-seed=NUM` | Set checksum seed | ❌ Not Implemented | | | `-s`, `--secluded-args` | Use protocol to send args | ❌ Not Implemented | | | `--no-OPTION` | Turn off implied option | ❌ Not Implemented | | --- ## Recommendations: Top Features to Implement Next Ranked by user demand, implementation complexity, and interoperability impact: | Priority | Feature | Effort | Impact | |----------|---------|--------|--------| | 1 | `--whole-file` / `-W` | Low | High — users expect opt-out of delta | | 2 | `--ignore-times` / `-I` | Low | Medium — useful for forcing re-transfer | | 3 | `--size-only` | Low | Medium — common migration scenario | | 4 | `--existing` / `--ignore-existing` | Low | Medium — common sync patterns | | 5 | `--remove-source-files` | Low | High — common for moves/backup | | 6 | `--delete-during` | Medium | High — performance improvement | | 7 | `--delay-updates` | Medium | High — atomic updates | | 8 | `--chmod` | Low | Medium — permission flexibility | | 9 | `--executability` / `-E` | Low | Low — simple flag | | 10 | `--skip-compress` | Low | Medium — performance tuning | --- ## FastSync-Specific Features (Not in rsync) | Feature | Description | |---------|-------------| | `-m` | Multithreaded pipeline (scanner/loader/sender) | | `-s` | Chunk serialization mode | | `-f` / `--sendfile` | Zero-copy sendfile() syscall (TCP only) | | `-c [level]` | zstd compression level (1-22) | | `--chunk-size` | Configurable chunk size | | `--tls` | TLS encryption (mutual auth) | | `--fastsync-server-path` | Path to fastsync-server binary | | `--server-host` / `--server-port` | Direct TCP connection | | Incremental sync | Skip unchanged files (size+mtime) | | Delta transfer | Block-level delta for changed files |