# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [0.2.0] - 2025-02-10 ### Added - **CLI**: `--dry-run` as primary option (with `--no-changes` as deprecated alias for backward compatibility) - **CLI**: `--special` flag to process symlinks and special files (normally skipped) - **Smart Default Excludes**: Automatically ignore `.git`, `.svn`, `node_modules`, `.cache`, `__pycache__` - **Double Extensions**: Proper handling of `.tar.gz`, `.tar.bz2`, `.tar.xz`, `.tar.zst`, `.tar.lz`, `.tar.Z` - **Parallel Processing**: Using `rayon` for parallel filename cleaning when processing ≥100 files - **Write Permission Checks**: Check write permissions before attempting rename operations - **Unit Tests**: 9 comprehensive tests for `clean_filename()` covering edge cases ### Fixed - **Critical Bug**: Hidden files (like `.gitignore`) are no longer incorrectly renamed to `unnamed.xxx` - Leading dot in hidden files is now correctly preserved - Fixed all clippy warnings ### Changed - Binary renamed from `NameToUnix` to `ntu` (shorter CLI usage) - Improved error messages for permission issues - Better handling of hidden files with spaces (`.my config` → `.my_config`) ### Performance - Parallel processing with rayon for large directory trees (threshold: 100 files) - Optimized regex patterns using `once_cell::Lazy` ## [0.1.0] - 2025-03-07 ### Added - Initial release - Basic filename sanitization - Configurable replacements via TOML - Recursive directory processing - Exclude patterns support - German umlaut conversion - Special identifier preservation (C++, C#)