import time import os import threading from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler from git_monitor.logger import logger from git_monitor.git_manager import git_manager from git_monitor.notifier import notifier 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): file_path = event.src_path if action != "rename" else event.dest_path file_name = os.path.basename(file_path) if ".git" in file_path.split(os.sep) or file_name == "git_monitor.log": return if git_manager.is_ignored(file_path): logger.info(f"Ignored: {file_path} (matches .gitignore)") return display_name = custom_file_name if custom_file_name else file_name logger.info(f"Change detected: {action} on {display_name}") repo_root = git_manager.repo_path if repo_root: rel_path = os.path.relpath(file_path, repo_root) if not custom_file_name else custom_file_name # Interactive notification instead of immediate commit def save_now(): git_manager.commit_change(action, rel_path) def ask_later(): logger.info(f"User deferred change: {rel_path} for 5 minutes.") # Reschedule the same event after 5 minutes (300 seconds) threading.Timer(300, self.handle_event, [event, action, custom_file_name]).start() notifier.notify_interactive( "Zmiana wykryta!", f"Wykryto zmianę: {action}: {display_name}. Co chcesz zrobić?", on_save=save_now, on_later=ask_later )