Public/DotNet/Update-Symbols.ps1
function Update-Symbols { [CmdletBinding()] param ( [parameter(Mandatory, ValueFromPipeline)] [System.IO.FileInfo]$pdb, [parameter(Mandatory, ParameterSetName = "Default")] [string]$TargetRoot, [parameter(ParameterSetName = "Default")] [string]$SourcesRoot, [parameter(ParameterSetName = "Sources")] [string[]]$symbolSources, [parameter()] [string]$dbgToolsPath = "$PSScriptRoot\..\..\Private\srcsrv" ) begin { if (!(test-path $dbgToolsPath)) { throw "srcsrv is invalid" } if ($PSCmdlet.ParameterSetName -eq "Default") { $remoteTarget = ($TargetRoot -like "http*") } else { $remoteTarget = $symbolSources | Where-Object { $_ -match "trg: http*" } | Select-Object -First 1 } if (!$remoteTarget ) { if (!$SourcesRoot.EndsWith("\")) { $SourcesRoot += "\" } if (!$TargetRoot.EndsWith("\")) { $TargetRoot += "\" } } $list = New-Object System.Collections.ArrayList $pdbstrPath = "$dbgToolsPath\pdbstr.exe" } process { $list.Add($pdb) | Out-Null } end { Write-Verbose "Indexing $($list.count) pdb files" # $list | Invoke-Parallel -ActivityName Indexing -VariablesToImport @("dbgToolsPath", "TargetRoot", "SourcesRoot", "remoteTarget") -Script { $list | foreach { Write-Host "Indexing $($_.FullName) ..." $streamPath = [System.IO.Path]::GetTempFileName() Write-Verbose "Preparing stream header section..." Add-Content -value "SRCSRV: ini ------------------------------------------------" -path $streamPath Add-Content -value "VERSION=1" -path $streamPath Add-Content -value "INDEXVERSION=2" -path $streamPath Add-Content -value "VERCTL=Archive" -path $streamPath Add-Content -value ("DATETIME=" + ([System.DateTime]::Now)) -path $streamPath Write-Verbose "Preparing stream variables section..." Add-Content -value "SRCSRV: variables ------------------------------------------" -path $streamPath if ($remoteTarget) { Add-Content -value "SRCSRVVERCTRL=http" -path $streamPath } Add-Content -value "SRCSRVTRG=%var2%" -path $streamPath Add-Content -value "SRCSRVCMD=" -path $streamPath Write-Verbose "Preparing stream source files section..." Add-Content -value "SRCSRV: source files ---------------------------------------" -path $streamPath if ($symbolSources) { $symbolSources | ForEach-Object { $regex = [regex] '(?i)\[([^\]]*)] trg: (.*)' $m = $regex.Match($_) $src = $m.Groups[1].Value $trg = $m.Groups[2].Value if ($src -and $trg) { $result = "$src*$trg"; Add-Content -value $result -path $streamPath Write-Verbose "Indexing to $result" } } } else { $sources = & "$dbgToolsPath\srctool.exe" -r $_.FullName | Select-Object -SkipLast 1 if ($sources) { foreach ($src in $sources) { $target = "$src*$TargetRoot$src" if ($remoteTarget) { $file = "$src".replace($SourcesRoot, '').Trim("\").replace("\", "/") $target = "$src*$TargetRoot/$file" } Add-Content -value $target -path $streamPath Write-Verbose "Indexing $src to $target" } } else { Write-Host "No steppable code in pdb file $_" -f Red } } Add-Content -value "SRCSRV: end ------------------------------------------------" -path $streamPath Write-Verbose "Saving the generated stream into the $_ file..." & $pdbstrPath -w -s:srcsrv "-p:$($_.Fullname)" "-i:$streamPath" Remove-Item $streamPath } } } |