refactor: 公共面补 BakNRet 前缀,产品名大小写全仓统一
16 个没有前缀的公共函数补上 BakNRet(Write-Log → Write-BakNRetLog、Resolve-BackupEntry → Resolve-BakNRetBackupEntry、Find-ChildDirectoryByName → Find-BakNRetChildDirectoryByName 等), 另外把全仓的 Baknret 统一成 BakNRet(47 个文件、940 处、65 个定义文件重命名)。 这不是审美问题:静态分析直接拓出一条实据 —— Write-Log 与本机某个已装模块导出的命令 **重名**(PSAvoidOverwritingBuiltInCmdlets),而重名的后果是导入两个模块时有一方的命令被 静默遮蔽。补前缀正是这条规则的解法,改名后它归零。 为什么敢做这个规模:PowerShell 的函数名解析大小写不敏感,所以 Baknret → BakNRet 在功能 上是零风险;真正要验证的是 16 个补前缀的调用点,而 276 个断言几乎覆盖了每个函数。另外 "名字与文件名一致"这条不变式有断言盯着(加载器点源的文件集合 vs 磁盘)。 踩到并记下的坑:Windows 文件系统大小写不敏感,所以**只改大小写**的重命名会被 Move-Item 当成同一个文件而静默跳过 —— 同一批里同时改了名字的那 16 个文件却成功了,于是"看起来能跑"。 最后用"先移到临时名、再移到目标名"的两步走解决,判断与替换全部改用显式大小写敏感的形式 (-creplace / -cmatch)。 顺带把名录指纹缓存从 MD5 换成 SHA256(PSAvoidUsingBrokenHashAlgorithms):它只是缓存键, 没有兼容负担。 验收:test.ps1 9/9 全绿(7 与 5.1)、100 个文件两版解析零错、276 个断言全过、 构建工具仍能合回单文件(3300 行)。
This commit is contained in:
1 parent
187d2759fd
commit
42f02d0eca
84 files changed
+1043
-1043
No files matched your search
@@ -37,7 +37,7 @@ BeforeAll {
|
||||
|
||||
# 见 BakNRet.Tests.ps1 里的说明:本机沙箱禁止 PowerShell 为捕获原生子进程输出建管道,
|
||||
# 所以走"临时 .cmd + 文件重定向 + Invoke-ExternalCommand(继承 stdio)"这条路。
|
||||
function Invoke-BaknretScript {
|
||||
function Invoke-BakNRetScript {
|
||||
param(
|
||||
[Parameter(Mandatory = $true)][string]$Script,
|
||||
[hashtable]$Parameters = @{}
|
||||
@@ -138,7 +138,7 @@ Describe '软件名录:Slot 形状(新契约)' {
|
||||
}
|
||||
|
||||
It '一个软件多个 Slot:Kind=Multi,Slot 按名排序且说明被保留' {
|
||||
$catalog = Get-SoftwareCatalog -Path $script:FormatCatalog -MaxDepth 3 -NoCache
|
||||
$catalog = Get-BakNRetSoftwareCatalog -Path $script:FormatCatalog -MaxDepth 3 -NoCache
|
||||
$catalog['pair'].Kind | Should -Be 'Multi'
|
||||
@($catalog['pair'].Slots).Count | Should -Be 2
|
||||
(@($catalog['pair'].Slots | ForEach-Object { $_.Name }) -join ',') | Should -Be 'A,B'
|
||||
@@ -150,7 +150,7 @@ Describe '软件名录:Slot 形状(新契约)' {
|
||||
|
||||
It '每个 Slot 都是一个独立的归档项来源(Kind=slot / Origin=catalog)' {
|
||||
$entry = ConvertFrom-BackupListLine -Line 'pair'
|
||||
$resolved = Resolve-BackupEntry -Entry $entry -CatalogPath $script:FormatCatalog -MaxDepth 3
|
||||
$resolved = Resolve-BakNRetBackupEntry -Entry $entry -CatalogPath $script:FormatCatalog -MaxDepth 3
|
||||
@($resolved.Items).Count | Should -Be 2
|
||||
(@($resolved.Items | ForEach-Object { $_.ArchivePath }) -join ',') | Should -Be 'A,B'
|
||||
(@($resolved.Items | ForEach-Object { $_.Kind }) -join ',') | Should -Be 'slot,slot'
|
||||
@@ -161,22 +161,22 @@ Describe '软件名录:Slot 形状(新契约)' {
|
||||
}
|
||||
|
||||
It 'Slot 级排除写在 Slot 自己身上(相对本 Slot 的归档根)' {
|
||||
$catalog = Get-SoftwareCatalog -Path $script:FormatCatalog -MaxDepth 3 -NoCache
|
||||
$catalog = Get-BakNRetSoftwareCatalog -Path $script:FormatCatalog -MaxDepth 3 -NoCache
|
||||
(@($catalog['slotex'].Slots[0].Exclude) -join '|') | Should -Be '!*Cache|logs\'
|
||||
|
||||
$entry = ConvertFrom-BackupListLine -Line 'slotex'
|
||||
$resolved = Resolve-BackupEntry -Entry $entry -CatalogPath $script:FormatCatalog -MaxDepth 3
|
||||
$resolved = Resolve-BakNRetBackupEntry -Entry $entry -CatalogPath $script:FormatCatalog -MaxDepth 3
|
||||
(@($resolved.Items[0].Exclude) -join '|') | Should -Be '!*Cache|logs\'
|
||||
$resolved.HasExcludeOverride | Should -BeFalse
|
||||
}
|
||||
|
||||
It '数组里"当前不存在"的 Slot 仍然产出归档项(恢复要靠它还原回原位)' {
|
||||
$catalog = Get-SoftwareCatalog -Path $script:FormatCatalog -MaxDepth 3 -NoCache
|
||||
$catalog = Get-BakNRetSoftwareCatalog -Path $script:FormatCatalog -MaxDepth 3 -NoCache
|
||||
$catalog['partial'].Kind | Should -Be 'Partial'
|
||||
@($catalog['partial'].Missing) | Should -Contain $script:MissingDir
|
||||
|
||||
$entry = ConvertFrom-BackupListLine -Line 'partial'
|
||||
$resolved = Resolve-BackupEntry -Entry $entry -CatalogPath $script:FormatCatalog -MaxDepth 3
|
||||
$resolved = Resolve-BakNRetBackupEntry -Entry $entry -CatalogPath $script:FormatCatalog -MaxDepth 3
|
||||
@($resolved.Items).Count | Should -Be 2
|
||||
@($resolved.Items | ForEach-Object { $_.RealPath }) | Should -Contain $script:MissingDir
|
||||
$resolved.Blocking | Should -BeNullOrEmpty # 源不存在不是致命错误
|
||||
@@ -184,7 +184,7 @@ Describe '软件名录:Slot 形状(新契约)' {
|
||||
|
||||
It '文件 Slot:归档项是文件项(归档里就是名为 Slot 的文件)' {
|
||||
$entry = ConvertFrom-BackupListLine -Line 'fileapp'
|
||||
$resolved = Resolve-BackupEntry -Entry $entry -CatalogPath $script:FormatCatalog -MaxDepth 3
|
||||
$resolved = Resolve-BakNRetBackupEntry -Entry $entry -CatalogPath $script:FormatCatalog -MaxDepth 3
|
||||
@($resolved.Items).Count | Should -Be 1
|
||||
$resolved.Items[0].IsFile | Should -BeTrue
|
||||
$resolved.Items[0].ArchivePath | Should -Be 'Cfg'
|
||||
@@ -193,13 +193,13 @@ Describe '软件名录:Slot 形状(新契约)' {
|
||||
}
|
||||
|
||||
It '旧的裸字符串 / 字符串数组写法被拒绝(ERROR + 跳过)' {
|
||||
$catalog = Get-SoftwareCatalog -Path $script:FormatCatalog -MaxDepth 3 -NoCache
|
||||
$catalog = Get-BakNRetSoftwareCatalog -Path $script:FormatCatalog -MaxDepth 3 -NoCache
|
||||
$catalog.ContainsKey('legacystr') | Should -BeFalse
|
||||
$catalog.ContainsKey('legacyarr') | Should -BeFalse
|
||||
}
|
||||
|
||||
It '旧的 @{ Dirs = @(...) } 写法不再展开,留下 Invalid 与原因' {
|
||||
$catalog = Get-SoftwareCatalog -Path $script:FormatCatalog -MaxDepth 3 -NoCache
|
||||
$catalog = Get-BakNRetSoftwareCatalog -Path $script:FormatCatalog -MaxDepth 3 -NoCache
|
||||
$catalog.ContainsKey('legacydirs') | Should -BeTrue
|
||||
$catalog['legacydirs'].Kind | Should -Be 'Invalid'
|
||||
$catalog['legacydirs'].Error | Should -Not -BeNullOrEmpty
|
||||
@@ -208,7 +208,7 @@ Describe '软件名录:Slot 形状(新契约)' {
|
||||
|
||||
It '多 Slot 的名录条目在清单里仍然按软件名命名归档' {
|
||||
$entry = ConvertFrom-BackupListLine -Line 'pair'
|
||||
(Get-ItemArchiveName -Entry $entry -CatalogPath $script:FormatCatalog -MaxDepth 3) | Should -Be 'pair'
|
||||
(Get-BakNRetItemArchiveName -Entry $entry -CatalogPath $script:FormatCatalog -MaxDepth 3) | Should -Be 'pair'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -227,7 +227,7 @@ Describe '清单修饰符:新契约格式' {
|
||||
It ':: 覆盖 Path:单 Slot 条目直接生效' {
|
||||
$entry = ConvertFrom-BackupListLine -Line "solo :: $script:DirB"
|
||||
$entry.Overrides.ContainsKey('Path') | Should -BeTrue
|
||||
$resolved = Resolve-BackupEntry -Entry $entry -CatalogPath $script:FormatCatalog -MaxDepth 3
|
||||
$resolved = Resolve-BakNRetBackupEntry -Entry $entry -CatalogPath $script:FormatCatalog -MaxDepth 3
|
||||
@($resolved.Items).Count | Should -Be 1
|
||||
$resolved.Items[0].ArchivePath | Should -Be 'Only'
|
||||
$resolved.Items[0].RealPath | Should -Be $script:DirB
|
||||
@@ -236,7 +236,7 @@ Describe '清单修饰符:新契约格式' {
|
||||
|
||||
It ':: 覆盖遇到多 Slot 条目 -> Blocking(不知道给哪一个,绝不猜)' {
|
||||
$entry = ConvertFrom-BackupListLine -Line "pair :: $script:DirB"
|
||||
$resolved = Resolve-BackupEntry -Entry $entry -CatalogPath $script:FormatCatalog -MaxDepth 3
|
||||
$resolved = Resolve-BakNRetBackupEntry -Entry $entry -CatalogPath $script:FormatCatalog -MaxDepth 3
|
||||
@($resolved.Items).Count | Should -Be 0
|
||||
$resolved.Blocking | Should -Match '不能用一个'
|
||||
}
|
||||
@@ -246,7 +246,7 @@ Describe '清单修饰符:新契约格式' {
|
||||
(@($entry.ExcludePatterns) -join '|') | Should -Be 'logs\|!*Cache'
|
||||
(@($entry.Includes) -join '|') | Should -Be "Mods:$script:DirB"
|
||||
|
||||
$resolved = Resolve-BackupEntry -Entry $entry -CatalogPath $script:FormatCatalog -MaxDepth 3
|
||||
$resolved = Resolve-BakNRetBackupEntry -Entry $entry -CatalogPath $script:FormatCatalog -MaxDepth 3
|
||||
$resolved.HasExcludeOverride | Should -BeTrue
|
||||
$resolved.HasIncludeOverride | Should -BeTrue
|
||||
@($resolved.Items | ForEach-Object { $_.ArchivePath }) | Should -Contain 'Mods'
|
||||
@@ -261,13 +261,13 @@ Describe '清单修饰符:新契约格式' {
|
||||
}
|
||||
|
||||
It ':encrypt / :!encrypt 覆盖名录里的加密默认值' {
|
||||
$base = Resolve-BackupEntry -Entry (ConvertFrom-BackupListLine -Line 'fileapp') -CatalogPath $script:FormatCatalog -MaxDepth 3
|
||||
$base = Resolve-BakNRetBackupEntry -Entry (ConvertFrom-BackupListLine -Line 'fileapp') -CatalogPath $script:FormatCatalog -MaxDepth 3
|
||||
$base.Encrypt | Should -BeTrue # 名录里 Cfg Slot 标了 Encrypt
|
||||
|
||||
$off = Resolve-BackupEntry -Entry (ConvertFrom-BackupListLine -Line 'fileapp :!encrypt') -CatalogPath $script:FormatCatalog -MaxDepth 3
|
||||
$off = Resolve-BakNRetBackupEntry -Entry (ConvertFrom-BackupListLine -Line 'fileapp :!encrypt') -CatalogPath $script:FormatCatalog -MaxDepth 3
|
||||
$off.Encrypt | Should -BeFalse
|
||||
|
||||
$on = Resolve-BackupEntry -Entry (ConvertFrom-BackupListLine -Line 'pair :encrypt') -CatalogPath $script:FormatCatalog -MaxDepth 3
|
||||
$on = Resolve-BakNRetBackupEntry -Entry (ConvertFrom-BackupListLine -Line 'pair :encrypt') -CatalogPath $script:FormatCatalog -MaxDepth 3
|
||||
$on.Encrypt | Should -BeTrue
|
||||
}
|
||||
|
||||
@@ -278,8 +278,8 @@ Describe '清单修饰符:新契约格式' {
|
||||
|
||||
# @pathname 对软件名条目也会改用真实路径命名
|
||||
$entry = ConvertFrom-BackupListLine -Line 'pair @pathname'
|
||||
$expected = Get-BackupBaseName -RawPath $script:DirA
|
||||
(Get-ItemArchiveName -Entry $entry -CatalogPath $script:FormatCatalog -MaxDepth 3) | Should -Be $expected
|
||||
$expected = Get-BakNRetBackupBaseName -RawPath $script:DirA
|
||||
(Get-BakNRetItemArchiveName -Entry $entry -CatalogPath $script:FormatCatalog -MaxDepth 3) | Should -Be $expected
|
||||
}
|
||||
|
||||
It '同一行里重复写同类记号会累积(不静默丢掉前一条规则)' {
|
||||
@@ -350,14 +350,14 @@ Describe '集成:Slot 布局的打包与恢复' -Skip:(-not ($script:HasSevenZ
|
||||
$script:SlotList = Write-ListFile -Path (Join-Path $script:SlotRoot 'list.txt') -Content "appkit`n"
|
||||
$script:SlotBackupDir = Join-Path $script:SlotRoot 'Backups'
|
||||
|
||||
$script:SlotBackupRun = Invoke-BaknretScript -Script $script:BackupScript -Parameters @{
|
||||
$script:SlotBackupRun = Invoke-BakNRetScript -Script $script:BackupScript -Parameters @{
|
||||
BackupListPath = $script:SlotList
|
||||
BackupDir = $script:SlotBackupDir
|
||||
ConfigPath = $script:SlotConfig
|
||||
Force = $true
|
||||
QuietTool = $true
|
||||
}
|
||||
$script:SlotManifest = Read-BaknretManifest -Path (Join-Path $script:SlotBackupDir 'manifest.json')
|
||||
$script:SlotManifest = Read-BakNRetManifest -Path (Join-Path $script:SlotBackupDir 'manifest.json')
|
||||
$script:SlotArchive = @(Get-ChildItem -LiteralPath $script:SlotBackupDir -File -Filter *.7z)[0]
|
||||
}
|
||||
|
||||
@@ -367,7 +367,7 @@ Describe '集成:Slot 布局的打包与恢复' -Skip:(-not ($script:HasSevenZ
|
||||
}
|
||||
|
||||
It '归档顶层就是各个 Slot 名(目录 Slot + 文件 Slot + Include 项)' {
|
||||
$top = @(Get-ArchiveTopLevelNames -ArchivePath $script:SlotArchive.FullName -SevenZip $script:SevenZip)
|
||||
$top = @(Get-BakNRetArchiveTopLevelNames -ArchivePath $script:SlotArchive.FullName -SevenZip $script:SevenZip)
|
||||
(@($top | Sort-Object) -join ',') | Should -Be 'Cfg,Data,Extra,Modules'
|
||||
}
|
||||
|
||||
@@ -396,7 +396,7 @@ Describe '集成:Slot 布局的打包与恢复' -Skip:(-not ($script:HasSevenZ
|
||||
Remove-Item -LiteralPath (Join-Path $script:SlotRoot 'apps') -Recurse -Force
|
||||
Remove-Item -LiteralPath $script:SlotInclude -Recurse -Force
|
||||
|
||||
$run = Invoke-BaknretScript -Script $script:RestoreScript -Parameters @{
|
||||
$run = Invoke-BakNRetScript -Script $script:RestoreScript -Parameters @{
|
||||
BackupListPath = $script:SlotList
|
||||
BackupDir = $script:SlotBackupDir
|
||||
ConfigPath = $script:SlotConfig
|
||||
@@ -422,7 +422,7 @@ Describe '集成:Slot 布局的打包与恢复' -Skip:(-not ($script:HasSevenZ
|
||||
}
|
||||
|
||||
It '恢复之后 manifest 记下 lastRestoreAt' {
|
||||
$manifest = Read-BaknretManifest -Path (Join-Path $script:SlotBackupDir 'manifest.json')
|
||||
$manifest = Read-BakNRetManifest -Path (Join-Path $script:SlotBackupDir 'manifest.json')
|
||||
$manifest.items['appkit'].lastRestoreAt | Should -Not -BeNullOrEmpty
|
||||
}
|
||||
}
|
||||
@@ -462,7 +462,7 @@ Describe '集成:旧布局归档的回退恢复' -Skip:(-not ($script:HasSeven
|
||||
}
|
||||
|
||||
It '归档确实是旧布局:顶层是源目录名而不是 Slot 名' {
|
||||
$top = @(Get-ArchiveTopLevelNames -ArchivePath $script:LegacyArchive -SevenZip $script:SevenZip)
|
||||
$top = @(Get-BakNRetArchiveTopLevelNames -ArchivePath $script:LegacyArchive -SevenZip $script:SevenZip)
|
||||
(@($top | Sort-Object) -join ',') | Should -Be $script:LegacyLeaf
|
||||
}
|
||||
|
||||
@@ -471,7 +471,7 @@ Describe '集成:旧布局归档的回退恢复' -Skip:(-not ($script:HasSeven
|
||||
# 不能靠 7z 的退出码猜(7z 对不存在的条目同样返回 0)。
|
||||
Remove-Item -LiteralPath (Join-Path $script:LegacyDestParent $script:LegacyLeaf) -Recurse -Force -ErrorAction SilentlyContinue
|
||||
|
||||
$run = Invoke-BaknretScript -Script $script:RestoreScript -Parameters @{
|
||||
$run = Invoke-BakNRetScript -Script $script:RestoreScript -Parameters @{
|
||||
BackupListPath = $script:LegacyList
|
||||
BackupDir = $script:LegacyBackupDir
|
||||
ConfigPath = $script:LegacyConfig
|
||||
@@ -490,7 +490,7 @@ Describe '集成:旧布局归档的回退恢复' -Skip:(-not ($script:HasSeven
|
||||
$missingList = Write-ListFile -Path (Join-Path $script:LegacyRoot 'missing-list.txt') `
|
||||
-Content "oldapp :: $script:LegacyRoot\dest2\Nothing Here`n"
|
||||
|
||||
$run = Invoke-BaknretScript -Script $script:RestoreScript -Parameters @{
|
||||
$run = Invoke-BakNRetScript -Script $script:RestoreScript -Parameters @{
|
||||
BackupListPath = $missingList
|
||||
BackupDir = $script:LegacyBackupDir
|
||||
ConfigPath = $script:LegacyConfig
|
||||
@@ -522,7 +522,7 @@ Describe '集成:归档内路径冲突会被拒绝执行' -Skip:(-not ($script
|
||||
$script:RejectConfig = Write-ListFile -Path (Join-Path $script:RejectRoot 'config.psd1') -Content "@{ SoftwareCatalog = '$script:RejectCatalog' }`n"
|
||||
$script:RejectBackupDir = Join-Path $script:RejectRoot 'Backups'
|
||||
|
||||
$script:RejectRun = Invoke-BaknretScript -Script $script:BackupScript -Parameters @{
|
||||
$script:RejectRun = Invoke-BakNRetScript -Script $script:BackupScript -Parameters @{
|
||||
BackupListPath = $script:RejectList
|
||||
BackupDir = $script:RejectBackupDir
|
||||
ConfigPath = $script:RejectConfig
|
||||
@@ -538,7 +538,7 @@ Describe '集成:归档内路径冲突会被拒绝执行' -Skip:(-not ($script
|
||||
}
|
||||
|
||||
It 'manifest 里记下这次是 failed,并带上原因' {
|
||||
$manifest = Read-BaknretManifest -Path (Join-Path $script:RejectBackupDir 'manifest.json')
|
||||
$manifest = Read-BakNRetManifest -Path (Join-Path $script:RejectBackupDir 'manifest.json')
|
||||
$record = $manifest.items['collide']
|
||||
$record.action | Should -Be 'failed'
|
||||
$record.reason | Should -Match '归档内路径冲突'
|
||||
@@ -568,7 +568,7 @@ Describe '条目从清单里消失后,旧归档必须被点名为孤儿' -Skip
|
||||
|
||||
# 第一次:清单里有 my-app
|
||||
Write-ListFile -Path $script:OrphanList -Content "my-app`n" | Out-Null
|
||||
$null = Invoke-BaknretScript -Script $script:BackupScript -Parameters @{
|
||||
$null = Invoke-BakNRetScript -Script $script:BackupScript -Parameters @{
|
||||
BackupListPath = $script:OrphanList
|
||||
BackupDir = $script:OrphanBackupDir
|
||||
ConfigPath = $script:OrphanConfig
|
||||
@@ -578,7 +578,7 @@ Describe '条目从清单里消失后,旧归档必须被点名为孤儿' -Skip
|
||||
|
||||
# 第二次:把条目从清单里拿掉,归档留在磁盘上
|
||||
Write-ListFile -Path $script:OrphanList -Content "# 清单里没有条目了`n" | Out-Null
|
||||
$script:OrphanRun = Invoke-BaknretScript -Script $script:BackupScript -Parameters @{
|
||||
$script:OrphanRun = Invoke-BakNRetScript -Script $script:BackupScript -Parameters @{
|
||||
BackupListPath = $script:OrphanList
|
||||
BackupDir = $script:OrphanBackupDir
|
||||
ConfigPath = $script:OrphanConfig
|
||||
@@ -588,7 +588,7 @@ Describe '条目从清单里消失后,旧归档必须被点名为孤儿' -Skip
|
||||
|
||||
It '归档确实还在磁盘上,manifest 里也还留着历史记录' {
|
||||
Test-Path -LiteralPath (Join-Path $script:OrphanBackupDir 'my-app.7z') | Should -BeTrue
|
||||
$manifest = Read-BaknretManifest -Path (Join-Path $script:OrphanBackupDir 'manifest.json')
|
||||
$manifest = Read-BakNRetManifest -Path (Join-Path $script:OrphanBackupDir 'manifest.json')
|
||||
$manifest.items.Contains('my-app') | Should -BeTrue
|
||||
}
|
||||
|
||||
@@ -610,16 +610,16 @@ Describe 'manifest 一致性:archive 字段只在文件真的存在时才写'
|
||||
Set-Content -Encoding UTF8 -LiteralPath (Join-Path $script:SyncRoot 'real.7z') 'x'
|
||||
|
||||
$script:SyncManifestPath = Join-Path $script:SyncRoot 'manifest.json'
|
||||
$manifest = Read-BaknretManifest -Path $script:SyncManifestPath
|
||||
$manifest = Read-BakNRetManifest -Path $script:SyncManifestPath
|
||||
$manifest.items['real'] = [pscustomobject]@{ archive = 'real.7z'; action = 'backed-up'; source = 'real' }
|
||||
$manifest.items['gone'] = [pscustomobject]@{ archive = 'gone.7z'; action = 'missing-source'; source = 'gone' }
|
||||
$manifest.items['none'] = [pscustomobject]@{ archive = $null; action = 'missing-source'; source = 'none' }
|
||||
Write-BaknretManifest -Path $script:SyncManifestPath -Manifest $manifest | Out-Null
|
||||
Write-BakNRetManifest -Path $script:SyncManifestPath -Manifest $manifest | Out-Null
|
||||
}
|
||||
|
||||
It '存在的归档保留 archive,不存在的被清空' {
|
||||
$manifest = Read-BaknretManifest -Path $script:SyncManifestPath
|
||||
$cleared = Sync-BaknretManifestArchive -Manifest $manifest -BackupDir $script:SyncRoot
|
||||
$manifest = Read-BakNRetManifest -Path $script:SyncManifestPath
|
||||
$cleared = Sync-BakNRetManifestArchive -Manifest $manifest -BackupDir $script:SyncRoot
|
||||
|
||||
$cleared.Count | Should -Be 1
|
||||
$cleared[0] | Should -Be 'gone'
|
||||
@@ -629,16 +629,16 @@ Describe 'manifest 一致性:archive 字段只在文件真的存在时才写'
|
||||
}
|
||||
|
||||
It '清空 archive 时保留条目本身的历史(source / action 不动)' {
|
||||
$manifest = Read-BaknretManifest -Path $script:SyncManifestPath
|
||||
$null = Sync-BaknretManifestArchive -Manifest $manifest -BackupDir $script:SyncRoot
|
||||
$manifest = Read-BakNRetManifest -Path $script:SyncManifestPath
|
||||
$null = Sync-BakNRetManifestArchive -Manifest $manifest -BackupDir $script:SyncRoot
|
||||
$manifest.items['gone'].source | Should -Be 'gone'
|
||||
$manifest.items['gone'].action | Should -Be 'missing-source'
|
||||
}
|
||||
|
||||
It '人工删掉归档之后再同步一次,记录会被纠正过来' {
|
||||
Remove-Item -LiteralPath (Join-Path $script:SyncRoot 'real.7z') -Force
|
||||
$manifest = Read-BaknretManifest -Path $script:SyncManifestPath
|
||||
$cleared = Sync-BaknretManifestArchive -Manifest $manifest -BackupDir $script:SyncRoot
|
||||
$manifest = Read-BakNRetManifest -Path $script:SyncManifestPath
|
||||
$cleared = Sync-BakNRetManifestArchive -Manifest $manifest -BackupDir $script:SyncRoot
|
||||
|
||||
$cleared | Should -Contain 'real'
|
||||
$manifest.items['real'].archive | Should -BeNullOrEmpty
|
||||
|
||||
Reference in new issue
Block a user