From 28dcbcabc9c16fd7ec14759fddecae2032170d35 Mon Sep 17 00:00:00 2001 From: sirlilpanda Date: Wed, 31 Dec 2025 14:32:21 +1300 Subject: [PATCH] added method to auto commit generated files --- .hooks/kicad_cli_tools.py | 96 +++++++++++++++++++++++++++++++-------- 1 file changed, 78 insertions(+), 18 deletions(-) diff --git a/.hooks/kicad_cli_tools.py b/.hooks/kicad_cli_tools.py index 4de5a09..515e230 100644 --- a/.hooks/kicad_cli_tools.py +++ b/.hooks/kicad_cli_tools.py @@ -21,9 +21,16 @@ PCB_PDF_FILE_SUFFIX = "_pcb" SCHEMATIC_OUTPUT_PATH = "docs/" SCHEMATIC_FILE_SUFFIX = "_schematic" +BOM_OUTPUT_PATH = "docs/" +BOM_REPORT_NAME = "_bom" + TEMP_DRC_REPORT_NAME = "_drc" TEMP_ERC_REPORT_NAME = "_erc" -TEMP_BOM_REPORT_NAME = "_bom" + +# quiet +STDOUT=subprocess.DEVNULL +# verbose +# STDOUT=subprocess.STDOUT class OutputReportType(Enum): JSON = 1 @@ -35,6 +42,7 @@ class KicadProject: def __init__(self, path : Path) -> None: self.project_path = path.parent self.project_name = path.name.removesuffix(".kicad_pro") + self.created_files : list[Path] = [] print(f"{self.project_path=}") print(f"{self.project_name=}") @@ -46,11 +54,19 @@ class KicadProject: format_type = report_format.name.lower() pcb_file_path = self.project_path / f"{self.project_name}.kicad_sch" erc_report_path = Path(TEMP_FILE_PATH) / f"{self.project_name}{TEMP_ERC_REPORT_NAME}.{format_type}" - subprocess.call( + + retcode = subprocess.call( f'{KICAD_CLI_PATH} sch erc {pcb_file_path} --output {erc_report_path} --format {format_type}', shell=True, + stdout=STDOUT ) + if (retcode != 0): + print(f"erc check failed return code {retcode}") + exit(1) + + self.created_files.append(erc_report_path) + if (return_report): with open(erc_report_path, "r") as txt: if format_type == OutputReportType.JSON: @@ -66,11 +82,18 @@ class KicadProject: format_type = report_format.name.lower() pcb_file_path = self.project_path / f"{self.project_name}.kicad_pcb" drc_report_path = Path(TEMP_FILE_PATH) / f"{self.project_name}{TEMP_DRC_REPORT_NAME}.{format_type}" - subprocess.call( + retcode = subprocess.call( f'{KICAD_CLI_PATH} pcb drc {pcb_file_path} --output {drc_report_path} --format {format_type}', shell=True, + stdout=STDOUT ) + if (retcode != 0): + print(f"drc check failed return code {retcode}") + exit(1) + + self.created_files.append(drc_report_path) + if (return_report): with open(drc_report_path, "r") as txt: if format_type == OutputReportType.JSON: @@ -78,13 +101,23 @@ class KicadProject: if format_type == OutputReportType.RPT: return txt.read() - def process_bom(self, return_csv : bool = False) -> None | list[list[str]]: + def process_bom( + self, + return_csv : bool = False + ) -> None | list[list[str]]: sch_file_path = self.project_path / f"{self.project_name}.kicad_sch" - bom_output_path = Path(TEMP_FILE_PATH) / f"{self.project_name}{TEMP_DRC_REPORT_NAME}.csv" - subprocess.call( + bom_output_path = Path(BOM_OUTPUT_PATH) / f"{self.project_name}{BOM_REPORT_NAME}.csv" + retcode = subprocess.call( f'{KICAD_CLI_PATH} sch export bom {sch_file_path} --output {bom_output_path}', shell=True, - ) + stdout=STDOUT + ) + + if (retcode != 0): + print(f"process_bom failed return code {retcode}") + exit(1) + + self.created_files.append(bom_output_path) if (return_csv): with open(bom_output_path, "r") as csvfile: bom_csv = csv.reader(csvfile, delimiter=',', quotechar='"') @@ -106,44 +139,71 @@ class KicadProject: """ pcb_file_path = self.project_path / f"{self.project_name}.kicad_pcb" render_output_path = Path(PCB_IMAGE_OUTPUT_PATH) / f"{self.project_name}_render.{image_type}" - subprocess.call( + retcode = subprocess.call( f'{KICAD_CLI_PATH} pcb render {pcb_file_path} --output {render_output_path} --preset {preset} --zoom {zoom} ', shell=True, + stdout=STDOUT ) + + if (retcode != 0): + print(f"get_image failed return code {retcode}") + exit(1) + + self.created_files.append(render_output_path) # i am not giving you the pdf to output if you want to do that yourself go ahead def create_schmatic_pdf(self) -> None: sch_file_path = self.project_path / f"{self.project_name}.kicad_sch" sch_report_path = Path(SCHEMATIC_OUTPUT_PATH) / f"{self.project_name}{SCHEMATIC_FILE_SUFFIX}.pdf" - subprocess.call( + retcode = subprocess.call( f'{KICAD_CLI_PATH} sch export pdf {sch_file_path} --output {sch_report_path}', shell=True, + stdout=STDOUT ) + + if (retcode != 0): + print(f"create_schmatic_pdf failed return code {retcode}") + exit(1) + + self.created_files.append(sch_report_path) def create_pcb_pdf(self, layers : list[str] = ["F.Cu", "B.Cu"]) -> None: pcb_file_path = self.project_path / f"{self.project_name}.kicad_pcb" pcb_report_path = Path(PCB_PDF_OUTPUT_PATH) / f"{self.project_name}{PCB_PDF_FILE_SUFFIX}.pdf" - subprocess.call( + retcode = subprocess.call( f'{KICAD_CLI_PATH} pcb export pdf {pcb_file_path} --output {pcb_report_path} --layers {",".join(layers)}', shell=True, + stdout=STDOUT ) -def main() -> None: + if (retcode != 0): + print(f"create_pcb_pdf failed return code {retcode}") + exit(1) + + self.created_files.append(pcb_report_path) +def commit_files(files: list[Path], commit_message : str) -> None: + for file in files: + # add & commit, could use the return code however these should never fail + print(f"adding and commiting {file}") + ret_add = subprocess.call(f"git add {file}", shell=True) + ret_commit = subprocess.call(f"git commit -m \"{commit_message}\"", shell=True) + + +def main() -> None: # find all kicad project files to operate on for path in Path(".").rglob('*.kicad_pro'): - print(path.name) - print(path) - print(type(path.parent)) k = KicadProject(path) k.drc_check() k.erc_check() k.process_bom() k.create_schmatic_pdf() - k.create_pcb_pdf() k.get_image() - - print("hello world"); + commit_files(k.created_files, "auto commited") if __name__ == "__main__": - main() \ No newline at end of file + try: + main() + exit(0) + except Exception as e: + exit(1)