mirror of
https://github.com/rowboatlabs/rowboat.git
synced 2026-07-12 21:02:17 +02:00
fix(apps): bootstrap empty repos before the Git Data push
GitHub's Git Data API (blobs/trees/commits) returns 409 'Git Repository is empty' on a repo with no commits — it cannot create the first commit. Ensure main exists via a Contents API bootstrap commit (the generated README), then chain the publish commit onto it.
This commit is contained in:
parent
684ec0b390
commit
beaf6ebf69
1 changed files with 18 additions and 12 deletions
|
|
@ -165,6 +165,23 @@ async function pushSource(token: string, login: string, repoName: string, folder
|
||||||
const dir = appDir(folder);
|
const dir = appDir(folder);
|
||||||
const files = await collectSourceFiles(dir);
|
const files = await collectSourceFiles(dir);
|
||||||
|
|
||||||
|
// The Git Data API (blobs/trees/commits) answers 409 "Git Repository is
|
||||||
|
// empty" on a repo with no commits — it cannot bootstrap an empty repo.
|
||||||
|
// Ensure main exists first via the Contents API, then chain onto it.
|
||||||
|
let parents: string[] = [];
|
||||||
|
try {
|
||||||
|
const ref = await gh<{ object: { sha: string } }>(token, 'GET', `/repos/${login}/${repoName}/git/ref/heads/main`);
|
||||||
|
parents = [ref.object.sha];
|
||||||
|
} catch {
|
||||||
|
await gh(token, 'PUT', `/repos/${login}/${repoName}/contents/README.md`, {
|
||||||
|
message: 'bootstrap',
|
||||||
|
content: Buffer.from(generatedReadme(manifest)).toString('base64'),
|
||||||
|
branch: 'main',
|
||||||
|
});
|
||||||
|
const ref = await gh<{ object: { sha: string } }>(token, 'GET', `/repos/${login}/${repoName}/git/ref/heads/main`);
|
||||||
|
parents = [ref.object.sha];
|
||||||
|
}
|
||||||
|
|
||||||
type TreeEntry = { path: string; mode: '100644'; type: 'blob'; sha: string };
|
type TreeEntry = { path: string; mode: '100644'; type: 'blob'; sha: string };
|
||||||
const tree: TreeEntry[] = [];
|
const tree: TreeEntry[] = [];
|
||||||
for (const rel of files) {
|
for (const rel of files) {
|
||||||
|
|
@ -189,24 +206,13 @@ async function pushSource(token: string, login: string, repoName: string, folder
|
||||||
|
|
||||||
const treeRes = await gh<{ sha: string }>(token, 'POST', `/repos/${login}/${repoName}/git/trees`, { tree });
|
const treeRes = await gh<{ sha: string }>(token, 'POST', `/repos/${login}/${repoName}/git/trees`, { tree });
|
||||||
|
|
||||||
// Parent-less commit for an empty repo; otherwise chain onto main.
|
|
||||||
let parents: string[] = [];
|
|
||||||
try {
|
|
||||||
const ref = await gh<{ object: { sha: string } }>(token, 'GET', `/repos/${login}/${repoName}/git/ref/heads/main`);
|
|
||||||
parents = [ref.object.sha];
|
|
||||||
} catch { /* empty repo */ }
|
|
||||||
|
|
||||||
const commit = await gh<{ sha: string }>(token, 'POST', `/repos/${login}/${repoName}/git/commits`, {
|
const commit = await gh<{ sha: string }>(token, 'POST', `/repos/${login}/${repoName}/git/commits`, {
|
||||||
message: `Publish ${manifest.name} v${version}`,
|
message: `Publish ${manifest.name} v${version}`,
|
||||||
tree: treeRes.sha,
|
tree: treeRes.sha,
|
||||||
parents,
|
parents,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (parents.length) {
|
await gh(token, 'PATCH', `/repos/${login}/${repoName}/git/refs/heads/main`, { sha: commit.sha, force: false });
|
||||||
await gh(token, 'PATCH', `/repos/${login}/${repoName}/git/refs/heads/main`, { sha: commit.sha, force: false });
|
|
||||||
} else {
|
|
||||||
await gh(token, 'POST', `/repos/${login}/${repoName}/git/refs`, { ref: 'refs/heads/main', sha: commit.sha });
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function uploadAsset(token: string, uploadUrlBase: string, name: string, data: Buffer, contentType: string): Promise<void> {
|
async function uploadAsset(token: string, uploadUrlBase: string, name: string, data: Buffer, contentType: string): Promise<void> {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue