# deploy-bruno-t12.ps1 - ticket 12g: copy staging tree into docs repo (conflict precheck + copy + verify + ledger) $ErrorActionPreference = 'Stop' $src = 'e:\code\crm-backend-matt\.scratch\a7-parity\t12-bru' $dst = 'E:\code\crm-api-docs' $files = Get-ChildItem -LiteralPath $src -Recurse -File -Filter '*.bru' Write-Output ("source files: {0}" -f $files.Count) # 1. conflict precheck: any same-name file already in docs repo -> abort (never overwrite silently) $conflicts = @() foreach ($f in $files) { $rel = $f.FullName.Substring($src.Length).TrimStart('\') $target = Join-Path $dst $rel if (Test-Path -LiteralPath $target) { $conflicts += $rel } } if ($conflicts.Count -gt 0) { Write-Output ("ABORT: {0} target files already exist:" -f $conflicts.Count) $conflicts | ForEach-Object { Write-Output (" {0}" -f $_) } exit 1 } # 2. copy (create parent dirs as needed) $copied = 0 foreach ($f in $files) { $rel = $f.FullName.Substring($src.Length).TrimStart('\') $target = Join-Path $dst $rel $targetDir = Split-Path -Parent $target if (-not (Test-Path -LiteralPath $targetDir)) { New-Item -ItemType Directory -Path $targetDir -Force | Out-Null } Copy-Item -LiteralPath $f.FullName -Destination $target -Force $copied++ } # 3. verify: exists + byte size matches source $errors = @() foreach ($f in $files) { $rel = $f.FullName.Substring($src.Length).TrimStart('\') $target = Join-Path $dst $rel if (-not (Test-Path -LiteralPath $target)) { $errors += ("missing: {0}" -f $rel); continue } if ((Get-Item -LiteralPath $target).Length -ne $f.Length) { $errors += ("size-mismatch: {0}" -f $rel) } } Write-Output ("copied={0} errors={1}" -f $copied, $errors.Count) $errors | ForEach-Object { Write-Output ("ERR {0}" -f $_) } if ($errors.Count -gt 0) { exit 1 }