diff --git a/tools-sync/scripts/sync_repos.ps1 b/tools-sync/scripts/sync_repos.ps1 index acca70d..f96b575 100644 --- a/tools-sync/scripts/sync_repos.ps1 +++ b/tools-sync/scripts/sync_repos.ps1 @@ -69,13 +69,27 @@ if (-not $DryRun) { Write-Host "=== [2/2] mirror: $CodexSkills ===" if (-not (Test-Path $CodexSkills)) { New-Item -ItemType Directory -Force $CodexSkills | Out-Null } -if (-not (Test-Path (Join-Path $CodexSkills ".git"))) { +# Bootstrap is needed when there's no repo yet, or a previous bootstrap died before +# origin/main ever arrived (init succeeded, fetch didn't). +$needBootstrap = -not (Test-Path (Join-Path $CodexSkills ".git")) +if (-not $needBootstrap) { + $r = Invoke-Git $CodexSkills @("rev-parse", "--verify", "--quiet", "refs/remotes/origin/$Branch") + if ($r.Code -ne 0) { $needBootstrap = $true } +} + +if ($needBootstrap) { Write-Host "bootstrapping mirror as a checkout of $RepoUrl" if ($DryRun) { Write-Host "(dry-run) would git init + fetch + align to origin/$Branch"; exit 0 } Invoke-Git $CodexSkills @("init") | Out-Null Invoke-Git $CodexSkills @("remote", "add", "origin", $RepoUrl) | Out-Null $r = Invoke-Git $CodexSkills @("fetch", "origin", $Branch) - if ($r.Code -ne 0) { Write-Host $r.Out; Fail "fetch failed during bootstrap." } + if ($r.Code -ne 0) { + # Flaky server on a full first fetch is common; the primary checkout already + # holds every object locally, so borrow them from disk instead. + Write-Host "server fetch failed, retrying from local primary checkout..." + $r = Invoke-Git $CodexSkills @("fetch", $ClaudeSkills, "+refs/heads/${Branch}:refs/remotes/origin/$Branch") + if ($r.Code -ne 0) { Write-Host $r.Out; Fail "fetch failed during bootstrap (server and local)." } + } # Point index at origin/main without touching files, so status shows local-vs-repo drift. Invoke-Git $CodexSkills @("reset", "origin/$Branch") | Out-Null Invoke-Git $CodexSkills @("branch", "-f", $Branch, "origin/$Branch") | Out-Null