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.
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).
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.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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.
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.Pull request closed