my-kicad-user-folder/3rdparty/plugins/com_github_adamws_kicad-git/git.py
2025-03-21 13:28:36 +08:00

71 lines
1.6 KiB
Python

import configparser
import os
import platform
import shlex
import subprocess
import sys
from pathlib import Path
from typing import Optional
if platform.system() == "Darwin":
DEFAULT_CONFIG = """[paths]
git = /opt/homebrew/bin/git
git_gui = /opt/homebrew/bin/git gui"""
else:
DEFAULT_CONFIG = """[paths]
git = git
git_gui = git gui"""
config = configparser.ConfigParser()
config.read_string(DEFAULT_CONFIG)
config.read(os.path.dirname(__file__) + "/config.ini")
git: str = config["paths"]["git"]
git_gui: str = config["paths"]["git_gui"]
def __run(command: str, cwd: Path) -> str:
args = f"{git} {command}"
if sys.platform != "win32":
args = shlex.split(args)
process = subprocess.Popen(
args,
cwd=cwd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
universal_newlines=True,
)
process.wait()
output = ""
if process.stdout:
output = process.stdout.read()
if process.returncode == 0:
return output
error = f"Error: Failed to '{git} {command}', received: {output}"
raise RuntimeError(error)
def version() -> str:
return __run("version", Path("."))
def toplevel(path: Path) -> Optional[Path]:
if path.exists():
try:
result = __run("rev-parse --show-toplevel", path).strip()
if result:
return Path(result)
except RuntimeError:
pass
return None
def guitool(repo_dir: Path) -> None:
args = git_gui
if sys.platform != "win32":
args = shlex.split(args)
subprocess.Popen(args, cwd=repo_dir)
__all__ = ["version", "toplevel", "guitool"]