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

111 lines
3.1 KiB
Python

import logging
import os
import sys
from pathlib import Path
from typing import Tuple
import pcbnew
import wx
from . import git
logger = logging.getLogger(__name__)
class PluginError(Exception):
def __init__(self, message: str) -> None:
self.message = message
super().__init__(self.message)
def setup_logging(destination: str) -> None:
# Remove all handlers associated with the root logger object.
for handler in logging.root.handlers[:]:
logging.root.removeHandler(handler)
# set up logger
logging.basicConfig(
level=logging.DEBUG,
filename=f"{destination}/kicadgit.log",
filemode="w",
format="%(asctime)s %(name)s %(lineno)d: %(message)s",
datefmt="%H:%M:%S",
)
def get_kicad_version() -> str:
version = pcbnew.Version()
if int(version.split(".")[0]) < 7:
msg = f"KiCad version {version} is not supported"
raise PluginError(msg)
logger.info(f"Plugin executed with KiCad version: {version}")
logger.info(f"Plugin executed with python version: {repr(sys.version)}")
return version
def get_git_version() -> str:
try:
git_version = git.version()
if not git_version.startswith("git version "):
msg = f"Unexpected git version: {git_version}"
raise PluginError(msg)
except Exception as e:
msg = f"Could not find git executable: {e}"
raise PluginError(msg)
logger.info(f"Plugin executed with {git_version}")
return git_version
def get_board() -> Tuple[pcbnew.BOARD, str]:
board = pcbnew.GetBoard()
if not board:
msg = "Could not load board"
raise PluginError(msg)
board_file = board.GetFileName()
if not board_file:
msg = "Could not locate .kicad_pcb file, open or create it first"
raise PluginError(msg)
logger.info(f"Board file: {board_file}")
return board, board_file
def get_repo_dir(board_file: str) -> Path:
board_dir = Path(board_file).parent
repo_dir = git.toplevel(board_dir)
if repo_dir is None:
msg = "Could not locate git repository"
raise PluginError(msg)
logger.info(f"Repository top directory: {repo_dir}")
return repo_dir
class GitPluginAction(pcbnew.ActionPlugin):
def defaults(self) -> None:
self.name = "Git Plugin"
self.category = ""
self.description = ""
self.show_toolbar_button = True
self.icon_file_name = os.path.join(os.path.dirname(__file__), "icon.png")
def Initialize(self) -> None:
self.window = wx.GetActiveWindow()
self.plugin_path = os.path.dirname(__file__)
setup_logging(self.plugin_path)
_ = get_kicad_version()
_ = get_git_version()
self.board, self.board_file = get_board()
self.repo_dir = get_repo_dir(self.board_file)
def Run(self) -> None:
try:
self.Initialize()
self.board.Save(self.board_file)
git.guitool(self.repo_dir)
except PluginError as e:
error = wx.MessageDialog(self.window, e.message, style=wx.ICON_ERROR)
error.ShowModal()
logging.shutdown()