diff options
| author | Danilo M. <danix@danix.xyz> | 2026-05-03 10:10:22 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-05-03 10:10:22 +0200 |
| commit | e8a8a4c37713be0c0bc49a78f36570c80807b43a (patch) | |
| tree | 5d02034dc12f7eca4d822bf420a0c52b33d06ca2 | |
| parent | 78dea7417fed34ba96efbd8e6d4f1f87c3e998f0 (diff) | |
| download | publisher-e8a8a4c37713be0c0bc49a78f36570c80807b43a.tar.gz publisher-e8a8a4c37713be0c0bc49a78f36570c80807b43a.zip | |
feat: GitWorker QThread for pull/push/rm/restore
| -rw-r--r-- | workers/git_worker.py | 72 |
1 files changed, 72 insertions, 0 deletions
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) |
