LifePlay-Revival/Tools/Snapshot.ps1
edujiro5972 1122e17fa6 L0 : etat initial du projet 5.5 avant toute correction
Instantane de reference de la reprise de migration (2026-09-29).
Contient GI.uasset tel que trouve (copie UE4 identique a 4.27,
MD5 F4550DA5DC05FC005400CDCA2FC123C9). Ajouts de ce commit :
.gitattributes (aucune conversion de fin de ligne), regles .gitignore
CHG-001, Tools/ (Snapshot, Restore, AssetHeaders), empreintes L0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 00:56:10 +02:00

63 lines
2.7 KiB
PowerShell

<#
.SYNOPSIS
Copie de sauvegarde des fichiers qu'un lot de migration va modifier.
.DESCRIPTION
Copie chaque fichier vers <BackupRoot>\<Lot>\<chemin relatif> et consigne
son empreinte dans <BackupRoot>\<Lot>\manifest.csv. Un fichier deja present
dans le manifeste n'est jamais recopie : la premiere sauvegarde d'un lot est
l'etat de reference que Restore.ps1 remet en place.
Un chemin qui n'existe pas encore est consigne avec Existed=False : la
restauration le retirera (deplacement, jamais suppression definitive).
.EXAMPLE
.\Tools\Snapshot.ps1 -Lot L1 -Path Content\BPs\GI.uasset, Config\DefaultEngine.ini
.\Tools\Snapshot.ps1 -Lot L4 -Path Content\UI -Recurse
#>
param(
[Parameter(Mandatory)][string]$Lot,
[Parameter(Mandatory)][string[]]$Path,
[switch]$Recurse,
[string]$ProjectRoot = (Split-Path $PSScriptRoot -Parent),
[string]$BackupRoot = 'D:\Game\LifePlay_Backup_5.5'
)
$ErrorActionPreference = 'Stop'
$lotDir = Join-Path $BackupRoot $Lot
$manifest = Join-Path $lotDir 'manifest.csv'
New-Item -ItemType Directory -Force $lotDir | Out-Null
$known = @{}
if (Test-Path $manifest) { Import-Csv $manifest | ForEach-Object { $known[$_.Rel] = $true } }
# Liste des fichiers relatifs a traiter
$rels = foreach ($p in $Path) {
$full = Join-Path $ProjectRoot $p
if (Test-Path $full -PathType Container) {
$items = if ($Recurse) { Get-ChildItem $full -File -Recurse -Force } else { Get-ChildItem $full -File -Force }
$items | ForEach-Object { $_.FullName.Substring($ProjectRoot.TrimEnd('\').Length + 1) }
} else {
$p -replace '^\.\\', ''
}
}
$rows = @()
foreach ($rel in $rels) {
if ($known.ContainsKey($rel)) { Write-Host "deja sauvegarde : $rel"; continue }
$src = Join-Path $ProjectRoot $rel
if (Test-Path $src -PathType Leaf) {
$dst = Join-Path $lotDir $rel
New-Item -ItemType Directory -Force (Split-Path $dst -Parent) | Out-Null
Copy-Item -LiteralPath $src -Destination $dst -Force
$h1 = (Get-FileHash -LiteralPath $src -Algorithm MD5).Hash
$h2 = (Get-FileHash -LiteralPath $dst -Algorithm MD5).Hash
if ($h1 -ne $h2) { throw "Copie corrompue : $rel" }
$rows += [pscustomobject]@{ Rel = $rel; Existed = $true; Size = (Get-Item -LiteralPath $src).Length; MD5 = $h1; Date = (Get-Date -Format s) }
Write-Host "sauvegarde : $rel ($h1)"
} else {
$rows += [pscustomobject]@{ Rel = $rel; Existed = $false; Size = 0; MD5 = ''; Date = (Get-Date -Format s) }
Write-Host "absent (sera retire a la restauration) : $rel"
}
}
if ($rows.Count) { $rows | Export-Csv $manifest -NoTypeInformation -Append -Encoding UTF8 }
Write-Host "$($rows.Count) entree(s) ajoutee(s) a $manifest"