From: Danilo M. Date: Sun, 3 May 2026 08:10:22 +0000 (+0200) Subject: feat: GitWorker QThread for pull/push/rm/restore X-Git-Tag: v1.0~23 X-Git-Url: https://git.danix.xyz/?a=commitdiff_plain;h=e8a8a4c37713be0c0bc49a78f36570c80807b43a;p=publisher.git feat: GitWorker QThread for pull/push/rm/restore --- diff --git a/workers/git_worker.py b/workers/git_worker.py new file mode 100644 index 0000000..00e0069 --- /dev/null +++ b/workers/git_worker.py @@ -0,0 +1,72 @@ +from __future__ import annotations +from PyQt6.QtCore import QThread, pyqtSignal +import subprocess +from pathlib import Path + +class GitWorker(QThread): + output = pyqtSignal(str) + error = pyqtSignal(str) + finished = pyqtSignal(bool) # True = success + + def __init__(self, repo_path: Path, command: list[str], parent=None): + super().__init__(parent) + self._repo_path = repo_path + self._command = command + + def run(self): + try: + result = subprocess.run( + self._command, + cwd=self._repo_path, + capture_output=True, + text=True, + ) + if result.stdout: + self.output.emit(result.stdout) + if result.returncode != 0: + self.error.emit(result.stderr or f"Exit code {result.returncode}") + self.finished.emit(False) + else: + self.finished.emit(True) + except Exception as e: + self.error.emit(str(e)) + self.finished.emit(False) + + @staticmethod + def pull(repo_path: Path, parent=None) -> "GitWorker": + return GitWorker(repo_path, ["git", "pull"], parent) + + @staticmethod + def push_master(repo_path: Path, parent=None) -> "GitWorker": + return GitWorker(repo_path, ["git", "push", "origin", "master"], parent) + + @staticmethod + def push_production(repo_path: Path, parent=None) -> "GitWorker": + return GitWorker(repo_path, ["git", "push", "origin", "production"], parent) + + @staticmethod + def remove_article(repo_path: Path, rel_path: str, slug: str, lang: str, parent=None) -> "GitWorker": + class _RmWorker(QThread): + output = pyqtSignal(str) + error = pyqtSignal(str) + finished = pyqtSignal(bool) + + def run(self_inner): + for cmd in [ + ["git", "rm", "-r", rel_path], + ["git", "commit", "-m", f"remove: {slug} ({lang})"], + ]: + result = subprocess.run(cmd, cwd=repo_path, capture_output=True, text=True) + if result.stdout: + self_inner.output.emit(result.stdout) + if result.returncode != 0: + self_inner.error.emit(result.stderr or f"Exit code {result.returncode}") + self_inner.finished.emit(False) + return + self_inner.finished.emit(True) + + return _RmWorker(parent) + + @staticmethod + def restore_article(repo_path: Path, commit_hash: str, rel_path: str, parent=None) -> "GitWorker": + return GitWorker(repo_path, ["git", "checkout", commit_hash, "--", rel_path], parent)