Files
ctbjrj/tools/扒图同步检查.ps1
T

86 lines
4.0 KiB
PowerShell

# ============================================================
# 扒图同步检查.ps1 —— Cad/Pdf 扒图窗口 Form3.cs 漂移护栏
# ============================================================
# 背景: 扒图\Cad\Form3.cs 与 扒图\Pdf\Form3.cs 是约 98% 重复的双胞胎文件
# (物理合并被 SD 设计器"项目内自定义类型"死结阻挡,2026-10-01 决策维持双文件)。
# 历史上 Pdf 侧修复漏同步回 Cad(AdgvMsgHook 右键多选保持 / F1 合并防抖),
# 本脚本防止再次漂移。
# 原理: 两文件做字面映射归一化(CadBridge→PdfBridge / cadbt→pdfbt / CAD→PDF /
# namespace MyApp→MyAppPdf)后 git diff,差异行数不超过基线即 PASS。
# 用法: powershell -ExecutionPolicy Bypass -File tools\扒图同步检查.ps1
# 加 -UpdateBaseline 把当前差异量定为新基线(确认属合法演进后使用)。
# ============================================================
param([switch]$UpdateBaseline)
$ErrorActionPreference = 'Stop'
$root = Split-Path -Parent $PSScriptRoot
$cadPath = Join-Path $root '成套报价软件\扒图\Cad\Form3.cs'
$pdfPath = Join-Path $root '成套报价软件\扒图\Pdf\Form3.cs'
$baseline = Join-Path $PSScriptRoot '扒图同步基线.txt'
# ★ 2026-10-01 扩充:从只查 Form3.cs 扩展到全部 Cad/Pdf 双胞胎文件对
# (新建项目.cs 与两对 Designer/ui.cs 此前是漂移盲区)
$pairs = @(
@('成套报价软件\扒图\Cad\Form3.cs', '成套报价软件\扒图\Pdf\Form3.cs'),
@('成套报价软件\扒图\Cad\新建项目.cs', '成套报价软件\扒图\Pdf\新建项目.cs'),
@('成套报价软件\扒图\Cad\Form3.ui.cs', '成套报价软件\扒图\Pdf\Form3.Designer.cs'),
@('成套报价软件\扒图\Cad\新建项目.ui.cs', '成套报价软件\扒图\Pdf\新建项目.Designer.cs')
)
foreach ($p in $pairs) {
foreach ($f in @((Join-Path $root $p[0]), (Join-Path $root $p[1]))) {
if (-not (Test-Path $f)) { Write-Host "[FAIL] 缺少文件: $f" -ForegroundColor Red; exit 2 }
}
}
function Normalize([string]$path) {
(Get-Content $path -Encoding UTF8) | ForEach-Object {
$_ = $_ -creplace '^namespace MyApp\s*$', 'namespace MyAppPdf'
$_ = $_ -creplace 'CadBridge', 'PdfBridge'
$_ = $_ -creplace 'cadbt', 'pdfbt'
$_ = $_ -creplace 'CAD', 'PDF'
$_
}
}
$tmpCad = Join-Path $env:TEMP 'baotu_cad_norm.cs'
$tmpPdf = Join-Path $env:TEMP 'baotu_pdf_norm.cs'
$diffFile = Join-Path $env:TEMP 'baotu_drift.diff'
$added = 0; $deleted = 0
"" | Out-File $diffFile -Encoding UTF8
foreach ($p in $pairs) {
$cadF = Join-Path $root $p[0]; $pdfF = Join-Path $root $p[1]
Normalize $cadF | Set-Content $tmpCad -Encoding UTF8
Normalize $pdfF | Set-Content $tmpPdf -Encoding UTF8
$null = git diff --no-index --unified=1 $tmpCad $tmpPdf 2>$null | Out-File $diffFile -Append -Encoding UTF8
$numstat = git diff --no-index --numstat $tmpCad $tmpPdf 2>$null
if ($numstat) {
$parts = (@($numstat)[0]) -split "`t"
if ($parts.Count -ge 2) { $added += [int]$parts[0]; $deleted += [int]$parts[1] }
}
}
$drift = $added + $deleted
if ($UpdateBaseline) {
Set-Content $baseline -Value $drift -Encoding ASCII
Write-Host "[OK] 基线已更新为 $drift 行差异 (完整差异: $diffFile)"
exit 0
}
if (-not (Test-Path $baseline)) {
Write-Host "[FAIL] 缺少基线文件 $baseline ,请先跑一次 -UpdateBaseline 生成" -ForegroundColor Red
exit 2
}
$limit = [int](Get-Content $baseline -TotalCount 1)
Write-Host ("扒图 Cad/Pdf 归一化差异: {0} 行 (基线上限 {1} 行)" -f $drift, $limit)
if ($drift -gt $limit) {
Write-Host "[FAIL] 差异超过基线 —— 两文件已漂移!请排查:" -ForegroundColor Red
Write-Host " ① 是否一侧修了 bug 忘了同步另一侧?(最常见原因)"
Write-Host " ② 完整差异见: $diffFile"
Write-Host " ③ 确属合法演进后,用 -UpdateBaseline 刷新基线"
exit 1
}
Write-Host "[PASS] 同步状态正常"