Phase 2: implement -R/--no-implied-dirs/--dirs/--mkpath path semantics #266

Closed
TapTap wants to merge 0 commits from feat/p2-relative-dirs-mkpath into dev
Owner

Final Phase-2 row. -R/--relative changes dest layout for --files-from to preserve the listed relative path below the destination (no full source mirror); --no-implied-dirs requires explicitly listed ancestor dirs; --dirs/-d (+ --old-dirs/--old-d aliases) transmits explicit directory entries (STATUS_MKDIR + chunk type marker) to build empty dir trees without descent; --mkpath makes the server create a missing destination root at connect. Wire: +mkpath bool and dir-entry frames; PROTOCOL_VERSION 2.6.0->2.7.0. Unit 27/27; integration 149 passed / 10 skipped / 1 xpassed.

Final Phase-2 row. -R/--relative changes dest layout for --files-from to preserve the listed relative path below the destination (no full source mirror); --no-implied-dirs requires explicitly listed ancestor dirs; --dirs/-d (+ --old-dirs/--old-d aliases) transmits explicit directory entries (STATUS_MKDIR + chunk type marker) to build empty dir trees without descent; --mkpath makes the server create a missing destination root at connect. Wire: +mkpath bool and dir-entry frames; PROTOCOL_VERSION 2.6.0->2.7.0. Unit 27/27; integration 149 passed / 10 skipped / 1 xpassed.
TapTap added 1 commit 2026-09-06 15:29:12 +02:00
feat: implement -R/--relative, --no-implied-dirs, --dirs/-d, --mkpath
CI / lint (pull_request) Successful in 26s
CI / sanitizers (address) (pull_request) Failing after 41s
CI / sanitizers (undefined) (pull_request) Successful in 40s
CI / fuzz-build (pull_request) Successful in 18s
CI / coverage (pull_request) Successful in 35s
CI / valgrind (pull_request) Failing after 37s
CI / build-and-test (pull_request) Failing after 2m35s
c2cf231158
RSYNC_COMPAT Phase-2 row M: path-list construction and destination
directory creation while preserving traversal safety.

- -R/--relative with --files-from: transmit each listed entry under its
  bare relative destination path (no source-root mirror). Files keep an
  absolute local read path plus a separate wire/dest path (File.send_path);
  manifest, incremental quick-check and change output follow the wire path,
  so --delete and --remove-source-files stay consistent. -R without
  --files-from is unchanged (full mirror).
- --no-implied-dirs: client-only, only meaningful with -R + --files-from.
  A listed file whose parent dir is not itself (or via an ancestor)
  explicitly listed cannot be placed; the run fails up front with a clear
  error. No effect otherwise.
- --dirs/-d + --old-dirs/--old-d aliases: -d <dir> transmits the source
  root as an explicit empty directory entry (STATUS_MKDIR frame); with
  --files-from listed dirs are created empty and listed files transferred,
  never descending. Works single-threaded, -m (sequential scanner in the
  -m scan thread) and chunk-serialization (per-file type marker).
  Directory entries appear in the delete manifest.
- --mkpath: new wire bool; server creates the destination root (and missing
  leading components under its authorized root) at connection start. A
  missing destination root is now rejected by default.
- Protocol bumped to 2.7.0 (mkpath wire field + STATUS_MKDIR + chunk type
  marker). All receive paths funnel through file_save_to_disk_full which
  creates directories via the secure confined mkdir engine; dir entries are
  excluded from --remove-source-files outcome acknowledgements on both ends.
- Unit coverage: CLI parse (relative/dirs aliases/mkpath/no-implied-dirs),
  config round-trip (relative + mkpath), scanner --dirs non-recursion and
  -R send_path (sequential + parallel), receiver dir-entry save.
- Integration coverage: TestRelativeFilesFrom, TestNoImpliedDirs, TestDirs,
  TestMkpath (single and -m).
- RSYNC_COMPAT: 4 rows move to Implemented (Summary 67/3/5/1/71 = 147).
Author
Owner

Merged into dev (4146814; dev HEAD 4cf3402, CI run #473 all green). Independent c-review found one blocker + warnings, all fixed: --mkpath root-existence check now normalizes trailing slashes and handles a destination equal to the authorized root (no spurious nested dir); added chunk dir round-trip + -s/-m -s tests; list-only/dry-run now show the wire path under -R; dirs flush by element count; STATUS_MKDIR string; dead code removed; --dirs+--delete and dir/file-collision tests. CI also caught a scanner leak (parallel root-scan rel string) and a racy byte-budget unit assertion, both fixed on dev. Closing as merged.

**Merged into dev** (4146814; dev HEAD 4cf3402, CI run #473 all green). Independent c-review found one blocker + warnings, all fixed: --mkpath root-existence check now normalizes trailing slashes and handles a destination equal to the authorized root (no spurious nested dir); added chunk dir round-trip + -s/-m -s tests; list-only/dry-run now show the wire path under -R; dirs flush by element count; STATUS_MKDIR string; dead code removed; --dirs+--delete and dir/file-collision tests. CI also caught a scanner leak (parallel root-scan rel string) and a racy byte-budget unit assertion, both fixed on dev. Closing as merged.
TapTap closed this pull request 2026-09-06 16:32:21 +02:00

Pull request closed

This pull request cannot be reopened because the branch was deleted.
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: TapTap/FastSync#266