Skip to content

Instantly share code, notes, and snippets.

@BrandonBrowning
Created October 8, 2014 22:27
Show Gist options
  • Save BrandonBrowning/a17ddbaa0a597e169432 to your computer and use it in GitHub Desktop.
Save BrandonBrowning/a17ddbaa0a597e169432 to your computer and use it in GitHub Desktop.
pkgconf - NuGet package.config fragmentation evaluator
$ErrorActionPreference = "Stop"
$dict_type = "system.collections.generic.dictionary"
$set_type = "system.collections.generic.hashset"
# project -> package id -> version
$projectToPackageVersion = @{}
# package id -> version -> project
$packageToVersionToProjects = @{}
$configResults = Get-ChildItem -Filter packages.config -Recurse
foreach ($configResult in $configResults) {
$configPath = $configResult.FullName
$project = $configResult.Directory.Name
$contents = [IO.File]::ReadAllText($configPath)
$projectToPackageVersion[$project] = @{}
$contents | Select-Xml '//package' | %{
$packageId = $_.Node.id
$version = $_.Node.version
if (-not $packageToVersionToProjects.ContainsKey($packageId)) {
$packageToVersionToProjects[$packageId] = @{}
}
if (-not $packageToVersionToProjects[$packageId].ContainsKey($version)) {
$packageToVersionToProjects[$packageId][$version] = New-Object "$set_type[string]"
}
$packageToVersionToProjects[$packageId][$version].Add($project) | Out-Null
$projectToPackageVersion[$project][$packageId] = $version
}
}
foreach ($packageId in $packageToVersionToProjects.Keys | Sort-Object) {
$versionToProjects = $packageToVersionToProjects[$packageId]
$versions = $versionToProjects.Keys
$versionToCount = @{}
$versionToProjects.GetEnumerator() | %{
$versionToCount[$_.Key] = $_.Value.Count
}
if ($versions.Count -gt 1) {
$packageId | Write-Host -ForegroundColor "Magenta"
foreach ($version in $versions | Sort-Object) {
$versionCount = $versionToCount[$version]
$mostUsedVersion = $true
$versionToCount.GetEnumerator() | ?{
$_.Key -ne $version
} | ?{
$_.Value -ge $versionCount
} | %{
$mostUsedVersion = $false
}
if ($mostUsedVersion) {
" ($version)" | Write-Host -ForegroundColor "Cyan"
} else {
" $version" | Write-Host -ForegroundColor "White"
foreach ($project in $versionToProjects[$version]) {
$packageToVersion = $projectToPackageVersion[$project]
if ($packageToVersion.ContainsKey($packageId)) {
$packageVersion = $packageToVersion[$packageId]
if ($packageVersion -eq $version) {
" $project" | Write-Host
}
}
}
}
}
Write-Host ""
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment