71 lines
1.6 KiB
Python
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"]
|