fix(sync): S-09 — pull overwrite protection and conflict safety

This commit is contained in:
2026-09-19 09:40:00 +02:00
parent 92db21d47e
commit c7c0ed85f5
4 changed files with 332 additions and 44 deletions
+28
View File
@@ -257,6 +257,14 @@ enum Commands {
#[arg(short = 'f', long, default_value_t = false)]
force: bool,
/// Erstellt Sicherungskopien (.bak) überschriebener lokaler Dateien beim Pull (S-09)
#[arg(short = 'b', long, default_value_t = false)]
backup: bool,
/// Verhindert das Überschreiben neuerer lokaler Zieldateien beim Pull (S-09)
#[arg(short = 'u', long, default_value_t = false)]
update: bool,
/// Optionaler 24-Wort Notfallschlüssel (umgeht Passwortabfrage)
#[arg(long, num_args = 0..=1, default_missing_value = "")]
recovery_key: Option<String>,
@@ -1367,6 +1375,8 @@ fn handle_sync(
exclude: Vec<String>,
quiet: bool,
force: bool,
backup: bool,
update: bool,
recovery_key: Option<&str>,
) -> Result<()> {
if !container_path.exists() {
@@ -1424,6 +1434,8 @@ fn handle_sync(
exclude_patterns: exclude,
quiet,
force,
backup,
update,
};
if !quiet {
@@ -1499,6 +1511,12 @@ fn handle_sync(
stats.files_skipped_invalid
);
}
if stats.files_backed_up > 0 {
println!(
" • Backups: {} Sicherheitskopien (.bak)",
stats.files_backed_up
);
}
if delete {
println!(
" • Zu löschen: {} Dateien/Ordner",
@@ -1538,6 +1556,12 @@ fn handle_sync(
stats.files_skipped_invalid
);
}
if stats.files_backed_up > 0 {
println!(
" • Backups: {} Sicherheitskopien (.bak)",
stats.files_backed_up
);
}
if delete {
println!(
" • Gelöscht: {} verwaiste Dateien/Ordner",
@@ -1705,6 +1729,8 @@ async fn run() -> Result<()> {
exclude,
quiet,
force,
backup,
update,
recovery_key,
} => {
handle_sync(
@@ -1719,6 +1745,8 @@ async fn run() -> Result<()> {
exclude,
quiet,
force,
backup,
update,
recovery_key.as_deref(),
)?;
}