From 980e28a79f8473c4ce48b87cd7f837513e646fe1 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 20 Jun 2014 12:35:56 -0700 Subject: [PATCH] Updated kvm.ps1 --- build/kvm.ps1 | 129 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 102 insertions(+), 27 deletions(-) diff --git a/build/kvm.ps1 b/build/kvm.ps1 index dc3d21cdd4..3bc6e82d8d 100644 --- a/build/kvm.ps1 +++ b/build/kvm.ps1 @@ -1,9 +1,11 @@ param( [parameter(Position=0)] [string] $command, + [string] $proxy, [switch] $verbosity = $false, [alias("g")][switch] $global = $false, [alias("p")][switch] $persistent = $false, + [alias("f")][switch] $force = $false, [switch] $x86 = $false, [switch] $x64 = $false, [switch] $svr50 = $false, @@ -16,6 +18,12 @@ $userKrePath = $env:USERPROFILE + "\.kre" $userKrePackages = $userKrePath + "\packages" $globalKrePath = $env:ProgramFiles + "\KRE" $globalKrePackages = $globalKrePath + "\packages" +$feed = $env:KRE_NUGET_API_URL + +if (!$feed) +{ + $feed = "https://www.myget.org/F/aspnetvnext/api/v2"; +} $scriptPath = $myInvocation.MyCommand.Definition @@ -25,16 +33,19 @@ K Runtime Environment Version Manager - Build {{BUILD_NUMBER}} USAGE: kvm [options] -kvm upgrade [-x86][-x64] [-svr50][-svrc50] [-g|-global] +kvm upgrade [-x86][-x64] [-svr50][-svrc50] [-g|-global] [-proxy
] install latest KRE from feed set 'default' alias to installed version - add KRE bin to user PATH environment variable persistently + add KRE bin to user PATH environment variable -g|-global install to machine-wide location + -f|-force upgrade even if latest is already installed + -proxy
use given address as proxy when accessing remote server kvm install || [-x86][-x64] [-svr50][-svrc50] [-g|-global] install requested KRE from feed add KRE bin to path of current command line -g|-global install to machine-wide location + -f|-force install even if specified version is already installed kvm use ||none [-x86][-x64] [-svr50][-svrc50] [-p|-persistent] [-g|-global] | add KRE bin to path of current command line @@ -121,6 +132,25 @@ function Kvm-Upgrade { Kvm-Alias-Set "default" $version } +function Add-Proxy-If-Specified { +param( + [System.Net.WebClient] $wc +) + if (!$proxy) { + $proxy = $env:http_proxy + } + if ($proxy) { + $wp = New-Object System.Net.WebProxy($proxy) + $pb = New-Object UriBuilder($proxy) + if (!$pb.UserName) { + $wp.Credentials = [System.Net.CredentialCache]::DefaultCredentials + } else { + $wp.Credentials = New-Object System.Net.NetworkCredential($pb.UserName, $pb.Password) + } + $wc.Proxy = $wp + } +} + function Kvm-Find-Latest { param( [string] $platform, @@ -128,10 +158,11 @@ param( ) Write-Host "Determining latest version" - $url = "https://www.myget.org/F/aspnetvnext/api/v2/GetUpdates()?packageIds=%27KRE-$platform-$architecture%27&versions=%270.0%27&includePrerelease=true&includeAllVersions=false" + $url = "$feed/GetUpdates()?packageIds=%27KRE-$platform-$architecture%27&versions=%270.0%27&includePrerelease=true&includeAllVersions=false" $wc = New-Object System.Net.WebClient $wc.Credentials = new-object System.Net.NetworkCredential("aspnetreadonly", "4d8a2d9c-7b80-4162-9978-47e918c9658c") + Add-Proxy-If-Specified($wc) [xml]$xml = $wc.DownloadString($url) $version = Select-Xml "//d:Version" -Namespace @{d='http://schemas.microsoft.com/ado/2007/08/dataservices'} $xml @@ -146,27 +177,46 @@ function Kvm-Install-Latest { function Do-Kvm-Download { param( [string] $kreFullName, - [string] $kreFolder + [string] $packagesFolder ) $parts = $kreFullName.Split(".", 2) - $url = "https://www.myget.org/F/aspnetvnext/api/v2/package/" + $parts[0] + "/" + $parts[1] - $kreFile = "$kreFolder\$kreFullName.nupkg" + $url = "$feed/package/" + $parts[0] + "/" + $parts[1] + $kreFolder = Join-Path $packagesFolder $kreFullName + $kreFile = Join-Path $kreFolder "$kreFullName.nupkg" If (Test-Path $kreFolder) { - Write-Host "$kreFullName already installed." - return; + if($force) + { + rm $kreFolder -Recurse -Force + } else { + Write-Host "$kreFullName already installed." + return; + } } Write-Host "Downloading" $kreFullName "from https://www.myget.org/F/aspnetvnext/api/v2/" - md $kreFolder -Force | Out-Null + #Downloading to temp location + $kreTempDownload = Join-Path $packagesFolder "temp" + $tempKreFile = Join-Path $kreTempDownload "$kreFullName.nupkg" + + if(Test-Path $kreTempDownload) { + del "$kreTempDownload\*" -recurse + } else { + md $kreTempDownload -Force | Out-Null + } $wc = New-Object System.Net.WebClient $wc.Credentials = new-object System.Net.NetworkCredential("aspnetreadonly", "4d8a2d9c-7b80-4162-9978-47e918c9658c") - $wc.DownloadFile($url, $kreFile) + Add-Proxy-If-Specified($wc) + $wc.DownloadFile($url, $tempKreFile) - Do-Kvm-Unpack $kreFile $kreFolder + Do-Kvm-Unpack $tempKreFile $kreTempDownload + + md $kreFolder -Force | Out-Null + Write-Host "Installing to $kreFolder" + mv "$kreTempDownload\*" $kreFolder } function Do-Kvm-Unpack { @@ -174,11 +224,22 @@ param( [string] $kreFile, [string] $kreFolder ) - Write-Host "Installing to" $kreFolder - - [System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem') | Out-Null - [System.IO.Compression.ZipFile]::ExtractToDirectory($kreFile, $kreFolder) - + Write-Host "Unpacking to" $kreFolder + try { + #Shell will not recognize nupkg as a zip and throw, so rename it to zip + $kreZip = [System.IO.Path]::ChangeExtension($kreFile, "zip") + Rename-Item $kreFile $kreZip + #Use the shell to uncompress the nupkg + $shell_app=new-object -com shell.application + $zip_file = $shell_app.namespace($kreZip) + $destination = $shell_app.namespace($kreFolder) + $destination.Copyhere($zip_file.items(), 0x14) #0x4 = don't show UI, 0x10 = overwrite files + } + finally { + #make it a nupkg again + Rename-Item $kreZip $kreFile + } + If (Test-Path ($kreFolder + "\[Content_Types].xml")) { Remove-Item ($kreFolder + "\[Content_Types].xml") } @@ -202,8 +263,8 @@ param( } $kreFullName = Requested-VersionOrAlias $versionOrAlias - $kreFolder = "$globalKrePackages\$kreFullName" - Do-Kvm-Download $kreFullName $kreFolder + + Do-Kvm-Download $kreFullName $globalKrePackages Kvm-Use $versionOrAlias } @@ -215,14 +276,30 @@ param( { $kreFullName = [System.IO.Path]::GetFileNameWithoutExtension($versionOrAlias) $kreFolder = "$userKrePackages\$kreFullName" - $kreFile = "$kreFolder\$kreFullName.nupkg" + $folderExists = Test-Path $kreFolder - if (Test-Path($kreFolder)) { - Write-Host "Target folder '$kreFolder' already exists" + if($folderExists -and $force) { + del $kreFolder -Recurse -Force + $folderExists = $false; + } + + if($folderExists) { + Write-Host "Target folder '$kreFolder' already exists" } else { - md $kreFolder -Force | Out-Null - copy $versionOrAlias $kreFile - Do-Kvm-Unpack $kreFile $kreFolder + $tempUnpackFolder = Join-Path $userKrePackages "temp" + $tempKreFile = Join-Path $tempUnpackFolder "$kreFullName.nupkg" + + if(Test-Path $tempUnpackFolder) { + del "$tempUnpackFolder\*" -recurse + } else { + md $tempUnpackFolder -Force | Out-Null + } + copy $versionOrAlias $tempKreFile + + Do-Kvm-Unpack $tempKreFile $tempUnpackFolder + md $kreFolder -Force | Out-Null + Write-Host "Installing to $kreFolder" + mv "$tempUnpackFolder\*" $kreFolder } $kreBin = "$kreFolder\bin" @@ -233,9 +310,7 @@ param( { $kreFullName = Requested-VersionOrAlias $versionOrAlias - $kreFolder = "$userKrePackages\$kreFullName" - - Do-Kvm-Download $kreFullName $kreFolder + Do-Kvm-Download $kreFullName $userKrePackages Kvm-Use $versionOrAlias } }