refactor: 条目记录的工厂搬进模块(manifest 的 schema 有了唯一落点)
New-ItemRecord 是纯工厂:我先用正则扫过它读了哪些外部状态 —— 一处都没有,输入全在参数里,只有一个 Get-Date。所以这是"有状态核心"里唯一可以零判断搬走的一块。 搬走并改名 New-BakNRetItemRecord,同时补上字段说明:这个有序哈希就是 manifest 每个条目的 schema。它原先藏在 Backup.ps1 里,于是"manifest 条目长什么样"这件事只有一个隐式落点;恢复端与工具脚本读的也是同一份 schema,改字段时漏掉某一侧的风险就出在这里。 新增一条断言把这个 schema 钉住:26 个字段的名字与**顺序**逐项比对(顺序是 manifest diff 可读性的前提),另外断言 attemptedAt 每次现取 —— 后者是"把它误写成模块加载时的常量"这种错唯一能被发现的地方。 验收:test.ps1 9/9 全绿(7 与 5.1)、104 个文件两版解析零错、真实清单只读冒烟 4/4。Backup.ps1 从 920 行降到 889 行。
This commit is contained in:
1 parent
67ee2af006
commit
319ec1da78
5 files changed
+72
-34
No files matched your search
+3
-34
@@ -182,37 +182,6 @@ if ($freeSpaceGB -ge 0) {
|
||||
}
|
||||
|
||||
|
||||
function New-ItemRecord {
|
||||
param([string]$BaseName, [string]$Source, [string]$ResolvedSource, [string]$Phase)
|
||||
return [ordered]@{
|
||||
baseName = $BaseName
|
||||
source = $Source
|
||||
resolvedSource = $ResolvedSource
|
||||
roots = @()
|
||||
layouts = @()
|
||||
catalog = $null
|
||||
archive = $null
|
||||
action = $null
|
||||
reason = $null
|
||||
phase = $Phase
|
||||
attemptedAt = (Get-Date).ToString('o')
|
||||
finishedAt = $null
|
||||
durationSec = $null
|
||||
exitCode = $null
|
||||
verified = $false
|
||||
warnings = $false
|
||||
attemptWarnings = $false
|
||||
encrypted = $false
|
||||
security = $null
|
||||
sourceFiles = $null
|
||||
sourceBytes = $null
|
||||
archiveBytes = $null
|
||||
sha256 = $null
|
||||
lastSuccessAt = $null
|
||||
successCount = 0
|
||||
failCount = 0
|
||||
}
|
||||
}
|
||||
|
||||
function Save-ItemRecord {
|
||||
param($Record, [string]$Action, [string]$Reason, [bool]$ArchiveWarnings = $false)
|
||||
@@ -523,7 +492,7 @@ foreach ($line in $lines) {
|
||||
$resolved = Resolve-BakNRetBackupEntry -Entry $item -CatalogPath $catalogPath
|
||||
|
||||
if (-not $resolved.BaseName) {
|
||||
$record = New-ItemRecord -BaseName ('raw:' + $displayPath) -Source $displayPath -ResolvedSource $displayPath -Phase 'parse'
|
||||
$record = New-BakNRetItemRecord -BaseName ('raw:' + $displayPath) -Source $displayPath -ResolvedSource $displayPath -Phase 'parse'
|
||||
Save-ItemRecord -Record $record -Action 'failed' -Reason '无法生成归档名' | Out-Null
|
||||
$failed++; $failures += $displayPath
|
||||
continue
|
||||
@@ -543,7 +512,7 @@ foreach ($line in $lines) {
|
||||
if ($seenBaseNames.ContainsKey($baseName)) {
|
||||
$reason = "归档名 '$baseName' 与清单中的 '$($seenBaseNames[$baseName])' 重复(由 '$displayPath' 生成),两者会互相覆盖"
|
||||
Write-BakNRetLog "失败: $displayPath,$reason" -Level ERROR
|
||||
$record = New-ItemRecord -BaseName $baseName -Source $displayPath -ResolvedSource $sourcePath -Phase 'backup'
|
||||
$record = New-BakNRetItemRecord -BaseName $baseName -Source $displayPath -ResolvedSource $sourcePath -Phase 'backup'
|
||||
Save-ItemRecord -Record $record -Action 'failed' -Reason $reason | Out-Null
|
||||
$failed++; $failures += $displayPath
|
||||
continue
|
||||
@@ -555,7 +524,7 @@ foreach ($line in $lines) {
|
||||
continue
|
||||
}
|
||||
|
||||
$record = New-ItemRecord -BaseName $baseName -Source $displayPath -ResolvedSource $sourcePath -Phase 'backup'
|
||||
$record = New-BakNRetItemRecord -BaseName $baseName -Source $displayPath -ResolvedSource $sourcePath -Phase 'backup'
|
||||
$record.archive = $baseName + $tool.Extension
|
||||
if ($resolved.CatalogEntry) { $record.catalog = $resolved.CatalogEntry.Path }
|
||||
$finalPath = Join-Path $BackupDir $record.archive
|
||||
|
||||
Reference in new issue
Block a user