MeshChatX/scripts/bake_build_meta.js

124 lines
3.3 KiB
JavaScript
Raw Permalink Normal View History

/**
* 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();