69 lines
1.6 KiB
PowerShell
69 lines
1.6 KiB
PowerShell
#!/usr/bin/env pwsh
|
|
# fix-sln-duplicates.ps1 - Remove duplicate project entries from solution file
|
|
|
|
param(
|
|
[string]$SlnPath = "src/StellaOps.sln"
|
|
)
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
|
|
Write-Host "=== Solution Duplicate Cleanup ===" -ForegroundColor Cyan
|
|
Write-Host "Solution: $SlnPath"
|
|
|
|
$content = Get-Content $SlnPath -Raw
|
|
$lines = $content -split "`r?`n"
|
|
|
|
# Track seen project names
|
|
$seenProjects = @{}
|
|
$duplicateGuids = @()
|
|
$newLines = @()
|
|
$skipNext = $false
|
|
|
|
for ($i = 0; $i -lt $lines.Count; $i++) {
|
|
$line = $lines[$i]
|
|
|
|
if ($skipNext) {
|
|
$skipNext = $false
|
|
continue
|
|
}
|
|
|
|
# Check for project declaration
|
|
if ($line -match 'Project\(.+\) = "([^"]+)",.*\{([A-F0-9-]+)\}"?$') {
|
|
$name = $Matches[1]
|
|
$guid = $Matches[2]
|
|
|
|
if ($seenProjects.ContainsKey($name)) {
|
|
Write-Host "Removing duplicate: $name ($guid)" -ForegroundColor Yellow
|
|
$duplicateGuids += $guid
|
|
# Skip this line and the next EndProject line
|
|
$skipNext = $true
|
|
continue
|
|
} else {
|
|
$seenProjects[$name] = $true
|
|
}
|
|
}
|
|
|
|
$newLines += $line
|
|
}
|
|
|
|
# Remove GlobalSection references to duplicate GUIDs
|
|
$finalLines = @()
|
|
foreach ($line in $newLines) {
|
|
$skip = $false
|
|
foreach ($guid in $duplicateGuids) {
|
|
if ($line -match $guid) {
|
|
$skip = $true
|
|
break
|
|
}
|
|
}
|
|
if (-not $skip) {
|
|
$finalLines += $line
|
|
}
|
|
}
|
|
|
|
# Write back
|
|
$finalLines -join "`r`n" | Set-Content $SlnPath -Encoding UTF8 -NoNewline
|
|
|
|
Write-Host ""
|
|
Write-Host "Removed $($duplicateGuids.Count) duplicate projects" -ForegroundColor Green
|