From bd82fd7b30ef9eead357b0e2e31f726838a80bea Mon Sep 17 00:00:00 2001 From: dschlueter Date: Fri, 13 Feb 2026 04:32:59 +0100 Subject: [PATCH] fix: Cargo.lock tracken, verbose durchreichen, Config-Fehler melden, Platzhalter-Kollision beheben MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Cargo.lock aus .gitignore entfernt (Rust-Konvention: für Binaries committen) - verbose-Parameter in clean_filename() wird jetzt korrekt von args.verbose durchgereicht statt hardcoded false - Config::load() gibt bei Parse-Fehlern eine Warnung aus statt den Fehler still zu schlucken - Platzhalter für C++/C# von CPLUSPLUS/CSHARP zu NTUxCPLUSPLUSx/NTUxCSHARPx geändert um Kollisionen mit echten Dateinamen zu vermeiden Co-Authored-By: Claude Opus 4.6 --- .gitignore | 1 - Cargo.lock | 11 ----------- src/config.rs | 27 ++++++++++++++++++--------- src/main.rs | 2 +- src/sanitizer.rs | 24 ++++++++++++++++-------- 5 files changed, 35 insertions(+), 30 deletions(-) diff --git a/.gitignore b/.gitignore index d724e8a..e004f20 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ # Rust / Cargo /target **/*.rs.bk -Cargo.lock *.pdb # IDEs diff --git a/Cargo.lock b/Cargo.lock index 639f95e..5af4c1c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -16,7 +16,6 @@ dependencies = [ "env_logger", "glob", "indicatif", - "itertools", "log", "once_cell", "predicates", @@ -24,7 +23,6 @@ dependencies = [ "regex", "serde", "tempfile", - "thiserror", "toml", "unicode-segmentation", "walkdir", @@ -478,15 +476,6 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - [[package]] name = "js-sys" version = "0.3.77" diff --git a/src/config.rs b/src/config.rs index 2e5c3f7..f97443c 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,5 +1,5 @@ use anyhow::{Context, Result}; -use log::{debug, info}; +use log::{debug, info, warn}; use serde::Deserialize; use std::collections::HashMap; use std::fs; @@ -41,18 +41,27 @@ impl Config { } } - /// Öffentliche Methode zum Laden einer Konfiguration aus einem Pfad + /// Öffentliche Methode zum Laden einer Konfiguration aus einem Pfad. + /// Gibt Standardwerte zurück wenn die Datei nicht existiert, + /// propagiert aber Parse-Fehler als Warnung. pub fn load(path: &str, verbose: bool) -> Result { let cfg_path = Path::new(path); + if !cfg_path.exists() { + if verbose { + info!( + "Keine Konfigurationsdatei '{}' gefunden. Verwende Standardwerte.", + path + ); + } + return Ok(Self::default()); + } match Self::load_internal(cfg_path, verbose) { Ok(config) => Ok(config), - Err(_) => { - if verbose { - info!( - "Keine Konfigurationsdatei '{}' gefunden. Verwende Standardwerte.", - path - ); - } + Err(e) => { + warn!( + "Fehler beim Laden der Konfigurationsdatei '{}': {}. Verwende Standardwerte.", + path, e + ); Ok(Self::default()) } } diff --git a/src/main.rs b/src/main.rs index 3fc9315..cbd5377 100644 --- a/src/main.rs +++ b/src/main.rs @@ -197,7 +197,7 @@ fn main() -> Result<()> { // Dateiname ermitteln und bereinigen let filename = old_path.file_name()?; - let new_name = clean_filename(filename, &config, &sequence, false)?; + let new_name = clean_filename(filename, &config, &sequence, args.verbose)?; let new_path = old_path.with_file_name(&new_name); Some(RenameOperation { diff --git a/src/sanitizer.rs b/src/sanitizer.rs index b552c23..67e44dd 100644 --- a/src/sanitizer.rs +++ b/src/sanitizer.rs @@ -225,22 +225,30 @@ pub fn clean_filename( } } +// Eindeutige Platzhalter, die in echten Dateinamen praktisch nicht vorkommen. +// Bestehen nur aus \w-Zeichen (für RE_INVALID), ohne Mehrfach-Unterstriche (für RE_MULTI), +// ohne führende Unterstriche (für trim_leading_underscores). +const PH_CPLUSPLUS: &str = "NTUxCPLUSPLUSx"; +const PH_CPLUSPLUS_LC: &str = "NTUxcplusplusx"; +const PH_CSHARP: &str = "NTUxCSHARPx"; +const PH_CSHARP_LC: &str = "NTUxcsharpx"; + /// Schützt spezielle Identifikatoren vor der Umwandlung fn preserve_special_identifiers(input: &str) -> String { input - .replace("C++", "CPLUSPLUS") - .replace("c++", "cplusplus") - .replace("C#", "CSHARP") - .replace("c#", "csharp") + .replace("C++", PH_CPLUSPLUS) + .replace("c++", PH_CPLUSPLUS_LC) + .replace("C#", PH_CSHARP) + .replace("c#", PH_CSHARP_LC) } /// Stellt spezielle Identifikatoren wieder her fn restore_special_identifiers(input: &str) -> String { input - .replace("CPLUSPLUS", "C++") - .replace("cplusplus", "c++") - .replace("CSHARP", "C#") - .replace("csharp", "c#") + .replace(PH_CPLUSPLUS, "C++") + .replace(PH_CPLUSPLUS_LC, "c++") + .replace(PH_CSHARP, "C#") + .replace(PH_CSHARP_LC, "c#") } /// Fasst alle fest eingebauten Ersetzungen zusammen.