From f25d4deaebf4a36ac20d778e94aa32557f9b11b2 Mon Sep 17 00:00:00 2001 From: "Emmanuel C. Jemeni" Date: Fri, 15 Nov 2024 23:06:45 +0100 Subject: [PATCH 01/11] feat: add dry-run mode and improve symlink handling - Add --dry-run flag to preview changes without renaming files - Add symlink detection and skip logic to prevent recursion - Add tracking of visited paths to avoid infinite symlink loops - Bump version to 1.1.0 due to new features --- CrossRename/main.py | 45 +++++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/CrossRename/main.py b/CrossRename/main.py index 5d943a0..280a4e9 100644 --- a/CrossRename/main.py +++ b/CrossRename/main.py @@ -5,7 +5,7 @@ import argparse import logging -__version__ = "1.0.0" +__version__ = "1.1.0" logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s » %(message)s') @@ -61,26 +61,44 @@ def sanitize_filename(filename: str) -> str: return sanitized -def rename_file(file_path: str) -> None: +def rename_file(file_path: str, dry_run: bool = False) -> None: directory, filename = os.path.split(file_path) new_filename = sanitize_filename(filename) if new_filename != filename: new_file_path = os.path.join(directory, new_filename) - try: - os.rename(file_path, new_file_path) - logger.info(f"Renamed: {filename} -> {new_filename}") - except Exception as e: - logger.error(f"Error renaming {filename}: {str(e)}") + if dry_run: + logger.info(f"[Dry-run] Would rename: {filename} -> {new_filename}") + else: + try: + os.rename(file_path, new_file_path) + logger.info(f"Renamed: {filename} -> {new_filename}") + except Exception as e: + logger.error(f"Error renaming {filename}: {str(e)}") else: logger.info(f"No change needed: {filename}") def file_search(directory: str) -> list[str]: file_list = [] - for root, _, files in os.walk(directory): + visited_paths = set() + + for root, _, files in os.walk(directory, followlinks=False): + real_root = os.path.realpath(root) + + if real_root in visited_paths: + logger.warning(f"Skipping recursive symlink in {root}") + continue + + visited_paths.add(real_root) + for file in files: - file_list.append(os.path.join(root, file)) + file_path = os.path.join(root, file) + if os.path.islink(file_path): + logger.info(f"Skipping symlink: {file_path}") + continue + file_list.append(file_path) + return file_list @@ -102,26 +120,29 @@ def main() -> None: help="Rename all files in the directory path given and its subdirectories.", action="store_true" ) + parser.add_argument("-d", "--dry-run", help="Perform a dry run, logging changes without renaming.", + action="store_true") args = parser.parse_args() path = args.path recursive = args.recursive + dry_run = args.dry_run if path is None: sys.exit("Please provide a path to a file or directory using the --path argument.") if os.path.isfile(path): - rename_file(path) + rename_file(path, dry_run) elif os.path.isdir(path): if recursive: file_list = file_search(path) for file_path in file_list: - rename_file(file_path) + rename_file(file_path, dry_run) else: for item in os.listdir(path): item_path = os.path.join(path, item) if os.path.isfile(item_path): - rename_file(item_path) + rename_file(item_path, dry_run) else: sys.exit(f"Error: {path} is not a valid file or directory") except Exception as e: From 3bbb19765f1fbb69d17f81804417bd52863a9abb Mon Sep 17 00:00:00 2001 From: "Emmanuel C. Jemeni" Date: Fri, 15 Nov 2024 23:07:01 +0100 Subject: [PATCH 02/11] docs(changelog): add version 1.1.0 release notes - Add entry for version 1.1.0 with new features - Add comparison link between v1.0.0 and v1.1.0 --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19a367a..16985d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,8 +14,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [//]: # (- **Security** in case of vulnerabilities.) +## [1.1.0] - 2024-11-15 +### Added +- Dry-run mode and recursive symlink handling. + ## [1.0.0] - 2024-10-07 - Released CrossRename +[1.1.0]: https://github.com/Jemeni11/CrossRename/compare/v1.0.0...v1.1.0 [1.0.0]: https://github.com/Jemeni11/CrossRename/releases/tag/v1.0.0 From 2fff5b7fc7101b9eda7d2c1156a795f165b6274d Mon Sep 17 00:00:00 2001 From: "Emmanuel C. Jemeni" Date: Fri, 15 Nov 2024 23:07:34 +0100 Subject: [PATCH 03/11] chore(ver): bump version to 1.1.0 - Update version in pyproject.toml from 1.0.0 to 1.1.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index f59cdee..237b61e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "CrossRename" -version = "1.0.0" +version = "1.1.0" authors = [ { name="Emmanuel C. Jemeni", email="jemenichinonso11@gmail.com" } ] From 5f9e47ab41c26c182022412178d2d84f3e885c0c Mon Sep 17 00:00:00 2001 From: "Emmanuel C. Jemeni" Date: Fri, 15 Nov 2024 23:28:17 +0100 Subject: [PATCH 04/11] chore: update logo image --- CHANGELOG.md | 4 ++++ logo.png | Bin 43172 -> 33242 bytes 2 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 16985d1..373e8d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Dry-run mode and recursive symlink handling. +### Changed +- Changed logo + + ## [1.0.0] - 2024-10-07 - Released CrossRename diff --git a/logo.png b/logo.png index d40c2cd0c5596098fc3c23b0cff557ea9b1dbcd2..55904b2543af81b781b4413b755f9f2d93846380 100644 GIT binary patch literal 33242 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®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

t+n-|k-D%$+)4wta%m8L_=yBsWIYHrv~Y0lH^ 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 From 2c3b948e70a91603800c4ad90856d503dc1ce001 Mon Sep 17 00:00:00 2001 From: "Emmanuel C. Jemeni" Date: Fri, 15 Nov 2024 14:30:41 -0800 Subject: [PATCH 05/11] Update main.py Fix issue with dry-run vs debug --- CrossRename/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CrossRename/main.py b/CrossRename/main.py index 280a4e9..0610c32 100644 --- a/CrossRename/main.py +++ b/CrossRename/main.py @@ -120,7 +120,7 @@ def main() -> None: help="Rename all files in the directory path given and its subdirectories.", action="store_true" ) - parser.add_argument("-d", "--dry-run", help="Perform a dry run, logging changes without renaming.", + parser.add_argument("--dry-run", help="Perform a dry run, logging changes without renaming.", action="store_true") args = parser.parse_args() From fa0c782ea576938685233f3af853abfde40182c4 Mon Sep 17 00:00:00 2001 From: "Emmanuel C. Jemeni" Date: Sat, 16 Nov 2024 01:00:31 +0100 Subject: [PATCH 06/11] feat(utils): Add a utils file --- CrossRename/utils.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 CrossRename/utils.py diff --git a/CrossRename/utils.py b/CrossRename/utils.py new file mode 100644 index 0000000..06ad4f5 --- /dev/null +++ b/CrossRename/utils.py @@ -0,0 +1,25 @@ +from urllib import request, error +import json + + +def parse_version(version: str): + """Converts a version string (e.g., '1.2.3') into a tuple of integers (1, 2, 3).""" + return tuple([int(part) for part in version.split(".")]) + + +def check_for_update(current_version: str): + """Checks if a new version of CrossRename is available on PyPI.""" + try: + url = "https://pypi.org/pypi/CrossRename/json" + with request.urlopen(url, timeout=5) as response: + data = json.load(response) + latest_version = data["info"]["version"] + + if parse_version(latest_version) > parse_version(current_version): + print(f"Update available: v{latest_version}. You're on v{current_version}.") + print(f"Run `pip install --upgrade CrossRename` to update.") + else: + print(f"You're on the latest version: v{current_version}.") + + except error.URLError as e: + print(f"Unable to check for updates: {e}") From ec0cc3f1e9ca292a70ba59d17f307b1ec90591db Mon Sep 17 00:00:00 2001 From: "Emmanuel C. Jemeni" Date: Sat, 16 Nov 2024 01:02:03 +0100 Subject: [PATCH 07/11] feat(cli): add --update flag to check for new version --- CrossRename/main.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/CrossRename/main.py b/CrossRename/main.py index 0610c32..0617739 100644 --- a/CrossRename/main.py +++ b/CrossRename/main.py @@ -4,9 +4,11 @@ from pathlib import Path import argparse import logging +from .utils import check_for_update __version__ = "1.1.0" + logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s » %(message)s') @@ -106,7 +108,7 @@ def main() -> None: try: parser = argparse.ArgumentParser( description="CrossRename: Harmonize file names for Linux and Windows.") - parser.add_argument("-p", "--path", help="The path to the file or directory to rename.", required=True) + parser.add_argument("-p", "--path", help="The path to the file or directory to rename.") parser.add_argument( "-v", "--version", @@ -114,22 +116,31 @@ def main() -> None: action='version', version=f"CrossRename Version {__version__}" ) + parser.add_argument( + "-u", "--update", + help="Check if a new version is available.", + action="store_true" + ) parser.add_argument( "-r", "--recursive", help="Rename all files in the directory path given and its subdirectories.", action="store_true" ) - parser.add_argument("--dry-run", help="Perform a dry run, logging changes without renaming.", + parser.add_argument("-d", "--dry-run", help="Perform a dry run, logging changes without renaming.", action="store_true") - args = parser.parse_args() + args = parser.parse_args() path = args.path recursive = args.recursive dry_run = args.dry_run + if args.update: + check_for_update(__version__) + sys.exit() + if path is None: - sys.exit("Please provide a path to a file or directory using the --path argument.") + sys.exit("Error: Please provide a path to a file or directory using the --path argument.") if os.path.isfile(path): rename_file(path, dry_run) From 554f215d7d6fec3c0153c351bfbf5d3c400138ba Mon Sep 17 00:00:00 2001 From: "Emmanuel C. Jemeni" Date: Sat, 16 Nov 2024 01:05:16 +0100 Subject: [PATCH 08/11] docs: update README with new options for --update and --dry-run --- README.md | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1c62418..5128fa8 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,9 @@ when transferring files between different environments. - Handles both individual files and entire directories - Supports recursive renaming of files in subdirectories - Preserves file extensions, including compound extensions like .tar.gz -- Provides informative logging with optional debug mode +- Provides informative logging +- Provides a dry-run mode to preview renaming changes without executing them +- Skips recursive symlinks to avoid infinite loops

(back to top)

@@ -58,16 +60,18 @@ pip install CrossRename ## Usage ``` -usage: crossrename [-h] -p PATH [-d] [-v] [-r] +usage: crossrename [-h] [-p PATH] [-v] [-u] [-r] [-d] CrossRename: Harmonize file names for Linux and Windows. options: -h, --help show this help message and exit -p PATH, --path PATH The path to the file or directory to rename. - -d, --debug Enable debug mode. -v, --version Prints out the current version and quits. + -u, --update Check if a new version is available. -r, --recursive Rename all files in the directory path given and its subdirectories. + -d, --dry-run Perform a dry run, logging changes without renaming. + ``` @@ -87,6 +91,18 @@ Rename all files in a directory (and its subdirectories ): crossrename -p /path/to/directory -r ``` +Perform a dry run to preview renaming changes without executing them: + +``` +crossrename -p /path/to/directory -r -d +``` + +Check for an update: + +``` +crossrename -u +``` +

(back to top)

## Why did I build this? From 3332fbbb675e6bb0c37a1c6e68c399efaa014c17 Mon Sep 17 00:00:00 2001 From: "Emmanuel C. Jemeni" Date: Sat, 16 Nov 2024 01:06:43 +0100 Subject: [PATCH 09/11] chore: update changelog for version 1.1.0 with new --update flag --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 373e8d3..501bfb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [1.1.0] - 2024-11-15 ### Added - Dry-run mode and recursive symlink handling. +- add --update flag to check for new version. ### Changed - Changed logo From 30d9a0c0025234bdb22786bad993a74d8397f2a2 Mon Sep 17 00:00:00 2001 From: "Emmanuel C. Jemeni" Date: Sat, 16 Nov 2024 01:15:33 +0100 Subject: [PATCH 10/11] chore(changelog): add removed section for unimplemented debug argument --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 501bfb0..91340bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Changed logo +### Removed +- Removed debug argument option, it wasn't even implemented ## [1.0.0] - 2024-10-07 - Released CrossRename From d30929eaebe416dac0799c2b850185e669d68ed9 Mon Sep 17 00:00:00 2001 From: "Emmanuel C. Jemeni" Date: Sat, 16 Nov 2024 01:16:11 +0100 Subject: [PATCH 11/11] docs(readme.rst): update features and usage for new options and improvements --- PYPI_README.rst | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/PYPI_README.rst b/PYPI_README.rst index e3f0122..2200756 100644 --- a/PYPI_README.rst +++ b/PYPI_README.rst @@ -33,7 +33,9 @@ Features - Handles both individual files and entire directories - Supports recursive renaming of files in subdirectories - Preserves file extensions, including compound extensions like .tar.gz -- Provides informative logging with optional debug mode +- Provides informative logging +- Provides a dry-run mode to preview renaming changes without executing them +- Skips recursive symlinks to avoid infinite loops Installation ============ @@ -50,16 +52,17 @@ Usage :: - usage: crossrename [-h] -p PATH [-d] [-v] [-r] + usage: crossrename [-h] [-p PATH] [-v] [-u] [-r] [-d] CrossRename: Harmonize file names for Linux and Windows. options: -h, --help show this help message and exit -p PATH, --path PATH The path to the file or directory to rename. - -d, --debug Enable debug mode. -v, --version Prints out the current version and quits. + -u, --update Check if a new version is available. -r, --recursive Rename all files in the directory path given and its subdirectories. + -d, --dry-run Perform a dry run, logging changes without renaming. Examples -------- @@ -76,16 +79,30 @@ Rename all files in a directory (and its subdirectories): crossrename -p /path/to/directory -r +Perform a dry run to preview renaming changes without executing them: + +:: + + crossrename -p /path/to/directory -r -d + + +Check for an update: + +:: + + crossrename -u + + Why did I build this? ===================== .. warning:: - I’m no longer dual booting. I’m only using Windows 10 now. I do have - WSL2 and that’s what I use for testing. I don’t know if there’ll be + I'm no longer dual booting. I'm only using Windows 10 now. I do have + WSL2 and that's what I use for testing. I don't know if there'll be any difference in the way the tool works on a native Linux system. -I’m a dual-booter running Windows 10 and Lubuntu 22.04. One day +I'm a dual-booter running Windows 10 and Lubuntu 22.04. One day (literally yesterday lol), while transferring a folder between the two systems, I hit a naming roadblock. Five stubborn files refused to budge, thanks to the quirky differences in file naming rules between Linux and @@ -104,14 +121,14 @@ smooth, worry-free file management. Contributing ============ -Contributions are welcome! If you’d like to improve CrossRename or add +Contributions are welcome! If you'd like to improve CrossRename or add support for other operating systems (like macOS), please feel free to submit a pull request. Wait a minute, who are you? =========================== -Hello there! I’m Emmanuel Jemeni, and while I primarily work as a +Hello there! I'm Emmanuel Jemeni, and while I primarily work as a Frontend Developer, Python holds a special place as my first programming language. You can find me on various platforms: