diff --git a/scripts/Start-ShopDBDev.ps1 b/scripts/Start-ShopDBDev.ps1 index cbd25699..42b3b1a5 100644 --- a/scripts/Start-ShopDBDev.ps1 +++ b/scripts/Start-ShopDBDev.ps1 @@ -48,6 +48,40 @@ param( $ErrorActionPreference = 'Stop' +# Reset leftovers from an interrupted or timed-out prior run so the retry starts +# clean. Proxy bottlenecks can kill a build mid-flight, leaving orphaned +# containers holding the channel ports, dangling build cache from the partial +# build, and sometimes a half-written clone. This is scoped to the channel and +# is non-destructive to data: the compose down keeps named volumes (the DB), and +# only dangling build cache is pruned - never tagged images or volumes. +function Clear-InterruptedRun { + param( + [Parameter(Mandatory)][string]$Project, + [Parameter(Mandatory)][string]$Target + ) + + if (Get-Command docker -ErrorAction SilentlyContinue) { + # Only try compose down when the engine is actually responding, otherwise + # skip quietly - a fresh box may not have Docker started yet. + docker info *> $null + if ($LASTEXITCODE -eq 0) { + Write-Host "==> Cleaning up any interrupted '$Project' stack" -ForegroundColor Cyan + # --remove-orphans clears containers left by a killed build; volumes are + # intentionally kept so the DB survives a retry. + docker compose -p $Project down --remove-orphans *> $null + # Reclaim only dangling build cache from failed/partial builds. + docker builder prune -f *> $null + } + } + + # A directory that exists but has no valid .git is a broken/partial clone; + # remove it so the clone below can start fresh instead of failing. + if ((Test-Path $Target) -and -not (Test-Path (Join-Path $Target '.git'))) { + Write-Host "==> Removing incomplete clone at $Target" -ForegroundColor Cyan + Remove-Item -Path $Target -Recurse -Force + } +} + # Plain https URL. No token in the URL: Git Credential Manager injects the # stored GitHub credential for github.com, so clone/fetch authenticate against # the private repo without anything sensitive touching this script or disk. @@ -63,6 +97,9 @@ if (-not (Get-Command git -ErrorAction SilentlyContinue)) { throw 'git is required. Install Git for Windows (winget install Git.Git) and re-run.' } +$project = if ($Channel -eq 'edge') { 'shopdb-edge' } else { 'shopdb-stable' } +Clear-InterruptedRun -Project $project -Target $target + if (Test-Path (Join-Path $target '.git')) { Write-Host "==> Updating existing clone" -ForegroundColor Cyan git -C $target fetch origin $branch