ps/Modules/Alkami.PowerShell.Choco/Public/Remove-OrphanedChocoFolders.ps1

86 lines
4.2 KiB
PowerShell
Raw Normal View History

2023-05-30 22:51:22 -07:00
function Remove-OrphanedChocoFolders {
<#
.SYNOPSIS
Remove folders and files left behind by choco uninstall
.DESCRIPTION
Accepts either a package name or can search all packages to find choco packages with files left behind
.Notes
This funciton uses a parameter set for input parameters to determine if the function should crawl
all packages or inspect the folder of the package name provided
.EXAMPLE
This example Shows how to crawl all packages to look for orphaned folders
Remove-OrphanedChocoFolders -AllPackages
This example Shows how to specify a package name to inspect as an orphaned folder
Remove-OrphanedChocoFolders -PackageName "Alkami.ms.package.name"
#>
[cmdletbinding()]
param(
[Parameter(Mandatory = $true, ParameterSetName = "ByPackageName")]
[string]$PackageName,
[Parameter(Mandatory = $true, ParameterSetName = "ByAllPackages")]
[switch]$AllPackages
)
$logLead = Get-LogLeadName
if (($PSCmdlet.ParameterSetName -eq "ByAllPackages") -and ($AllPackages -ne $true)) {
Write-Error "$logLead : You supplied -AllPackages, but it was not true, check your calling code"
return
}
Write-Host "$logLead : Searching for orphaned choco folders"
$chocoInstallPath = Get-ChocolateyInstallPath
$chocoLibDirectory = Join-Path $chocoInstallPath "lib"
If ([string]::IsNullOrEmpty($chocoLibDirectory) ) {
# While this is a problem, we dont want to halt the deploy pipline for this, rather we will report a build statistic problem
Write-Warning "$loglead : choco lib directory to search was null, stopping"
Write-Host "##teamcity[buildStatisticValue key='FailedToRemoveOrphanedFolder' value='1']"
return
}
if ($PSCmdlet.ParameterSetName -eq "ByPackageName" ) {
if ([string]::IsNullOrEmpty($PackageName) -eq $false) {
Write-Host "$logLead : Checking $PackageName"
$packageDirectory = Join-Path -Path $chocoLibDirectory -ChildPath $PackageName
$packageFolderContents = Get-ChildItem -Path $chocoLibDirectory -Filter $PackageName -ErrorAction SilentlyContinue
if ($null -ne $packageFolderContents) {
Remove-FileSystemItem -Path $packageDirectory -Force
Write-Host "##teamcity[buildStatisticValue key='SuccesfullyRemovedOrphanedFolder' value='1']"
return
} else {
Write-Host "$loglead : No folder found to remove for path $packageDirectory"
return
}
} else {
Write-Host "$logLead : PacakgeName was null or empty, but you supplied the PackageName param"
Write-Host "##teamcity[buildStatisticValue key='FailedToRemoveOrphanedFolder' value='1']"
return
}
}
if (($PSCmdlet.ParameterSetName -eq "ByAllPackages") -and ( $AllPackages -eq $true)) {
Write-Host "$logLead : Checking all folders"
$chocoLibFolders = Get-ChildItem -Path $chocoLibDirectory -Directory -Exclude "chocolatey" # exclude the chocolatey folder
if ($null -eq $chocoLibFolders ) {
Write-Host "$logLead : No choco package folders found to search for missing nuspecs"
return
}
foreach ($chocoLibFolder in $chocoLibFolders) {
Write-Host "$loglead : Interogating $chocoLibFolder"
$nuspecPath = $null
$nuspecPath = Get-ChildItem -Path $chocoLibFolder.FullName -Filter "*.nuspec"
if ($null -eq $nuspecPath) {
Write-Warning "$logLead : Could not find nuspec for $chocoLibFolder"
try {
Remove-FileSystemItem -Path $chocoLibFolder -Force
Write-Host "##teamcity[buildStatisticValue key='SuccesfullyRemovedOrphanedFolder' value='1']"
} catch {
Write-Warning "$logLead : Unable to remove folder $chocoLibFolder"
Write-Warning $_
Write-Host "##teamcity[buildStatisticValue key='FailedToRemoveOrphanedFolder' value='1']"
}
} else {
Write-Host "$logLead : Found nuspec for $chocoLibFolder"
continue
}
}
}
}