From 48a36b0038279ee717209392d7c755876fc02b53 Mon Sep 17 00:00:00 2001 From: TapTap Date: Thu, 3 Sep 2026 18:34:06 +0200 Subject: [PATCH 1/2] feat: add rsync delete-during alias --- src/client/client_cli.c | 6 ++++++ src/client/usage.c | 1 + tests/test_client_cli.c | 17 +++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/src/client/client_cli.c b/src/client/client_cli.c index 191cc07..81e30d5 100644 --- a/src/client/client_cli.c +++ b/src/client/client_cli.c @@ -361,6 +361,12 @@ int parse_args(Config* config, int argc, char* argv[], int* positional_args, log_message(LOG_LEVEL_ERROR, "--compress-level must be between 1 and 22"); return -1; } + } else if (opt_is(argv[i], "--del", NULL)) { + fprintf(stderr, "--del is an alias for --delete-during, which is not implemented\n"); + return -1; + } else if (opt_is(argv[i], "--delete-during", NULL)) { + fprintf(stderr, "--delete-during is not implemented\n"); + return -1; } else if (argv[i][0] == '-') { fprintf(stderr, "Unknown option: %s\n", argv[i]); print_usage(); diff --git a/src/client/usage.c b/src/client/usage.c index 2f800af..b5e905a 100644 --- a/src/client/usage.c +++ b/src/client/usage.c @@ -21,6 +21,7 @@ void print_usage(void) { printf(" -p SSH port (default: 22)\n"); printf(" --progress Show transfer progress\n"); printf(" --delete Delete files on receiver not in source\n"); + printf(" --del Alias for --delete-during (not implemented)\n"); printf(" --exclude Exclude files matching pattern\n"); printf(" --include Only include files matching pattern\n"); printf(" --exclude-from Read exclude patterns from file\n"); diff --git a/tests/test_client_cli.c b/tests/test_client_cli.c index 656fd40..ef9400a 100644 --- a/tests/test_client_cli.c +++ b/tests/test_client_cli.c @@ -260,6 +260,22 @@ static void test_parse_args_unknown_option() { config_delete(cfg); } +/* --del is recognized as the rsync alias, but its timing mode is not implemented. */ +static void test_parse_args_delete_during_alias_unimplemented() { + static const char* const options[] = {"--del", "--delete-during"}; + + for (size_t i = 0; i < sizeof(options) / sizeof(options[0]); i++) { + Config* cfg = config_create(); + char* argv[] = {"fastsync", (char*)options[i], "/src", "/dst"}; + int positional_args[2]; + int positional_count = 0; + + EXPECT_EQ_INT(parse_args(cfg, 4, argv, positional_args, &positional_count), -1); + EXPECT_FALSE(cfg->use_delete); + config_delete(cfg); + } +} + /* Parsed-but-unimplemented options must fail instead of being silently accepted. */ static void test_parse_args_rejects_unimplemented_options() { static const char* const options[] = {"-q", @@ -358,6 +374,7 @@ void test_client_cli() { test_parse_args_invalid_compression_level(); test_parse_args_valid_compression_level(); test_parse_args_unknown_option(); + test_parse_args_delete_during_alias_unimplemented(); test_parse_args_rejects_unimplemented_options(); test_parse_args_archive(); } From 97a628c3fddba7e96717cf235c6443b3ba06b1f4 Mon Sep 17 00:00:00 2001 From: TapTap Date: Thu, 3 Sep 2026 22:34:52 +0200 Subject: [PATCH 2/2] docs: document delete-during aliases --- RSYNC_COMPAT.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/RSYNC_COMPAT.md b/RSYNC_COMPAT.md index 4b236ec..717e41b 100644 --- a/RSYNC_COMPAT.md +++ b/RSYNC_COMPAT.md @@ -9,8 +9,8 @@ This document maps rsync's full feature set to FastSync's current implementation | ✅ Implemented | 34 | Feature works end-to-end | | 🔀 Alt Arg | 3 | Functionality exists but under different flag/semantics | | ⚠️ Partial | 1 | Flag parsed/stored but behavior incomplete | -| ❌ Not Implemented | 98 | Flag not recognized or no behavior | -| **Total** | **136** | | +| ❌ Not Implemented | 99 | Flag not recognized or no behavior | +| **Total** | **137** | | --- @@ -101,7 +101,7 @@ This document maps rsync's full feature set to FastSync's current implementation |------|-------------------|-----------------|-------| | `--delete` | Delete extraneous files from dest | ✅ Implemented | `use_delete` config field | | `--delete-before` | Delete before transfer | ❌ Not Implemented | Removed because it had no effect | -| `--delete-during` | Delete during transfer | ❌ Not Implemented | | +| `--del`, `--delete-during` | Delete during transfer | ❌ Not Implemented | Both flags are recognized but rejected; delete timing is not implemented | | `--delete-delay` | Find deletions during, delete after | ❌ Not Implemented | | | `--delete-after` | Delete after transfer | ❌ Not Implemented | Removed because it had no effect | | `--delete-excluded` | Also delete excluded files | ❌ Not Implemented | Removed because it had no effect |