Updated kvm.ps1

This commit is contained in:
David Fowler 2014-06-20 12:35:56 -07:00
parent 782e586c22
commit 980e28a79f
1 changed files with 102 additions and 27 deletions

View File

@ -1,9 +1,11 @@
param( param(
[parameter(Position=0)] [parameter(Position=0)]
[string] $command, [string] $command,
[string] $proxy,
[switch] $verbosity = $false, [switch] $verbosity = $false,
[alias("g")][switch] $global = $false, [alias("g")][switch] $global = $false,
[alias("p")][switch] $persistent = $false, [alias("p")][switch] $persistent = $false,
[alias("f")][switch] $force = $false,
[switch] $x86 = $false, [switch] $x86 = $false,
[switch] $x64 = $false, [switch] $x64 = $false,
[switch] $svr50 = $false, [switch] $svr50 = $false,
@ -16,6 +18,12 @@ $userKrePath = $env:USERPROFILE + "\.kre"
$userKrePackages = $userKrePath + "\packages" $userKrePackages = $userKrePath + "\packages"
$globalKrePath = $env:ProgramFiles + "\KRE" $globalKrePath = $env:ProgramFiles + "\KRE"
$globalKrePackages = $globalKrePath + "\packages" $globalKrePackages = $globalKrePath + "\packages"
$feed = $env:KRE_NUGET_API_URL
if (!$feed)
{
$feed = "https://www.myget.org/F/aspnetvnext/api/v2";
}
$scriptPath = $myInvocation.MyCommand.Definition $scriptPath = $myInvocation.MyCommand.Definition
@ -25,16 +33,19 @@ K Runtime Environment Version Manager - Build {{BUILD_NUMBER}}
USAGE: kvm <command> [options] USAGE: kvm <command> [options]
kvm upgrade [-x86][-x64] [-svr50][-svrc50] [-g|-global] kvm upgrade [-x86][-x64] [-svr50][-svrc50] [-g|-global] [-proxy <ADDRESS>]
install latest KRE from feed install latest KRE from feed
set 'default' alias to installed version 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 -g|-global install to machine-wide location
-f|-force upgrade even if latest is already installed
-proxy <ADDRESS> use given address as proxy when accessing remote server
kvm install <semver>|<alias>|<nupkg> [-x86][-x64] [-svr50][-svrc50] [-g|-global] kvm install <semver>|<alias>|<nupkg> [-x86][-x64] [-svr50][-svrc50] [-g|-global]
install requested KRE from feed install requested KRE from feed
add KRE bin to path of current command line add KRE bin to path of current command line
-g|-global install to machine-wide location -g|-global install to machine-wide location
-f|-force install even if specified version is already installed
kvm use <semver>|<alias>|none [-x86][-x64] [-svr50][-svrc50] [-p|-persistent] [-g|-global] kvm use <semver>|<alias>|none [-x86][-x64] [-svr50][-svrc50] [-p|-persistent] [-g|-global]
<semver>|<alias> add KRE bin to path of current command line <semver>|<alias> add KRE bin to path of current command line
@ -121,6 +132,25 @@ function Kvm-Upgrade {
Kvm-Alias-Set "default" $version 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 { function Kvm-Find-Latest {
param( param(
[string] $platform, [string] $platform,
@ -128,10 +158,11 @@ param(
) )
Write-Host "Determining latest version" 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 = New-Object System.Net.WebClient
$wc.Credentials = new-object System.Net.NetworkCredential("aspnetreadonly", "4d8a2d9c-7b80-4162-9978-47e918c9658c") $wc.Credentials = new-object System.Net.NetworkCredential("aspnetreadonly", "4d8a2d9c-7b80-4162-9978-47e918c9658c")
Add-Proxy-If-Specified($wc)
[xml]$xml = $wc.DownloadString($url) [xml]$xml = $wc.DownloadString($url)
$version = Select-Xml "//d:Version" -Namespace @{d='http://schemas.microsoft.com/ado/2007/08/dataservices'} $xml $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 { function Do-Kvm-Download {
param( param(
[string] $kreFullName, [string] $kreFullName,
[string] $kreFolder [string] $packagesFolder
) )
$parts = $kreFullName.Split(".", 2) $parts = $kreFullName.Split(".", 2)
$url = "https://www.myget.org/F/aspnetvnext/api/v2/package/" + $parts[0] + "/" + $parts[1] $url = "$feed/package/" + $parts[0] + "/" + $parts[1]
$kreFile = "$kreFolder\$kreFullName.nupkg" $kreFolder = Join-Path $packagesFolder $kreFullName
$kreFile = Join-Path $kreFolder "$kreFullName.nupkg"
If (Test-Path $kreFolder) { If (Test-Path $kreFolder) {
Write-Host "$kreFullName already installed." if($force)
return; {
rm $kreFolder -Recurse -Force
} else {
Write-Host "$kreFullName already installed."
return;
}
} }
Write-Host "Downloading" $kreFullName "from https://www.myget.org/F/aspnetvnext/api/v2/" 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 = New-Object System.Net.WebClient
$wc.Credentials = new-object System.Net.NetworkCredential("aspnetreadonly", "4d8a2d9c-7b80-4162-9978-47e918c9658c") $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 { function Do-Kvm-Unpack {
@ -174,11 +224,22 @@ param(
[string] $kreFile, [string] $kreFile,
[string] $kreFolder [string] $kreFolder
) )
Write-Host "Installing to" $kreFolder Write-Host "Unpacking to" $kreFolder
try {
[System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem') | Out-Null #Shell will not recognize nupkg as a zip and throw, so rename it to zip
[System.IO.Compression.ZipFile]::ExtractToDirectory($kreFile, $kreFolder) $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")) { If (Test-Path ($kreFolder + "\[Content_Types].xml")) {
Remove-Item ($kreFolder + "\[Content_Types].xml") Remove-Item ($kreFolder + "\[Content_Types].xml")
} }
@ -202,8 +263,8 @@ param(
} }
$kreFullName = Requested-VersionOrAlias $versionOrAlias $kreFullName = Requested-VersionOrAlias $versionOrAlias
$kreFolder = "$globalKrePackages\$kreFullName"
Do-Kvm-Download $kreFullName $kreFolder Do-Kvm-Download $kreFullName $globalKrePackages
Kvm-Use $versionOrAlias Kvm-Use $versionOrAlias
} }
@ -215,14 +276,30 @@ param(
{ {
$kreFullName = [System.IO.Path]::GetFileNameWithoutExtension($versionOrAlias) $kreFullName = [System.IO.Path]::GetFileNameWithoutExtension($versionOrAlias)
$kreFolder = "$userKrePackages\$kreFullName" $kreFolder = "$userKrePackages\$kreFullName"
$kreFile = "$kreFolder\$kreFullName.nupkg" $folderExists = Test-Path $kreFolder
if (Test-Path($kreFolder)) { if($folderExists -and $force) {
Write-Host "Target folder '$kreFolder' already exists" del $kreFolder -Recurse -Force
$folderExists = $false;
}
if($folderExists) {
Write-Host "Target folder '$kreFolder' already exists"
} else { } else {
md $kreFolder -Force | Out-Null $tempUnpackFolder = Join-Path $userKrePackages "temp"
copy $versionOrAlias $kreFile $tempKreFile = Join-Path $tempUnpackFolder "$kreFullName.nupkg"
Do-Kvm-Unpack $kreFile $kreFolder
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" $kreBin = "$kreFolder\bin"
@ -233,9 +310,7 @@ param(
{ {
$kreFullName = Requested-VersionOrAlias $versionOrAlias $kreFullName = Requested-VersionOrAlias $versionOrAlias
$kreFolder = "$userKrePackages\$kreFullName" Do-Kvm-Download $kreFullName $userKrePackages
Do-Kvm-Download $kreFullName $kreFolder
Kvm-Use $versionOrAlias Kvm-Use $versionOrAlias
} }
} }