Incremental sync: --incremental flag to skip unchanged files

- New STATUS_CHECK protocol status (value 6)
- Client sends path + size + mtime; server replies OK (skip) or NEXT (send)
- config.h/c: use_incremental field sent/received over wire
- file.c/h: file_send_single_calls_no_path helper for incremental path
- client_cli.c: --incremental flag
- client_send.c: per-file check before send in both single and chunk paths
- server.c: STATUS_CHECK handling in receive_files()
- multiprocessing.c: STATUS_CHECK handling in receive_thread()
- test.py: incremental sync test case
This commit is contained in:
2026-07-16 15:38:48 +02:00
parent a3acf4b8b6
commit 1905369c9f
11 changed files with 406 additions and 247 deletions
+4
View File
@@ -38,6 +38,7 @@ Config *config_create(char *version, char *send_directory,
config->include_count = 0;
config->max_size = 0;
config->min_size = 0;
config->use_incremental = false;
return config;
}
@@ -89,6 +90,7 @@ bool config_send(int file_descriptor, Config *config) {
if (!send_int(file_descriptor, (int)config->chunk_size)) return false;
if (!send_int(file_descriptor, config->use_sendfile)) return false;
if (!send_int(file_descriptor, config->use_delete)) return false;
if (!send_int(file_descriptor, config->use_incremental)) return false;
Status status;
if (!receive_status(file_descriptor, &status)) return false;
if (status != STATUS_OK) {
@@ -134,6 +136,8 @@ Config *config_receive(int file_descriptor) {
config->use_sendfile = tmp;
if (!receive_int(file_descriptor, &tmp)) goto error;
config->use_delete = tmp;
if (!receive_int(file_descriptor, &tmp)) goto error;
config->use_incremental = tmp;
config->show_progress = false;
config->dry_run = false;
config->ssh_port = 22;