diff --git a/src/client/client_cli.c b/src/client/client_cli.c index 113bd76..bbca854 100644 --- a/src/client/client_cli.c +++ b/src/client/client_cli.c @@ -201,6 +201,7 @@ static const NegatableOption NEGATABLE_OPTIONS[] = { /* These options are also implied by --archive or handled outside the table. */ {"compress", "c", offsetof(Config, use_compression)}, + {"compress", "z", offsetof(Config, use_compression)}, {"multithreading", "m", offsetof(Config, use_multithreading)}, {"preserve", "M", offsetof(Config, use_metadata)}, {"sendfile", "f", offsetof(Config, use_sendfile)}, @@ -238,6 +239,8 @@ static int apply_negation(Config* config, const char* arg) { return -1; } *(bool*)((char*)config + entry->offset) = false; + if (entry->offset == offsetof(Config, use_metadata)) + config->metadata_explicitly_disabled = true; return 0; } @@ -437,6 +440,12 @@ int parse_args(Config* config, int argc, char* argv[], int* positional_args, } } } + /* Incremental and delta transfers need metadata unless the user disabled it. */ + if ((config->use_incremental || config->use_delta) && !config->use_metadata && + !config->metadata_explicitly_disabled) { + log_message(LOG_LEVEL_INFO, "Enabling metadata preservation for incremental/delta transfer"); + config->use_metadata = true; + } return 0; } @@ -543,16 +552,6 @@ int main(int argc, char* argv[]) { goto cleanup; } - /* Enable implicit flags */ - if (config->use_incremental && !config->use_metadata) { - log_message(LOG_LEVEL_INFO, "Enabling metadata preservation for --incremental"); - config->use_metadata = true; - } - if (config->use_delta && !config->use_metadata) { - log_message(LOG_LEVEL_INFO, "Enabling metadata preservation for --delta"); - config->use_metadata = true; - } - /* Initialize TLS if needed */ if (config->use_tls) tls_global_init(); diff --git a/src/shared/config.c b/src/shared/config.c index efc2708..c50482a 100644 --- a/src/shared/config.c +++ b/src/shared/config.c @@ -17,6 +17,7 @@ static void config_set_defaults(Config* config) { config->use_chunk_serialization = false; config->use_compression = false; config->use_metadata = false; + config->metadata_explicitly_disabled = false; config->show_progress = false; config->dry_run = false; config->use_delete = false; diff --git a/src/shared/config.h b/src/shared/config.h index 4a218b0..4f1baf9 100644 --- a/src/shared/config.h +++ b/src/shared/config.h @@ -18,6 +18,7 @@ typedef struct Config { bool use_compression; bool use_sendfile; bool use_metadata; + bool metadata_explicitly_disabled; bool show_progress; bool dry_run; bool use_delete; diff --git a/tests/test_client_cli.c b/tests/test_client_cli.c index efaf879..7ab0039 100644 --- a/tests/test_client_cli.c +++ b/tests/test_client_cli.c @@ -358,7 +358,7 @@ static void test_parse_args_negations() { static void test_parse_args_negation_order() { Config* cfg = config_create(); - char* argv[] = {"fastsync", "--no-compress", "-c", "/src", "/dst"}; + char* argv[] = {"fastsync", "--no-z", "-c", "/src", "/dst"}; int positional_args[2]; int positional_count = 0; @@ -367,6 +367,28 @@ static void test_parse_args_negation_order() { config_delete(cfg); } +static void test_parse_args_no_preserve_blocks_implicit_metadata() { + static const char* const options[][3] = { + {"--incremental", "--no-preserve", "/src"}, + {"--no-preserve", "--incremental", "/src"}, + {"--delta", "--no-preserve", "/src"}, + {"--no-preserve", "--delta", "/src"}, + }; + + for (size_t i = 0; i < sizeof(options) / sizeof(options[0]); i++) { + Config* cfg = config_create(); + char* argv[] = {"fastsync", (char*)options[i][0], (char*)options[i][1], (char*)options[i][2], + "/dst"}; + int positional_args[2]; + int positional_count = 0; + + EXPECT_EQ_INT(parse_args(cfg, 5, argv, positional_args, &positional_count), 0); + EXPECT_FALSE(cfg->use_metadata); + EXPECT_TRUE(cfg->metadata_explicitly_disabled); + config_delete(cfg); + } +} + static void test_parse_args_rejects_unsafe_negation() { static const char* const options[] = {"--no-archive", "--no-timeout", "--no-unknown"}; for (size_t i = 0; i < sizeof(options) / sizeof(options[0]); i++) { @@ -403,5 +425,6 @@ void test_client_cli() { test_parse_args_archive(); test_parse_args_negations(); test_parse_args_negation_order(); + test_parse_args_no_preserve_blocks_implicit_metadata(); test_parse_args_rejects_unsafe_negation(); }