Support/Package/Eigenverft.Manifested.Sandbox.Package.Shims.ps1
|
<#
Eigenverft.Manifested.Sandbox.Package.Shims #> $script:PackageCommandShimMarker = 'Eigenverft.Manifested.Sandbox Package Shim' function Get-PackageCommandShimFileName { [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string]$CommandName ) $safeName = $CommandName.Trim() foreach ($invalidChar in [System.IO.Path]::GetInvalidFileNameChars()) { $safeName = $safeName.Replace([string]$invalidChar, '-') } if ([string]::IsNullOrWhiteSpace($safeName)) { throw "Package shim command name '$CommandName' does not produce a valid shim file name." } if ($safeName.EndsWith('.cmd', [System.StringComparison]::OrdinalIgnoreCase)) { return $safeName } return "$safeName.cmd" } function Get-PackageCommandShimPath { [CmdletBinding()] param( [Parameter(Mandatory = $true)] [psobject]$PackageResult, [Parameter(Mandatory = $true)] [string]$CommandName ) if (-not $PackageResult.PackageConfig.PSObject.Properties['ShimDirectory'] -or [string]::IsNullOrWhiteSpace([string]$PackageResult.PackageConfig.ShimDirectory)) { throw 'Package shim registration requires PackageConfig.ShimDirectory.' } return [System.IO.Path]::GetFullPath((Join-Path ([string]$PackageResult.PackageConfig.ShimDirectory) (Get-PackageCommandShimFileName -CommandName $CommandName))) } function Get-PackageCommandShimMetadata { [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string]$ShimPath ) $fullShimPath = [System.IO.Path]::GetFullPath($ShimPath) if (-not (Test-Path -LiteralPath $fullShimPath -PathType Leaf)) { return [pscustomobject]@{ ShimPath = $fullShimPath Exists = $false IsPackageShim = $false DefinitionId = $null CommandName = $null TargetPath = $null } } $content = Get-Content -LiteralPath $fullShimPath -Raw -ErrorAction Stop $parsedMetadata = @{ definitionId = $null commandName = $null targetPath = $null } foreach ($line in ($content -split '\r?\n')) { $trimmedLine = $line.Trim() if ($trimmedLine -notmatch '^rem\s+(.+)$') { continue } $commentText = $Matches[1].Trim() foreach ($key in @('definitionId', 'commandName', 'targetPath')) { if ($commentText.StartsWith("$key=", [System.StringComparison]::OrdinalIgnoreCase)) { $parsedMetadata[$key] = $commentText.Substring($key.Length + 1) } } } return [pscustomobject]@{ ShimPath = $fullShimPath Exists = $true IsPackageShim = $content.Contains($script:PackageCommandShimMarker) DefinitionId = $parsedMetadata.definitionId CommandName = $parsedMetadata.commandName TargetPath = $parsedMetadata.targetPath } } function Test-PackageCommandShimOwnedByDefinition { [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string]$ShimPath, [Parameter(Mandatory = $true)] [string]$DefinitionId ) $shimMetadata = Get-PackageCommandShimMetadata -ShimPath $ShimPath return ($shimMetadata.IsPackageShim -and [string]::Equals([string]$shimMetadata.DefinitionId, $DefinitionId, [System.StringComparison]::OrdinalIgnoreCase)) } function New-PackageCommandShim { [CmdletBinding()] param( [Parameter(Mandatory = $true)] [psobject]$PackageResult, [Parameter(Mandatory = $true)] [string]$CommandName, [string]$InstallDirectoryOverride ) $baseInstallDirectory = if (-not [string]::IsNullOrWhiteSpace($InstallDirectoryOverride)) { $InstallDirectoryOverride } else { [string]$PackageResult.InstallDirectory } $targetPath = Resolve-PackageProvidedToolPath -Definition $PackageResult.PackageConfig.Definition -ToolKind 'commands' -Name $CommandName -InstallDirectory $baseInstallDirectory if ([string]::IsNullOrWhiteSpace($targetPath)) { throw "Package pathRegistration source shim '$CommandName' was not found in providedTools.commands." } if (-not (Test-Path -LiteralPath $targetPath -PathType Leaf)) { throw "Package shim target path '$targetPath' was not found." } $shimPath = Get-PackageCommandShimPath -PackageResult $PackageResult -CommandName $CommandName $definitionId = [string]$PackageResult.DefinitionId if ([string]::IsNullOrWhiteSpace($definitionId)) { $definitionId = [string]$PackageResult.PackageConfig.DefinitionId } if (Test-Path -LiteralPath $shimPath -PathType Leaf) { $shimMetadata = Get-PackageCommandShimMetadata -ShimPath $shimPath if (-not (Test-PackageCommandShimOwnedByDefinition -ShimPath $shimPath -DefinitionId $definitionId)) { if ($shimMetadata.IsPackageShim -and -not [string]::IsNullOrWhiteSpace([string]$shimMetadata.DefinitionId)) { throw "Package shim '$shimPath' is already owned by definition '$($shimMetadata.DefinitionId)' and cannot be overwritten by definition '$definitionId'." } throw "Package shim '$shimPath' already exists and is not owned by Package." } } $writtenShimPath = New-CommandShim -ShimPath $shimPath -TargetPath $targetPath -Overwrite -HeaderLines @( $script:PackageCommandShimMarker "definitionId=$definitionId" "commandName=$CommandName" "targetPath=$([System.IO.Path]::GetFullPath($targetPath))" ) Write-PackageExecutionMessage -Message ("[ACTION] Wrote command shim '{0}' -> '{1}'." -f $writtenShimPath, [System.IO.Path]::GetFullPath($targetPath)) return [pscustomobject]@{ CommandName = $CommandName ShimPath = $writtenShimPath TargetPath = [System.IO.Path]::GetFullPath($targetPath) } } |