4 lines
4.8 KiB
JavaScript
4 lines
4.8 KiB
JavaScript
#!/usr/bin/env node
|
|
import crypto from "node:crypto"; import fs from "node:fs"; import path from "node:path"; import { execFileSync } from "node:child_process";
|
|
const root = path.resolve(path.dirname(new URL(import.meta.url).pathname), ".."); const sourceRoot = path.join(root, "freecad-source"); const docs = path.join(root, "docs/p6"); const read = (file) => fs.readFileSync(path.join(sourceRoot, file), "utf8"); const lineNumbers = (text, regex) => text.split(/\r?\n/).flatMap((line, index) => regex.test(line) ? [index + 1] : []); const files = ["src/Mod/MeshPart/CMakeLists.txt", "src/Mod/MeshPart/App/CMakeLists.txt", "src/Mod/MeshPart/Gui/CMakeLists.txt", "src/Mod/MeshPart/App/AppMeshPart.cpp", "src/Mod/MeshPart/App/AppMeshPartPy.cpp", "src/Mod/MeshPart/Gui/AppMeshPartGui.cpp"]; const contents = Object.fromEntries(files.map((file) => [file, read(file)])); const app = contents["src/Mod/MeshPart/App/AppMeshPart.cpp"]; const python = contents["src/Mod/MeshPart/App/AppMeshPartPy.cpp"]; const gui = contents["src/Mod/MeshPart/Gui/AppMeshPartGui.cpp"]; const report = { schema: "freecad-web-p6-meshpart-source-boundary/v1", taskId: "FW-P6-MSP-A", module: "MeshPart", result: "pass_boundary", sourceRevision: execFileSync("git", ["-C", sourceRoot, "rev-parse", "HEAD"], { encoding: "utf8" }).trim(), commands: ["rg -n \"BUILD_|Init|addObject|registerType|PyInit\" src/Mod/MeshPart"], cmake: { module: { file: "src/Mod/MeshPart/CMakeLists.txt", guiGuardLines: lineNumbers(contents["src/Mod/MeshPart/CMakeLists.txt"], /BUILD_GUI/), appSubdirectoryLine: lineNumbers(contents["src/Mod/MeshPart/CMakeLists.txt"], /add_subdirectory\(App\)/)[0], guiSubdirectoryLine: lineNumbers(contents["src/Mod/MeshPart/CMakeLists.txt"], /add_subdirectory\(Gui\)/)[0] }, app: { file: "src/Mod/MeshPart/App/CMakeLists.txt", target: "MeshPart", dependencies: ["Part", "Mesh", "SMESH/SMDS/StdMeshers when enabled", "NETGEN when BUILD_FEM_NETGEN"], linkLine: lineNumbers(contents["src/Mod/MeshPart/App/CMakeLists.txt"], /target_link_libraries\(MeshPart/)[0], optionalGuards: lineNumbers(contents["src/Mod/MeshPart/App/CMakeLists.txt"], /BUILD_FEM_NETGEN|BUILD_SMESH|BUILD_FLAT_MESH/) }, gui: { file: "src/Mod/MeshPart/Gui/CMakeLists.txt", target: "MeshPartGui", dependencies: ["MeshPart", "PartGui", "MeshGui", "FreeCADGui", "SMESH/NETGEN when enabled"], linkLine: lineNumbers(contents["src/Mod/MeshPart/Gui/CMakeLists.txt"], /target_link_libraries\(MeshPartGui/)[0] } }, appBoundary: { moduleEntry: { file: "src/Mod/MeshPart/App/AppMeshPart.cpp", lines: lineNumbers(app, /PyMOD_INIT_FUNC\(MeshPart\)/), symbol: "PyMOD_INIT_FUNC(MeshPart)" }, pythonEntry: { file: "src/Mod/MeshPart/App/AppMeshPartPy.cpp", lines: lineNumbers(python, /initModule/), symbol: "MeshPart generated Python module" }, appSources: ["MeshAlgos.cpp", "CurveProjector.cpp", "Mesher.cpp"], pythonSources: ["AppMeshPartPy.cpp", "MeshFlatteningPy.cpp"] }, guiBoundary: { moduleEntry: { file: "src/Mod/MeshPart/Gui/AppMeshPartGui.cpp", lines: lineNumbers(gui, /PyMOD_INIT_FUNC\(MeshPartGui\)/), symbol: "PyMOD_INIT_FUNC(MeshPartGui)" }, guiOnly: true, excludedDependencies: ["FreeCADGui", "PartGui", "MeshGui", "Qt Widgets", "OpenGL", "SMESH GUI"] }, actionEntrypoints: [ { file: "src/Mod/MeshPart/App/MeshAlgos.cpp", kind: "mesh/shape algorithms" }, { file: "src/Mod/MeshPart/App/CurveProjector.cpp", kind: "curve projection onto mesh" }, { file: "src/Mod/MeshPart/App/Mesher.cpp", kind: "shape tessellation" }, { file: "src/Mod/MeshPart/App/MeshFlatteningPy.cpp", kind: "optional flat mesh Python API" }, { file: "src/Mod/MeshPart/Gui/Tessellation.cpp", kind: "GUI tessellation workflow" } ], sourceSha256: Object.fromEntries(files.map((file) => [file, crypto.createHash("sha256").update(contents[file]).digest("hex")])), conditions: { gui: "BUILD_GUI gates MeshPartGui and InitGui.py", smesh: "SMESH_FOUND/BUILD_SMESH control optional meshing backends", netgen: "BUILD_FEM_NETGEN controls NETGENPlugin dependencies", flatmesh: "BUILD_FLAT_MESH controls optional flatmesh target" }, boundaries: ["MeshPart App and MeshPartGui are separate targets; GUI tessellation and cross-section commands remain excluded from the Web App boundary.", "This card records source and dependency boundaries only; no WASM runtime, Facade, Chrome, or persistence result is inferred."] }; fs.writeFileSync(path.join(docs, "meshpart-source-boundary.json"), `${JSON.stringify(report, null, 2)}\n`); fs.writeFileSync(path.join(root, "docs/freecad-p6-meshpart-a-boundary.log"), `${JSON.stringify({ result: report.result, sourceRevision: report.sourceRevision, appEntry: report.appBoundary.moduleEntry.lines[0], guiEntry: report.guiBoundary.moduleEntry.lines[0], optionalGuards: report.cmake.app.optionalGuards })}\n`); console.log(JSON.stringify({ result: report.result, appEntry: report.appBoundary.moduleEntry.lines[0], guiEntry: report.guiBoundary.moduleEntry.lines[0], optionalGuards: report.cmake.app.optionalGuards }));
|