diff --git a/file_watcher.py b/file_watcher.py new file mode 100644 index 0000000..9a84175 --- /dev/null +++ b/file_watcher.py @@ -0,0 +1,64 @@ +import time +import os +from watchdog.observers import Observer +from watchdog.events import FileSystemEventHandler +from logger import logger +from git_manager import git_manager + +class RepositoryWatcher: + def __init__(self, path): + self.path = path + self.observer = Observer() + self.event_handler = GitEventHandler() + + def start(self): + self.observer.schedule(self.event_handler, self.path, recursive=True) + self.observer.start() + logger.info(f"Started monitoring: {self.path}") + + def stop(self): + self.observer.stop() + self.observer.join() + logger.info(f"Stopped monitoring: {self.path}") + +class GitEventHandler(FileSystemEventHandler): + def on_modified(self, event): + if not event.is_directory: + self.handle_event(event, "modify") + + def on_created(self, event): + if not event.is_directory: + self.handle_event(event, "create") + + def on_deleted(self, event): + if not event.is_directory: + self.handle_event(event, "delete") + + def on_moved(self, event): + if not event.is_directory: + src_name = os.path.basename(event.src_path) + dest_name = os.path.basename(event.dest_path) + action = "rename" + file_name = f"{src_name} -> {dest_name}" + self.handle_event(event, action, custom_file_name=file_name) + + def handle_event(self, event, action, custom_file_name=None): + # Ignore .git directory and the log file + file_path = event.src_path if action != "rename" else event.dest_path + file_name = os.path.basename(file_path) + + # Check if any part of the path is .git + if ".git" in file_path.split(os.sep) or file_name == "git_monitor.log": + return + + display_name = custom_file_name if custom_file_name else file_name + logger.info(f"File event: {action} on {display_name}") + + repo_root = git_manager.repo_path + if repo_root: + if custom_file_name: + # For renames, we use the custom format provided + git_manager.commit_change(action, custom_file_name) + else: + rel_path = os.path.relpath(file_path, repo_root) + git_manager.commit_change(action, rel_path)