/** * Git utility to load commit hash in both development and production environments */ interface GitInfo { commitHash: string; buildTime: string; } let cachedGitInfo: GitInfo | null = null; /** * Gets the current git commit hash from various sources * - First tries environment variable (from Docker) * - Then tries the JSON file created by our build script * - Returns "dev" if nothing is available */ export async function getGitCommitInfo(): Promise { // Return cached value if available if (cachedGitInfo) { return cachedGitInfo; } // First, check if we have the env variable (from Docker) if (process.env.GIT_COMMIT_SHA) { const gitInfo: GitInfo = { commitHash: process.env.GIT_COMMIT_SHA, buildTime: new Date().toISOString(), }; cachedGitInfo = gitInfo; return gitInfo; } // In the browser, fetch from the public directory if (typeof window !== 'undefined') { try { const response = await fetch('/git-info.json'); if (response.ok) { const gitInfo: GitInfo = await response.json(); cachedGitInfo = gitInfo; return gitInfo; } } catch (error) { console.warn('Could not fetch git info from public directory', error); } } else { // On the server (during local development), try to load from the static directory try { // We use dynamic import to avoid bundling this in the client build const fs = require('fs'); const path = require('path'); const gitInfoPath = path.join(process.cwd(), 'public', 'git-info.json'); if (fs.existsSync(gitInfoPath)) { const gitInfo: GitInfo = JSON.parse(fs.readFileSync(gitInfoPath, 'utf8')); cachedGitInfo = gitInfo; return gitInfo; } } catch (error) { console.warn('Could not read git info from file system', error); } } // Default if nothing else works const defaultGitInfo: GitInfo = { commitHash: 'development', buildTime: new Date().toISOString(), }; return defaultGitInfo; }