Spaces:
Running
Running
import type { LoaderFunction } from '@remix-run/cloudflare'; | |
import { json } from '@remix-run/cloudflare'; | |
import { execSync } from 'child_process'; | |
interface GitHubRepoInfo { | |
name: string; | |
full_name: string; | |
default_branch: string; | |
stargazers_count: number; | |
forks_count: number; | |
open_issues_count: number; | |
parent?: { | |
full_name: string; | |
default_branch: string; | |
stargazers_count: number; | |
forks_count: number; | |
}; | |
} | |
const getLocalGitInfo = () => { | |
try { | |
return { | |
commitHash: execSync('git rev-parse HEAD').toString().trim(), | |
branch: execSync('git rev-parse --abbrev-ref HEAD').toString().trim(), | |
commitTime: execSync('git log -1 --format=%cd').toString().trim(), | |
author: execSync('git log -1 --format=%an').toString().trim(), | |
email: execSync('git log -1 --format=%ae').toString().trim(), | |
remoteUrl: execSync('git config --get remote.origin.url').toString().trim(), | |
repoName: execSync('git config --get remote.origin.url') | |
.toString() | |
.trim() | |
.replace(/^.*github.com[:/]/, '') | |
.replace(/\.git$/, ''), | |
}; | |
} catch (error) { | |
console.error('Failed to get local git info:', error); | |
return null; | |
} | |
}; | |
const getGitHubInfo = async (repoFullName: string) => { | |
try { | |
// Add GitHub token if available | |
const headers: Record<string, string> = { | |
Accept: 'application/vnd.github.v3+json', | |
}; | |
const githubToken = process.env.GITHUB_TOKEN; | |
if (githubToken) { | |
headers.Authorization = `token ${githubToken}`; | |
} | |
console.log('Fetching GitHub info for:', repoFullName); // Debug log | |
const response = await fetch(`https://api.github.com/repos/${repoFullName}`, { | |
headers, | |
}); | |
if (!response.ok) { | |
console.error('GitHub API error:', { | |
status: response.status, | |
statusText: response.statusText, | |
repoFullName, | |
}); | |
// If we get a 404, try the main repo as fallback | |
if (response.status === 404 && repoFullName !== 'stackblitz-labs/bolt.diy') { | |
return getGitHubInfo('stackblitz-labs/bolt.diy'); | |
} | |
throw new Error(`GitHub API error: ${response.statusText}`); | |
} | |
const data = await response.json(); | |
console.log('GitHub API response:', data); // Debug log | |
return data as GitHubRepoInfo; | |
} catch (error) { | |
console.error('Failed to get GitHub info:', error); | |
return null; | |
} | |
}; | |
export const loader: LoaderFunction = async ({ request: _request }) => { | |
const localInfo = getLocalGitInfo(); | |
console.log('Local git info:', localInfo); // Debug log | |
// If we have local info, try to get GitHub info for both our fork and upstream | |
let githubInfo = null; | |
if (localInfo?.repoName) { | |
githubInfo = await getGitHubInfo(localInfo.repoName); | |
} | |
// If no local info or GitHub info, try the main repo | |
if (!githubInfo) { | |
githubInfo = await getGitHubInfo('stackblitz-labs/bolt.diy'); | |
} | |
const response = { | |
local: localInfo || { | |
commitHash: 'unknown', | |
branch: 'unknown', | |
commitTime: 'unknown', | |
author: 'unknown', | |
email: 'unknown', | |
remoteUrl: 'unknown', | |
repoName: 'unknown', | |
}, | |
github: githubInfo | |
? { | |
currentRepo: { | |
fullName: githubInfo.full_name, | |
defaultBranch: githubInfo.default_branch, | |
stars: githubInfo.stargazers_count, | |
forks: githubInfo.forks_count, | |
openIssues: githubInfo.open_issues_count, | |
}, | |
upstream: githubInfo.parent | |
? { | |
fullName: githubInfo.parent.full_name, | |
defaultBranch: githubInfo.parent.default_branch, | |
stars: githubInfo.parent.stargazers_count, | |
forks: githubInfo.parent.forks_count, | |
} | |
: null, | |
} | |
: null, | |
isForked: Boolean(githubInfo?.parent), | |
timestamp: new Date().toISOString(), | |
}; | |
console.log('Final response:', response); | |
// Debug log | |
return json(response); | |
}; | |