functions/Compare-StagingConfig.ps1

[cmdletbinding]
function Get-ConfigFile(
[string] $Path = "."
) {
    $configname = "web.config"
    
    if (!(test-path (join-path $path $configname))) {
        $files = gci $Path -Filter "*.exe.config" | ? { $_.Name -notlike "*.vshost.exe.config" }
        if ($files -ne $null) {
            $configname = $files[0].Name
            write-verbose "Chosen config $configname for path $((get-item $path).FullName)"
        }
    }    
    if (!(test-path (Join-Path $path $configname))) {
        write-verbose "config $configname not found for path $((get-item $path).FullName)"
        return $null
    }
    return (get-item (Join-Path $path $configname))
}

function Get-RemoteFile($path, $session) {
    $content = icm -Session $Session { 
            param($Path, $enc) 
            if ($enc -ne $null) { 
                write-host "using encoding: $enc"
                # [Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding($enc)
            }
            write-host "getting '$($path)'"            
            Get-Content ($path) -Encoding UTF8 | out-string 
            write-host "getting '$($path)' DONE"
    } `
      -ArgumentList $Path,$([Console]::OutputEncoding.bodyname)
    return $content
}

[cmdletbinding]
function Compare-StagingConfig(
[string] $Path = ".",
[string] $stagingdir = $null,
[System.Management.Automation.Runspaces.PSSession] $Session = $null
) {
    write-host "comparing staging config at '$path', session $session"
    $projectName = split-path -leaf $Path
    if ($projectName -match [regex]"(.*)-staging") {
        $projectName = $Matches[1]
    }

    if ([string]::IsNullOrEmpty($stagingDir)) {
        $stagingDir = "$Path\..\$projectName-staging"
    }

    if ($Session -ne $null) {

        if ($Path -eq ".") {
            $projectName = icm -Session $Session { param($Path) split-path -leaf $Path } -ArgumentList $Path
            $stagingDir = "$Path\..\$projectName-staging"
        }
        if ($path -eq $null) {
            throw "path cannot be null"
        }
        if ($stagingDir -eq $null) {
            throw "stagingdir cannot be null"
        }

        $configname = icm -Session $Session { 
            param($Path) 
            import-module require
            req beam.serverside
            (Get-ConfigFile $Path).Name 
        } -ArgumentList $Path
        if ($configname -eq $null) {
            throw "could not determine config file in path '$path'"
        }
        Write-Host "downloading file $(join-path $path $configname)"
        $currentCfg = Get-RemoteFile -path (join-path $path $configname) -session $session
        Write-Host "downloading file $(join-path $stagingDir $configname)"
        $stagingCfg = Get-RemoteFile -path (join-path $stagingDir $configname) -session $session

        $currentPath =  (join-path $env:TEMP "current.config")
        $stagingPath = (join-path $env:TEMP "staging.config")
        $currentCfg | Out-File $currentPath 
        $stagingCfg | Out-File $stagingPath 

        write-host "running kdiff"
        if ($promptpreference -ne "SilentlyContinue") {
            $exitCode = start-executable kdiff3 @($currentPath, $stagingPath)
        }
    }
    else {        
        $configname = Get-ConfigFile $Path
        if ($configname -ne $null) {
            if ($promptpreference -ne "SilentlyContinue") {
                $exitCode = start-executable kdiff3 @((join-path $path $configname.Name), (join-path $stagingDir $configname.Name))
            }
        }
        else {
            write-host "no config file found in $path"
        }
    }

    
    write-host "cmd exit code=$LASTEXITCODE. result=$exitCode"
}