feat: add rsync compression aliases
CI / lint (pull_request) Successful in 11s
CI / sanitizers (address) (pull_request) Successful in 37s
CI / sanitizers (undefined) (pull_request) Successful in 37s
CI / fuzz-build (pull_request) Successful in 14s
CI / coverage (pull_request) Successful in 32s
CI / build-and-test (pull_request) Successful in 1m16s
CI / valgrind (pull_request) Successful in 34s
CI / lint (pull_request) Successful in 11s
CI / sanitizers (address) (pull_request) Successful in 37s
CI / sanitizers (undefined) (pull_request) Successful in 37s
CI / fuzz-build (pull_request) Successful in 14s
CI / coverage (pull_request) Successful in 32s
CI / build-and-test (pull_request) Successful in 1m16s
CI / valgrind (pull_request) Successful in 34s
This commit is contained in:
@@ -339,6 +339,8 @@ features without changing the meaning of ordinary compatibility options.
|
|||||||
| `-m` | Enable the multithreaded scanner/loader/sender pipeline. |
|
| `-m` | Enable the multithreaded scanner/loader/sender pipeline. |
|
||||||
| `-c [level]`, `-z [level]` | Enable streaming zstd compression, levels 1-22. |
|
| `-c [level]`, `-z [level]` | Enable streaming zstd compression, levels 1-22. |
|
||||||
| `--compress-level <n>` | Set the zstd compression level. |
|
| `--compress-level <n>` | Set the zstd compression level. |
|
||||||
|
| `--zc <alg>` | Alias for `--compress-choice`. FastSync supports `zstd` and `none`. |
|
||||||
|
| `--zl <n>` | Alias for `--compress-level`. |
|
||||||
| `--chunk-size <bytes>` | Set the transfer chunk size. |
|
| `--chunk-size <bytes>` | Set the transfer chunk size. |
|
||||||
| `-s` | Enable FastSync chunk serialization. |
|
| `-s` | Enable FastSync chunk serialization. |
|
||||||
| `-f`, `--sendfile` | Use TCP `sendfile()` zero-copy transfer. Incompatible with compression and chunk serialization. |
|
| `-f`, `--sendfile` | Use TCP `sendfile()` zero-copy transfer. Incompatible with compression and chunk serialization. |
|
||||||
|
|||||||
+2
-2
@@ -171,8 +171,8 @@ This document maps rsync's full feature set to FastSync's current implementation
|
|||||||
| Flag | Rsync Description | FastSync Status | Notes |
|
| Flag | Rsync Description | FastSync Status | Notes |
|
||||||
|------|-------------------|-----------------|-------|
|
|------|-------------------|-----------------|-------|
|
||||||
| `-z`, `--compress` | Compress file data | 🔀 Alt Arg | Always uses zstd (rsync supports multiple algorithms) |
|
| `-z`, `--compress` | Compress file data | 🔀 Alt Arg | Always uses zstd (rsync supports multiple algorithms) |
|
||||||
| `--compress-choice=STR` | Choose compression algorithm | ❌ Not Implemented | Removed because it had no effect; FastSync always uses zstd |
|
| `--compress-choice=STR`, `--zc=STR` | Choose compression algorithm | ✅ Implemented | FastSync supports `zstd` and `none` |
|
||||||
| `--compress-level=NUM` | Set compression level | ✅ Implemented | 1-22, default 5 |
|
| `--compress-level=NUM`, `--zl=NUM` | Set compression level | ✅ Implemented | 1-22, default 5 |
|
||||||
| `--compress-threads=NUM` | Set compression threads | ❌ Not Implemented | |
|
| `--compress-threads=NUM` | Set compression threads | ❌ Not Implemented | |
|
||||||
| `--skip-compress=LIST` | Skip compress for suffixes | ❌ Not Implemented | Internal skip for hardcoded types; not user-configurable |
|
| `--skip-compress=LIST` | Skip compress for suffixes | ❌ Not Implemented | Internal skip for hardcoded types; not user-configurable |
|
||||||
|
|
||||||
|
|||||||
@@ -164,6 +164,7 @@ static const OptionEntry OPTION_TABLE[] = {
|
|||||||
{"--fastsync-server-path", NULL, OPT_STRING, offsetof(Config, fastsync_server_path)},
|
{"--fastsync-server-path", NULL, OPT_STRING, offsetof(Config, fastsync_server_path)},
|
||||||
{"--partial-dir", NULL, OPT_STRING, offsetof(Config, partial_dir)},
|
{"--partial-dir", NULL, OPT_STRING, offsetof(Config, partial_dir)},
|
||||||
{"--suffix", NULL, OPT_STRING, offsetof(Config, suffix)},
|
{"--suffix", NULL, OPT_STRING, offsetof(Config, suffix)},
|
||||||
|
{"--compress-choice", "--zc", OPT_STRING, offsetof(Config, compress_choice)},
|
||||||
|
|
||||||
{"--timeout", NULL, OPT_POS_INT, offsetof(Config, timeout)},
|
{"--timeout", NULL, OPT_POS_INT, offsetof(Config, timeout)},
|
||||||
{"--contimeout", NULL, OPT_POS_INT, offsetof(Config, contimeout)},
|
{"--contimeout", NULL, OPT_POS_INT, offsetof(Config, contimeout)},
|
||||||
@@ -354,7 +355,7 @@ int parse_args(Config* config, int argc, char* argv[], int* positional_args,
|
|||||||
} else if (opt_is(argv[i], "-T", NULL) && i + 1 < argc) {
|
} else if (opt_is(argv[i], "-T", NULL) && i + 1 < argc) {
|
||||||
if (set_positive_int_option(&config->timeout, argv[++i], "-T") != 0)
|
if (set_positive_int_option(&config->timeout, argv[++i], "-T") != 0)
|
||||||
return -1;
|
return -1;
|
||||||
} else if (opt_is(argv[i], "--compress-level", NULL) && i + 1 < argc) {
|
} else if (opt_is(argv[i], "--compress-level", "--zl") && i + 1 < argc) {
|
||||||
if (set_positive_int_option(&config->compression_level, argv[++i], "--compress-level") != 0)
|
if (set_positive_int_option(&config->compression_level, argv[++i], "--compress-level") != 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (config->compression_level < 1 || config->compression_level > 22) {
|
if (config->compression_level < 1 || config->compression_level > 22) {
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ void print_usage(void) {
|
|||||||
printf(" -m Enable multithreading\n");
|
printf(" -m Enable multithreading\n");
|
||||||
printf(" -s Enable chunk serialization\n");
|
printf(" -s Enable chunk serialization\n");
|
||||||
printf(" -f Enable sendfile (TCP only, not with -c or -s)\n");
|
printf(" -f Enable sendfile (TCP only, not with -c or -s)\n");
|
||||||
|
printf(" --compress-choice <alg> Compression algorithm (default: zstd)\n");
|
||||||
|
printf(" --zc <alg> Alias for --compress-choice\n");
|
||||||
printf(" -v, --verbose Enable debug logging\n");
|
printf(" -v, --verbose Enable debug logging\n");
|
||||||
printf(" -M, --preserve Preserve file metadata\n");
|
printf(" -M, --preserve Preserve file metadata\n");
|
||||||
printf(" --chunk-size <n> Chunk size in bytes (default: %d)\n", DEFAULT_CHUNK_SIZE);
|
printf(" --chunk-size <n> Chunk size in bytes (default: %d)\n", DEFAULT_CHUNK_SIZE);
|
||||||
@@ -69,6 +71,7 @@ void print_usage(void) {
|
|||||||
printf(" -S, --sparse Handle sparse files efficiently\n");
|
printf(" -S, --sparse Handle sparse files efficiently\n");
|
||||||
printf(" --inplace Update files in-place (no temp+rename)\n");
|
printf(" --inplace Update files in-place (no temp+rename)\n");
|
||||||
printf(" --compress-level <n> Compression level (default: 5)\n");
|
printf(" --compress-level <n> Compression level (default: 5)\n");
|
||||||
|
printf(" --zl <n> Alias for --compress-level\n");
|
||||||
printf(" --help Show this help\n");
|
printf(" --help Show this help\n");
|
||||||
printf(" -V, --version Show version\n");
|
printf(" -V, --version Show version\n");
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-1
@@ -310,7 +310,7 @@ static void test_parse_args_rejects_unimplemented_options() {
|
|||||||
"--daemon",
|
"--daemon",
|
||||||
"--config",
|
"--config",
|
||||||
"--server",
|
"--server",
|
||||||
"--compress-choice"};
|
"--checksum-choice"};
|
||||||
|
|
||||||
for (size_t i = 0; i < sizeof(options) / sizeof(options[0]); i++) {
|
for (size_t i = 0; i < sizeof(options) / sizeof(options[0]); i++) {
|
||||||
Config* cfg = config_create();
|
Config* cfg = config_create();
|
||||||
@@ -339,6 +339,22 @@ static void test_parse_args_archive() {
|
|||||||
config_delete(cfg);
|
config_delete(cfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Test rsync-compatible compression-choice and compression-level aliases. */
|
||||||
|
static void test_parse_args_compression_aliases() {
|
||||||
|
Config* cfg = config_create();
|
||||||
|
char* argv[] = {"fastsync", "--zc", "zstd", "--zl", "10", "/src", "/dst"};
|
||||||
|
int positional_args[2];
|
||||||
|
int positional_count = 0;
|
||||||
|
|
||||||
|
int ret = parse_args(cfg, 7, argv, positional_args, &positional_count);
|
||||||
|
EXPECT_EQ_INT(ret, 0);
|
||||||
|
EXPECT_EQ_STR(cfg->compress_choice, "zstd");
|
||||||
|
EXPECT_EQ_INT(cfg->compression_level, 10);
|
||||||
|
EXPECT_EQ_INT(positional_count, 2);
|
||||||
|
|
||||||
|
config_delete(cfg);
|
||||||
|
}
|
||||||
|
|
||||||
void test_client_cli() {
|
void test_client_cli() {
|
||||||
test_validate_config_required_paths();
|
test_validate_config_required_paths();
|
||||||
test_validate_config_incompatible_options();
|
test_validate_config_incompatible_options();
|
||||||
@@ -360,4 +376,5 @@ void test_client_cli() {
|
|||||||
test_parse_args_unknown_option();
|
test_parse_args_unknown_option();
|
||||||
test_parse_args_rejects_unimplemented_options();
|
test_parse_args_rejects_unimplemented_options();
|
||||||
test_parse_args_archive();
|
test_parse_args_archive();
|
||||||
|
test_parse_args_compression_aliases();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user