docs: recount RSYNC_COMPAT summary after Phase-4 wave C (symlink-trust + devices + acl/xattr)
CI / lint (push) Failing after 1m8s
CI / build-and-test (push) Skipped
CI / sanitizers (address) (push) Skipped
CI / sanitizers (undefined) (push) Skipped
CI / fuzz-build (push) Skipped
CI / coverage (push) Skipped
CI / valgrind (push) Skipped

Wave C moved 12 rows: -l/--links now real (was Partial). New Implemented (7):
--munge-links, -k/--copy-dirlinks, -K/--keep-dirlinks, -D, -A/--acls, -X/--xattrs
(links was Partial->Implemented). New Partial (5): --devices, --specials,
--copy-devices, --write-devices, --fake-super. Summary: Implemented 94->101,
Partial 6->10, Not Implemented 41->30 (Total 147).

Final Phase-4 summary: 101/3/10/3/30 = 147; PROTOCOL_VERSION 2.13.0.
This commit is contained in:
2026-09-08 22:42:02 +02:00
parent 94b6662018
commit 743b00ffdd
4 changed files with 6 additions and 6 deletions
+3 -3
View File
@@ -6,11 +6,11 @@ This document maps rsync's full feature set to FastSync's current implementation
| Status | Count | Description | | Status | Count | Description |
|--------|-------|-------------| |--------|-------|-------------|
| ✅ Implemented | 94 | Feature works end-to-end | | ✅ Implemented | 101 | Feature works end-to-end |
| 🔀 Alt Arg | 3 | Functionality exists but under different flag/semantics | | 🔀 Alt Arg | 3 | Functionality exists but under different flag/semantics |
| ⚠️ Partial | 6 | Flag parsed/stored but behavior incomplete | | ⚠️ Partial | 10 | Flag parsed/stored but behavior incomplete |
| 🔄 Compatibility No-op | 3 | Flag is accepted for CLI compatibility but has no effect | | 🔄 Compatibility No-op | 3 | Flag is accepted for CLI compatibility but has no effect |
| ❌ Not Implemented | 41 | Flag not recognized or no behavior | | ❌ Not Implemented | 30 | Flag not recognized or no behavior |
| **Total** | **147** | | | **Total** | **147** | |
--- ---
+1 -1
View File
@@ -1277,7 +1277,7 @@ static int send_chunk_with_removal(Client* client, Chunk* chunk, Config* config,
change_emit_file_sent(config, f); change_emit_file_sent(config, f);
continue; continue;
} }
/* Symlink entry (-l / -k keep-as-symlink): only the target rides the wire. */ /* Symlink entry (-l / -k keep-as-symlink): only the target rides the wire. */
if (f->is_symlink) { if (f->is_symlink) {
if (!send_symlink_entry(client, f, config)) if (!send_symlink_entry(client, f, config))
return -1; return -1;
+1 -1
View File
@@ -186,7 +186,7 @@ int receiver_process_pending(Config* config, int file_descriptor, const Receiver
File* file = file_receive_hardlink(file_descriptor); File* file = file_receive_hardlink(file_descriptor);
if (!file || !sink->store_file(file, sink->context)) if (!file || !sink->store_file(file, sink->context))
goto receive_error; goto receive_error;
} else if (status == STATUS_SYMLINK) { } else if (status == STATUS_SYMLINK) {
File* sym = file_receive_symlink(file_descriptor, config); File* sym = file_receive_symlink(file_descriptor, config);
if (!sym || !sink->store_file(sym, sink->context)) if (!sym || !sink->store_file(sym, sink->context))
goto receive_error; goto receive_error;
+1 -1
View File
@@ -135,7 +135,7 @@ Data* chunk_serialize(Chunk* chunk, bool use_metadata) {
memcpy(data_pointer, wire_path, path_len); memcpy(data_pointer, wire_path, path_len);
data_pointer += path_len; data_pointer += path_len;
int entry_type = file->is_dir ? 1 : (file->is_symlink ? 2 : (file->is_special ? 3 : 0)); int entry_type = file->is_dir ? 1 : (file->is_symlink ? 2 : (file->is_special ? 3 : 0));
memcpy(data_pointer, &entry_type, sizeof(int)); memcpy(data_pointer, &entry_type, sizeof(int));
data_pointer += sizeof(int); data_pointer += sizeof(int);