From 3dd0da39648d756cc5df0fab757a85d01c3bae6e Mon Sep 17 00:00:00 2001 From: Zoe Forbes Date: Sat, 14 Feb 2026 15:10:50 -0600 Subject: [PATCH] feat: push DAG on save and commit Adds _push_dag_after_upload() helper that extracts the feature DAG and pushes it to Silo after a successful file upload. Hooked into both Silo_Save and Silo_Commit commands. DAG sync failures are logged as warnings and never block the save/commit. Closes kindred/create#216 --- freecad/silo_commands.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/freecad/silo_commands.py b/freecad/silo_commands.py index 452f0f9..b3c7442 100644 --- a/freecad/silo_commands.py +++ b/freecad/silo_commands.py @@ -717,6 +717,28 @@ class Silo_New: return _server_mode == "normal" +def _push_dag_after_upload(doc, part_number, revision_number): + """Extract and push the feature DAG after a successful upload. + + Failures are logged as warnings -- DAG sync must never block save. + """ + try: + from dag import extract_dag + + nodes, edges = extract_dag(doc) + if not nodes: + return + + result = _client.push_dag(part_number, revision_number, nodes, edges) + node_count = result.get("node_count", len(nodes)) + edge_count = result.get("edge_count", len(edges)) + FreeCAD.Console.PrintMessage( + f"DAG synced: {node_count} nodes, {edge_count} edges\n" + ) + except Exception as e: + FreeCAD.Console.PrintWarning(f"DAG sync failed: {e}\n") + + class Silo_Save: """Save locally and upload to MinIO.""" @@ -787,6 +809,8 @@ class Silo_Save: new_rev = result["revision_number"] FreeCAD.Console.PrintMessage(f"Uploaded as revision {new_rev}\n") + _push_dag_after_upload(doc, part_number, new_rev) + except Exception as e: FreeCAD.Console.PrintWarning(f"Upload failed: {e}\n") FreeCAD.Console.PrintMessage("File saved locally but not uploaded.\n") @@ -841,6 +865,8 @@ class Silo_Commit: new_rev = result["revision_number"] FreeCAD.Console.PrintMessage(f"Committed revision {new_rev}: {comment}\n") + _push_dag_after_upload(doc, part_number, new_rev) + except Exception as e: FreeCAD.Console.PrintError(f"Commit failed: {e}\n")