From 4ac37c4d8af5b111b723c8ab3bb713b4033f0909 Mon Sep 17 00:00:00 2001 From: TapTap Date: Sat, 12 Sep 2026 20:42:47 +0200 Subject: [PATCH] refactor(dir-times): extract dir_times_should_capture predicate Deduplicate the repeated directory-time capture gate (`config->use_metadata && !config->omit_dir_times`) used by the sender-side (multiprocessing.c) and receiver-side (receiver.c) sinks into a single predicate declared next to the DirTimeList machinery in file_receive.h and defined in file_receive.c. Behavior preserved: identical short-circuit condition and semantics, no signature or protocol changes. --- src/server/receiver.c | 2 +- src/shared/file_receive.c | 4 ++++ src/shared/file_receive.h | 6 ++++++ src/shared/multiprocessing.c | 3 ++- 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/server/receiver.c b/src/server/receiver.c index 936fc1f..4b84831 100644 --- a/src/server/receiver.c +++ b/src/server/receiver.c @@ -353,7 +353,7 @@ static bool receiver_save_file(File* file, void* context_pointer) { metadata now and apply it at the end. -O/--omit-dir-times is honored by dir_time_list_apply's caller (see receiver_send_success_frame). */ if (result != FILE_SAVE_ERROR && file->is_dir && file->metadata && - context->config->use_metadata && !context->config->omit_dir_times && + dir_times_should_capture(context->config) && !dir_time_list_add(&context->dir_times, file->path, file->metadata)) { file_destroy(file); return false; diff --git a/src/shared/file_receive.c b/src/shared/file_receive.c index d29bf77..ffb72df 100644 --- a/src/shared/file_receive.c +++ b/src/shared/file_receive.c @@ -2236,6 +2236,10 @@ File* file_receive(const Config* config, int file_descriptor) { /* ---- P7 Wave D: deferred directory times ---- */ +bool dir_times_should_capture(const Config* config) { + return config->use_metadata && !config->omit_dir_times; +} + void dir_time_list_init(DirTimeList* list) { if (!list) return; diff --git a/src/shared/file_receive.h b/src/shared/file_receive.h index 555a342..37dc15a 100644 --- a/src/shared/file_receive.h +++ b/src/shared/file_receive.h @@ -30,6 +30,12 @@ typedef struct { size_t capacity; } DirTimeList; +/* Capture gate shared by the sender-side and receiver-side sinks: directory + * metadata is accumulated only when --times/--metadata is in effect and + * -O/--omit-dir-times does not suppress it. Kept here, next to the accumulator + * it guards, so both call sites express the same condition. */ +bool dir_times_should_capture(const Config* config); + void dir_time_list_init(DirTimeList* list); void dir_time_list_free(DirTimeList* list); /* Deep-copy one directory's path + metadata into the list. Returns false on diff --git a/src/shared/multiprocessing.c b/src/shared/multiprocessing.c index 57af92a..b93c9f0 100644 --- a/src/shared/multiprocessing.c +++ b/src/shared/multiprocessing.c @@ -6,6 +6,7 @@ #include "config.h" #include "data.h" #include "file.h" +#include "file_receive.h" #include "log.h" #include "protocol.h" #include "queue.h" @@ -331,7 +332,7 @@ int write_thread(void* pipeline_context) { write would clobber them); accumulate the metadata here and let the caller apply it once every writer has drained. */ if (result != FILE_SAVE_ERROR && file->is_dir && file->metadata && - context->config->use_metadata && !context->config->omit_dir_times && + dir_times_should_capture(context->config) && !dir_time_list_add(&context->dir_times, file->path, file->metadata)) { file_destroy(file); pipeline_context_receiver_note_bytes_released(context, file_bytes);