/** * Bake git commit and build channel into meshchatx/src/_build_meta_baked.py * (gitignored). meshchatx.src.build_meta imports that overlay when present. * * Invoked from scripts/sync_version.js (pnpm run version:sync / build). * * Channel detection (first match wins): * MESHCHATX_BUILD_CHANNEL env * GITHUB_REF_NAME / GITHUB_REF (nightly-*, preview-dev-*, preview-*, vX.Y.Z) * default: local (is_dev) * * Dev channels (nightly, preview-dev, preview, local) set IS_DEV_BUILD. * Release tags (vX.Y.Z) clear IS_DEV_BUILD. */ const fs = require("fs"); const path = require("path"); const { execFileSync } = require("child_process"); const root = path.resolve(__dirname, ".."); const metaPath = path.join(root, "meshchatx", "src", "_build_meta_baked.py"); function envTrim(name) { const v = process.env[name]; return typeof v === "string" ? v.trim() : ""; } function git(args) { try { return execFileSync("git", args, { cwd: root, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"], }).trim(); } catch { return ""; } } function resolveCommit() { const fromEnv = envTrim("MESHCHATX_GIT_COMMIT") || envTrim("GIT_COMMIT") || envTrim("GITHUB_SHA"); if (fromEnv) { return fromEnv; } return git(["rev-parse", "HEAD"]); } function shortCommit(full) { if (!full) { return ""; } if (/^[0-9a-f]{7,40}$/i.test(full)) { return full.slice(0, 7).toLowerCase(); } const fromGit = git(["rev-parse", "--short=7", "HEAD"]); return fromGit || full.slice(0, 7); } function refName() { return ( envTrim("MESHCHATX_BUILD_REF") || envTrim("GITHUB_REF_NAME") || envTrim("GITHUB_REF").replace(/^refs\/(heads|tags)\//, "") ); } function resolveChannel(ref) { const forced = envTrim("MESHCHATX_BUILD_CHANNEL").toLowerCase(); if (forced) { return forced; } if (!ref) { return "local"; } if (ref.startsWith("nightly-")) { return "nightly"; } if (ref.startsWith("preview-dev-")) { return "preview-dev"; } if (ref.startsWith("preview-")) { return "preview"; } if (/^v\d+\.\d+\.\d+/.test(ref)) { return "release"; } return "local"; } function isDevChannel(channel) { return channel !== "release"; } function pyString(value) { return JSON.stringify(String(value ?? "")); } function bake() { const commit = resolveCommit(); const short = shortCommit(commit); const ref = refName(); const channel = resolveChannel(ref); const isDev = isDevChannel(channel); const content = `# SPDX-License-Identifier: 0BSD """Generated by scripts/bake_build_meta.js. Do not commit.""" GIT_COMMIT = ${pyString(commit)} GIT_COMMIT_SHORT = ${pyString(short)} BUILD_CHANNEL = ${pyString(channel)} IS_DEV_BUILD = ${isDev ? "True" : "False"} `; const prev = fs.existsSync(metaPath) ? fs.readFileSync(metaPath, "utf8") : null; if (prev !== content) { fs.writeFileSync(metaPath, content, "utf8"); console.log(`Baked build_meta channel=${channel} is_dev=${isDev} commit=${short || "unknown"}`); } else { console.log(`build_meta unchanged channel=${channel} is_dev=${isDev} commit=${short || "unknown"}`); } } bake();