65 lines
2.3 KiB
Python
65 lines
2.3 KiB
Python
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)
|