This commit is contained in:
NotII
2025-04-06 15:48:11 +01:00
parent a651bd3ec4
commit 59a9063bfc
5 changed files with 130 additions and 2 deletions

71
lib/git-utils.ts Normal file
View File

@@ -0,0 +1,71 @@
/**
* 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<GitInfo> {
// 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;
}