Files
ARCADIA-Studio/harness/experiments/scenario-validation-focused-b10b28c-20260913/original/binary-inputs.ps1
T

21 lines
1.2 KiB
PowerShell

# Pure file/log readers. No executable is started by these helpers.
function Get-GateBinary([string]$Path,[string]$Target) {
$resolved=[IO.Path]::GetFullPath($Path)
$root=[IO.Path]::GetFullPath($Target).TrimEnd('\','/')+[IO.Path]::DirectorySeparatorChar
if(-not $resolved.StartsWith($root,[StringComparison]::OrdinalIgnoreCase)){throw 'Executable path escapes the parent-owned target.'}
$item=Get-Item -LiteralPath $resolved
[ordered]@{path=$resolved;bytes=$item.Length;sha256=(Get-FileHash -LiteralPath $resolved -Algorithm SHA256).Hash.ToLowerInvariant();mtimeUtc=$item.LastWriteTimeUtc.ToString('o')}
}
function Get-GateTestBinaries([string]$Log,[string]$Target) {
$paths=@([regex]::Matches($Log,'(?m)^\s*Running unittests .+? \(([^\r\n]+\.exe)\)\s*$')|ForEach-Object {$_.Groups[1].Value}|Sort-Object -Unique)
foreach($path in $paths){Get-GateBinary $path $Target}
}
function Same-GateBinaries($Left,$Right) {
$a=@($Left|Sort-Object path);$b=@($Right|Sort-Object path)
if($a.Count -eq 0 -or $a.Count -ne $b.Count){return $false}
for($i=0;$i -lt $a.Count;$i++){
if($a[$i].path -ine $b[$i].path -or $a[$i].bytes -ne $b[$i].bytes -or $a[$i].sha256 -cne $b[$i].sha256){return $false}
}
return $true
}