Initial commit to new repository
This commit is contained in:
90
scripts/check-encoding.ps1
Normal file
90
scripts/check-encoding.ps1
Normal file
@@ -0,0 +1,90 @@
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[string]$Root = ""
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
if ([string]::IsNullOrWhiteSpace($Root)) {
|
||||
$basePath = if ($PSScriptRoot) {
|
||||
$PSScriptRoot
|
||||
}
|
||||
elseif ($PSCommandPath) {
|
||||
Split-Path -Parent $PSCommandPath
|
||||
}
|
||||
else {
|
||||
(Get-Location).Path
|
||||
}
|
||||
|
||||
$Root = (Resolve-Path (Join-Path $basePath "..")).Path
|
||||
}
|
||||
|
||||
$extensions = @(".cs", ".xaml", ".csproj", ".props", ".targets", ".sln", ".json", ".md", ".txt", ".xml", ".yml", ".yaml", ".ps1")
|
||||
$utf8Bom = New-Object byte[] 3
|
||||
$utf8Bom[0] = 0xEF
|
||||
$utf8Bom[1] = 0xBB
|
||||
$utf8Bom[2] = 0xBF
|
||||
|
||||
$scanRoots = @(
|
||||
(Join-Path $Root "src"),
|
||||
(Join-Path $Root "scripts")
|
||||
) | Where-Object { Test-Path $_ }
|
||||
|
||||
$files = New-Object System.Collections.Generic.List[System.IO.FileInfo]
|
||||
foreach ($scanRoot in $scanRoots) {
|
||||
Get-ChildItem -Path $scanRoot -Recurse -File |
|
||||
Where-Object { $extensions -contains $_.Extension.ToLowerInvariant() } |
|
||||
Where-Object { $_.FullName -notmatch '\\(bin|obj|\.git|\.decompiled|\.decompiledproj|src2|dist|\.tools)\\' } |
|
||||
Where-Object { $_.Name -notlike '*.bak-*' } |
|
||||
Where-Object { $_.Name -notlike '*.broken' } |
|
||||
ForEach-Object { $files.Add($_) }
|
||||
}
|
||||
|
||||
$rootFiles = @(".editorconfig", ".gitattributes", "README.md", "AxCopilot.sln", "CLAUDE.md")
|
||||
foreach ($relativePath in $rootFiles) {
|
||||
$fullPath = Join-Path $Root $relativePath
|
||||
if (Test-Path $fullPath) {
|
||||
$files.Add((Get-Item $fullPath))
|
||||
}
|
||||
}
|
||||
|
||||
$problems = New-Object System.Collections.Generic.List[object]
|
||||
|
||||
foreach ($file in $files) {
|
||||
$bytes = [System.IO.File]::ReadAllBytes($file.FullName)
|
||||
if ($bytes.Length -lt 3) {
|
||||
$problems.Add([pscustomobject]@{
|
||||
File = $file.FullName
|
||||
Issue = "too-short-to-confirm-bom"
|
||||
})
|
||||
continue
|
||||
}
|
||||
|
||||
$hasBom = $bytes[0] -eq $utf8Bom[0] -and $bytes[1] -eq $utf8Bom[1] -and $bytes[2] -eq $utf8Bom[2]
|
||||
if (-not $hasBom) {
|
||||
$problems.Add([pscustomobject]@{
|
||||
File = $file.FullName
|
||||
Issue = "missing-utf8-bom"
|
||||
})
|
||||
continue
|
||||
}
|
||||
|
||||
try {
|
||||
$null = [System.Text.Encoding]::UTF8.GetString($bytes, 3, $bytes.Length - 3)
|
||||
}
|
||||
catch {
|
||||
$problems.Add([pscustomobject]@{
|
||||
File = $file.FullName
|
||||
Issue = "invalid-utf8-content"
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
if ($problems.Count -eq 0) {
|
||||
Write-Host "Encoding check passed. All scanned files use UTF-8 BOM."
|
||||
exit 0
|
||||
}
|
||||
|
||||
Write-Host "Encoding check found issues:" -ForegroundColor Yellow
|
||||
$problems | Sort-Object File | Format-Table -AutoSize
|
||||
exit 1
|
||||
Reference in New Issue
Block a user