Updating dnvm to latest

This commit is contained in:
Pranav K 2015-05-06 09:35:02 -07:00
parent b781df02af
commit 3f62cc65a5
3 changed files with 653 additions and 207 deletions

View File

@ -4,7 +4,7 @@ set DNVM_CMD_PATH_FILE="%USERPROFILE%\.dnx\temp-set-envvars.cmd"
PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';$CmdPathFile='%DNVM_CMD_PATH_FILE%';& '%~dp0dnvm.ps1' %*" PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';$CmdPathFile='%DNVM_CMD_PATH_FILE%';& '%~dp0dnvm.ps1' %*"
IF EXIST "%DNVM_CMD_PATH_FILE%" ( IF EXIST %DNVM_CMD_PATH_FILE% (
CALL "%DNVM_CMD_PATH_FILE%" CALL %DNVM_CMD_PATH_FILE%
DEL "%DNVM_CMD_PATH_FILE%" DEL %DNVM_CMD_PATH_FILE%
) )

View File

@ -1,5 +1,12 @@
#Requires -Version 3 #Requires -Version 3
if (Test-Path env:WEBSITE_SITE_NAME)
{
# This script is run in Azure Web Sites
# Disable progress indicator
$ProgressPreference = "SilentlyContinue"
}
$ScriptPath = $MyInvocation.MyCommand.Definition $ScriptPath = $MyInvocation.MyCommand.Definition
$Script:UseWriteHost = $true $Script:UseWriteHost = $true
@ -21,6 +28,16 @@ function _WriteOut {
[Parameter(Mandatory=$false)][ConsoleColor]$BackgroundColor, [Parameter(Mandatory=$false)][ConsoleColor]$BackgroundColor,
[Parameter(Mandatory=$false)][switch]$NoNewLine) [Parameter(Mandatory=$false)][switch]$NoNewLine)
if($__TestWriteTo) {
$cur = Get-Variable -Name $__TestWriteTo -ValueOnly -Scope Global -ErrorAction SilentlyContinue
$val = $cur + "$msg"
if(!$NoNewLine) {
$val += [Environment]::NewLine
}
Set-Variable -Name $__TestWriteTo -Value $val -Scope Global -Force
return
}
if(!$Script:UseWriteHost) { if(!$Script:UseWriteHost) {
if(!$msg) { if(!$msg) {
$msg = "" $msg = ""
@ -46,20 +63,11 @@ function _WriteOut {
_WriteOut $msg _WriteOut $msg
} }
} }
if($__TeeTo) {
$cur = Get-Variable -Name $__TeeTo -ValueOnly -Scope Global -ErrorAction SilentlyContinue
$val = $cur + "$msg"
if(!$NoNewLine) {
$val += [Environment]::NewLine
}
Set-Variable -Name $__TeeTo -Value $val -Scope Global -Force
}
} }
### Constants ### Constants
$ProductVersion="1.0.0" $ProductVersion="1.0.0"
$BuildVersion="beta4-10345" $BuildVersion="beta5-10375"
$Authors="Microsoft Open Technologies, Inc." $Authors="Microsoft Open Technologies, Inc."
# If the Version hasn't been replaced... # If the Version hasn't been replaced...
@ -76,7 +84,8 @@ Set-Variable -Option Constant "CommandFriendlyName" ".NET Version Manager"
Set-Variable -Option Constant "DefaultUserDirectoryName" ".dnx" Set-Variable -Option Constant "DefaultUserDirectoryName" ".dnx"
Set-Variable -Option Constant "OldUserDirectoryNames" @(".kre", ".k") Set-Variable -Option Constant "OldUserDirectoryNames" @(".kre", ".k")
Set-Variable -Option Constant "RuntimePackageName" "dnx" Set-Variable -Option Constant "RuntimePackageName" "dnx"
Set-Variable -Option Constant "DefaultFeed" "https://www.myget.org/F/aspnetvnext/api/v2" Set-Variable -Option Constant "DefaultFeed" "https://www.nuget.org/api/v2"
Set-Variable -Option Constant "DefaultUnstableFeed" "https://www.myget.org/F/aspnetvnext/api/v2"
Set-Variable -Option Constant "CrossGenCommand" "k-crossgen" Set-Variable -Option Constant "CrossGenCommand" "k-crossgen"
Set-Variable -Option Constant "CommandPrefix" "dnvm-" Set-Variable -Option Constant "CommandPrefix" "dnvm-"
Set-Variable -Option Constant "DefaultArchitecture" "x86" Set-Variable -Option Constant "DefaultArchitecture" "x86"
@ -88,6 +97,10 @@ Set-Variable -Option Constant "OldUserHomes" @("%USERPROFILE%\.kre","%USERPROFIL
Set-Variable -Option Constant "DefaultUserHome" "%USERPROFILE%\$DefaultUserDirectoryName" Set-Variable -Option Constant "DefaultUserHome" "%USERPROFILE%\$DefaultUserDirectoryName"
Set-Variable -Option Constant "HomeEnvVar" "DNX_HOME" Set-Variable -Option Constant "HomeEnvVar" "DNX_HOME"
Set-Variable -Option Constant "RuntimeShortFriendlyName" "DNX"
Set-Variable -Option Constant "DNVMUpgradeUrl" "https://raw.githubusercontent.com/aspnet/Home/dev/dnvm.ps1"
Set-Variable -Option Constant "AsciiArt" @" Set-Variable -Option Constant "AsciiArt" @"
___ _ ___ ____ ___ ___ _ ___ ____ ___
/ _ \/ |/ / | / / |/ / / _ \/ |/ / | / / |/ /
@ -116,10 +129,13 @@ if(!$ColorScheme) {
"Help_Optional"=[ConsoleColor]::Gray "Help_Optional"=[ConsoleColor]::Gray
"Help_Command"=[ConsoleColor]::DarkYellow "Help_Command"=[ConsoleColor]::DarkYellow
"Help_Executable"=[ConsoleColor]::DarkYellow "Help_Executable"=[ConsoleColor]::DarkYellow
"Feed_Name"=[ConsoleColor]::Cyan
"Warning" = [ConsoleColor]::Yellow
} }
} }
Set-Variable -Option Constant "OptionPadding" 20 Set-Variable -Option Constant "OptionPadding" 20
Set-Variable -Option Constant "CommandPadding" 15
# Test Control Variables # Test Control Variables
if($__TeeTo) { if($__TeeTo) {
@ -134,6 +150,7 @@ $DeprecatedCommands = @("unalias")
$RuntimeHomes = $env:DNX_HOME $RuntimeHomes = $env:DNX_HOME
$UserHome = $env:DNX_USER_HOME $UserHome = $env:DNX_USER_HOME
$ActiveFeed = $env:DNX_FEED $ActiveFeed = $env:DNX_FEED
$ActiveUnstableFeed = $env:DNX_UNSTABLE_FEED
# Default Exit Code # Default Exit Code
$Script:ExitCode = $ExitCodes.Success $Script:ExitCode = $ExitCodes.Success
@ -156,10 +173,6 @@ if($CmdPathFile) {
_WriteDebug "Using CMD PATH file: $CmdPathFile" _WriteDebug "Using CMD PATH file: $CmdPathFile"
} }
if(!$ActiveFeed) {
$ActiveFeed = $DefaultFeed
}
# Determine where runtimes can exist (RuntimeHomes) # Determine where runtimes can exist (RuntimeHomes)
if(!$RuntimeHomes) { if(!$RuntimeHomes) {
# Set up a default value for the runtime home # Set up a default value for the runtime home
@ -177,7 +190,7 @@ if(!$UserHome) {
_WriteDebug "Detecting User Home..." _WriteDebug "Detecting User Home..."
$pf = $env:ProgramFiles $pf = $env:ProgramFiles
if(Test-Path "env:\ProgramFiles(x86)") { if(Test-Path "env:\ProgramFiles(x86)") {
$pf32 = cat "env:\ProgramFiles(x86)" $pf32 = Get-Content "env:\ProgramFiles(x86)"
} }
# Canonicalize so we can do StartsWith tests # Canonicalize so we can do StartsWith tests
@ -205,6 +218,39 @@ $RuntimesDir = Join-Path $UserHome "runtimes"
$Aliases = $null $Aliases = $null
### Helper Functions ### Helper Functions
# Checks if a specified file exists in the destination folder and if not, copies the file
# to the destination folder.
function Safe-Filecopy {
param(
[Parameter(Mandatory=$true, Position=0)] $Filename,
[Parameter(Mandatory=$true, Position=1)] $SourceFolder,
[Parameter(Mandatory=$true, Position=2)] $DestinationFolder)
# Make sure the destination folder is created if it doesn't already exist.
if(!(Test-Path $DestinationFolder)) {
_WriteOut "Creating destination folder '$DestinationFolder' ... "
New-Item -Type Directory $Destination | Out-Null
}
$sourceFilePath = Join-Path $SourceFolder $Filename
$destFilePath = Join-Path $DestinationFolder $Filename
if(Test-Path $sourceFilePath) {
_WriteOut "Installing '$Filename' to '$DestinationFolder' ... "
if (Test-Path $destFilePath) {
_WriteOut " Skipping: file already exists" -ForegroundColor Yellow
}
else {
Copy-Item $sourceFilePath $destFilePath -Force
}
}
else {
_WriteOut "WARNING: Unable to install: Could not find '$Filename' in '$SourceFolder'. "
}
}
function GetArch($Architecture, $FallBackArch = $DefaultArchitecture) { function GetArch($Architecture, $FallBackArch = $DefaultArchitecture) {
if(![String]::IsNullOrWhiteSpace($Architecture)) { if(![String]::IsNullOrWhiteSpace($Architecture)) {
$Architecture $Architecture
@ -229,13 +275,34 @@ function Write-Usage {
if(!$Authors.StartsWith("{{")) { if(!$Authors.StartsWith("{{")) {
_WriteOut "By $Authors" _WriteOut "By $Authors"
} }
_WriteOut
_WriteOut -NoNewLine -ForegroundColor $ColorScheme.Help_Header "usage:" _WriteOut -NoNewLine -ForegroundColor $ColorScheme.Help_Header "usage:"
_WriteOut -NoNewLine -ForegroundColor $ColorScheme.Help_Executable " $CommandName" _WriteOut -NoNewLine -ForegroundColor $ColorScheme.Help_Executable " $CommandName"
_WriteOut -NoNewLine -ForegroundColor $ColorScheme.Help_Command " <command>" _WriteOut -NoNewLine -ForegroundColor $ColorScheme.Help_Command " <command>"
_WriteOut -ForegroundColor $ColorScheme.Help_Argument " [<arguments...>]" _WriteOut -ForegroundColor $ColorScheme.Help_Argument " [<arguments...>]"
} }
function Write-Feeds {
_WriteOut
_WriteOut -ForegroundColor $ColorScheme.Help_Header "Current feed settings:"
_WriteOut -NoNewline -ForegroundColor $ColorScheme.Feed_Name "Default Stable: "
_WriteOut "$DefaultFeed"
_WriteOut -NoNewline -ForegroundColor $ColorScheme.Feed_Name "Default Unstable: "
_WriteOut "$DefaultUnstableFeed"
_WriteOut -NoNewline -ForegroundColor $ColorScheme.Feed_Name "Current Stable Override: "
if($ActiveFeed) {
_WriteOut "$ActiveFeed"
} else {
_WriteOut "<none>"
}
_WriteOut -NoNewline -ForegroundColor $ColorScheme.Feed_Name "Current Unstable Override: "
if($ActiveUnstableFeed) {
_WriteOut "$ActiveUnstableFeed"
} else {
_WriteOut "<none>"
}
}
function Get-RuntimeAlias { function Get-RuntimeAlias {
if($Aliases -eq $null) { if($Aliases -eq $null) {
_WriteDebug "Scanning for aliases in $AliasesDir" _WriteDebug "Scanning for aliases in $AliasesDir"
@ -337,7 +404,12 @@ function Write-Alias {
[Parameter(Mandatory=$false)][string]$Architecture, [Parameter(Mandatory=$false)][string]$Architecture,
[Parameter(Mandatory=$false)][string]$Runtime) [Parameter(Mandatory=$false)][string]$Runtime)
$runtimeFullName = Get-RuntimeName $Version $Architecture $Runtime # If the first character is non-numeric, it's a full runtime name
if(![Char]::IsDigit($Version[0])) {
$runtimeFullName = $Version
} else {
$runtimeFullName = Get-RuntimeName $Version $Architecture $Runtime
}
$aliasFilePath = Join-Path $AliasesDir "$Name.txt" $aliasFilePath = Join-Path $AliasesDir "$Name.txt"
$action = if (Test-Path $aliasFilePath) { "Updating" } else { "Setting" } $action = if (Test-Path $aliasFilePath) { "Updating" } else { "Setting" }
@ -389,16 +461,15 @@ function Find-Latest {
param( param(
[string]$runtime = "", [string]$runtime = "",
[string]$architecture = "", [string]$architecture = "",
[Parameter(Mandatory=$true)]
[string]$Feed, [string]$Feed,
[string]$Proxy [string]$Proxy
) )
if(!$Feed) { $Feed = $ActiveFeed }
_WriteOut "Determining latest version" _WriteOut "Determining latest version"
$RuntimeId = Get-RuntimeId -Architecture:"$architecture" -Runtime:"$runtime" $RuntimeId = Get-RuntimeId -Architecture:"$architecture" -Runtime:"$runtime"
$url = "$Feed/GetUpdates()?packageIds=%27$RuntimeId%27&versions=%270.0%27&includePrerelease=true&includeAllVersions=false" $url = "$Feed/GetUpdates()?packageIds=%27$RuntimeId%27&versions=%270.0%27&includePrerelease=true&includeAllVersions=false"
# NOTE: DO NOT use Invoke-WebRequest. It requires PowerShell 4.0! # NOTE: DO NOT use Invoke-WebRequest. It requires PowerShell 4.0!
$wc = New-Object System.Net.WebClient $wc = New-Object System.Net.WebClient
@ -413,9 +484,11 @@ function Find-Latest {
$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
if (![String]::IsNullOrWhiteSpace($version)) { if($version) {
_WriteDebug "Found latest version: $version" _WriteDebug "Found latest version: $version"
$version $version
} else {
throw "There are no runtimes matching the name $RuntimeId on feed $feed."
} }
} }
@ -445,23 +518,56 @@ function Download-Package(
[string]$Architecture, [string]$Architecture,
[string]$Runtime, [string]$Runtime,
[string]$DestinationFile, [string]$DestinationFile,
[Parameter(Mandatory=$true)]
[string]$Feed, [string]$Feed,
[string]$Proxy) { [string]$Proxy) {
if(!$Feed) { $Feed = $ActiveFeed }
$url = "$Feed/package/" + (Get-RuntimeId $Architecture $Runtime) + "/" + $Version $url = "$Feed/package/" + (Get-RuntimeId $Architecture $Runtime) + "/" + $Version
_WriteOut "Downloading $runtimeFullName from $feed" _WriteOut "Downloading $runtimeFullName from $feed"
$wc = New-Object System.Net.WebClient $wc = New-Object System.Net.WebClient
Apply-Proxy $wc -Proxy:$Proxy
_WriteDebug "Downloading $url ..."
try { try {
$wc.DownloadFile($url, $DestinationFile) Apply-Proxy $wc -Proxy:$Proxy
} catch { _WriteDebug "Downloading $url ..."
$Script:ExitCode = $ExitCodes.NoSuchPackage
throw "Could not find $runtimeFullName.$Version on feed: $Feed" Register-ObjectEvent $wc DownloadProgressChanged -SourceIdentifier WebClient.ProgressChanged -action {
$Global:downloadData = $eventArgs
} | Out-Null
Register-ObjectEvent $wc DownloadFileCompleted -SourceIdentifier WebClient.ProgressComplete -action {
$Global:downloadData = $eventArgs
$Global:downloadCompleted = $true
} | Out-Null
$wc.DownloadFileAsync($url, $DestinationFile)
while(-not $Global:downloadCompleted){
$percent = $Global:downloadData.ProgressPercentage
$totalBytes = $Global:downloadData.TotalBytesToReceive
$receivedBytes = $Global:downloadData.BytesReceived
If ($percent -ne $null) {
Write-Progress -Activity ("Downloading $RuntimeShortFriendlyName from $url") `
-Status ("Downloaded $($Global:downloadData.BytesReceived) of $($Global:downloadData.TotalBytesToReceive) bytes") `
-PercentComplete $percent -Id 2 -ParentId 1
}
}
if($Global:downloadData.Error) {
if($Global:downloadData.Error.Response.StatusCode -eq [System.Net.HttpStatusCode]::NotFound){
throw "The server returned a 404 (NotFound). This is most likely caused by the feed not having the version that you typed. Check that you typed the right version and try again. Other possible causes are the feed doesn't have a $RuntimeShortFriendlyName of the right name format or some other error caused a 404 on the server."
} else {
throw "Unable to download package: {0}" -f $Global:downloadData.Error.Message
}
}
Write-Progress -Activity ("Downloading $RuntimeShortFriendlyName from $url") -Id 2 -ParentId 1 -Completed
}
finally {
Remove-Variable downloadData -Scope "Global"
Remove-Variable downloadCompleted -Scope "Global"
Unregister-Event -SourceIdentifier WebClient.ProgressChanged
Unregister-Event -SourceIdentifier WebClient.ProgressComplete
$wc.Dispose()
} }
} }
@ -474,7 +580,7 @@ function Unpack-Package([string]$DownloadFile, [string]$UnpackFolder) {
try { try {
# Shell will not recognize nupkg as a zip and throw, so rename it to zip # Shell will not recognize nupkg as a zip and throw, so rename it to zip
$runtimeZip = [System.IO.Path]::ChangeExtension($DownloadFile, "zip") $runtimeZip = [System.IO.Path]::ChangeExtension($DownloadFile, "zip")
Rename-Item $runtimeFile $runtimeZip Rename-Item $DownloadFile $runtimeZip
# Use the shell to uncompress the nupkg # Use the shell to uncompress the nupkg
$shell_app=new-object -com shell.application $shell_app=new-object -com shell.application
$zip_file = $shell_app.namespace($runtimeZip) $zip_file = $shell_app.namespace($runtimeZip)
@ -597,7 +703,7 @@ function Ngen-Library(
$ngenCmds += "$ngenExe install $($bin.FullName);" $ngenCmds += "$ngenExe install $($bin.FullName);"
} }
$ngenProc = Start-Process "$psHome\powershell.exe" -Verb runAs -ArgumentList "-ExecutionPolicy unrestricted & $ngenCmds" -Wait -PassThru $ngenProc = Start-Process "$psHome\powershell.exe" -Verb runAs -ArgumentList "-ExecutionPolicy unrestricted & $ngenCmds" -Wait -PassThru -WindowStyle Hidden
} }
function Is-Elevated() { function Is-Elevated() {
@ -607,6 +713,24 @@ function Is-Elevated() {
### Commands ### Commands
<#
.SYNOPSIS
Updates DNVM to the latest version.
.PARAMETER Proxy
Use the given address as a proxy when accessing remote server
#>
function dnvm-update-self {
param(
[Parameter(Mandatory=$false)]
[string]$Proxy)
_WriteOut "Updating $CommandName from $DNVMUpgradeUrl"
$wc = New-Object System.Net.WebClient
Apply-Proxy $wc -Proxy:$Proxy
$dnvmFile = Join-Path $PSScriptRoot "dnvm.ps1"
$wc.DownloadFile($DNVMUpgradeUrl, $dnvmFile)
}
<# <#
.SYNOPSIS .SYNOPSIS
Displays a list of commands, and help for specific commands Displays a list of commands, and help for specific commands
@ -631,7 +755,7 @@ function dnvm-help {
if($PassThru) { if($PassThru) {
$help $help
} else { } else {
_WriteOut -ForegroundColor $ColorScheme.Help_Header "$CommandName-$Command" _WriteOut -ForegroundColor $ColorScheme.Help_Header "$CommandName $Command"
_WriteOut " $($help.Synopsis.Trim())" _WriteOut " $($help.Synopsis.Trim())"
_WriteOut _WriteOut
_WriteOut -ForegroundColor $ColorScheme.Help_Header "usage:" _WriteOut -ForegroundColor $ColorScheme.Help_Header "usage:"
@ -704,6 +828,7 @@ function dnvm-help {
} }
} else { } else {
Write-Usage Write-Usage
Write-Feeds
_WriteOut _WriteOut
_WriteOut -ForegroundColor $ColorScheme.Help_Header "commands: " _WriteOut -ForegroundColor $ColorScheme.Help_Header "commands: "
Get-Command "$CommandPrefix*" | Get-Command "$CommandPrefix*" |
@ -712,7 +837,7 @@ function dnvm-help {
$name = $_.Name.Substring($CommandPrefix.Length) $name = $_.Name.Substring($CommandPrefix.Length)
if($DeprecatedCommands -notcontains $name) { if($DeprecatedCommands -notcontains $name) {
_WriteOut -NoNewLine " " _WriteOut -NoNewLine " "
_WriteOut -NoNewLine -ForegroundColor $ColorScheme.Help_Command $name.PadRight(10) _WriteOut -NoNewLine -ForegroundColor $ColorScheme.Help_Command $name.PadRight($CommandPadding)
_WriteOut " $($h.Synopsis.Trim())" _WriteOut " $($h.Synopsis.Trim())"
} }
} }
@ -829,6 +954,8 @@ function dnvm-unalias {
Skip generation of native images Skip generation of native images
.PARAMETER Ngen .PARAMETER Ngen
For CLR flavor only. Generate native images for runtime libraries on Desktop CLR to improve startup time. This option requires elevated privilege and will be automatically turned on if the script is running in administrative mode. To opt-out in administrative mode, use -NoNative switch. For CLR flavor only. Generate native images for runtime libraries on Desktop CLR to improve startup time. This option requires elevated privilege and will be automatically turned on if the script is running in administrative mode. To opt-out in administrative mode, use -NoNative switch.
.PARAMETER Unstable
Upgrade from our unstable dev feed. This will give you the latest development version of the runtime.
#> #>
function dnvm-upgrade { function dnvm-upgrade {
param( param(
@ -857,9 +984,12 @@ function dnvm-upgrade {
[switch]$NoNative, [switch]$NoNative,
[Parameter(Mandatory=$false)] [Parameter(Mandatory=$false)]
[switch]$Ngen) [switch]$Ngen,
dnvm-install "latest" -Alias:$Alias -Architecture:$Architecture -Runtime:$Runtime -Force:$Force -Proxy:$Proxy -NoNative:$NoNative -Ngen:$Ngen [Parameter(Mandatory=$false)]
[switch]$Unstable)
dnvm-install "latest" -Alias:$Alias -Architecture:$Architecture -Runtime:$Runtime -Force:$Force -Proxy:$Proxy -NoNative:$NoNative -Ngen:$Ngen -Unstable:$Unstable -Persistent:$true
} }
<# <#
@ -883,9 +1013,12 @@ function dnvm-upgrade {
Skip generation of native images Skip generation of native images
.PARAMETER Ngen .PARAMETER Ngen
For CLR flavor only. Generate native images for runtime libraries on Desktop CLR to improve startup time. This option requires elevated privilege and will be automatically turned on if the script is running in administrative mode. To opt-out in administrative mode, use -NoNative switch. For CLR flavor only. Generate native images for runtime libraries on Desktop CLR to improve startup time. This option requires elevated privilege and will be automatically turned on if the script is running in administrative mode. To opt-out in administrative mode, use -NoNative switch.
.PARAMETER Persistent
Make the installed runtime useable across all processes run by the current user
.PARAMETER Unstable
Upgrade from our unstable dev feed. This will give you the latest development version of the runtime.
.DESCRIPTION .DESCRIPTION
A proxy can also be specified by using the 'http_proxy' environment variable A proxy can also be specified by using the 'http_proxy' environment variable
#> #>
function dnvm-install { function dnvm-install {
param( param(
@ -917,7 +1050,31 @@ function dnvm-install {
[switch]$NoNative, [switch]$NoNative,
[Parameter(Mandatory=$false)] [Parameter(Mandatory=$false)]
[switch]$Ngen) [switch]$Ngen,
[Parameter(Mandatory=$false)]
[switch]$Persistent,
[Parameter(Mandatory=$false)]
[switch]$Unstable)
$selectedFeed = ""
if($Unstable) {
$selectedFeed = $ActiveUnstableFeed
if(!$selectedFeed) {
$selectedFeed = $DefaultUnstableFeed
} else {
_WriteOut -ForegroundColor $ColorScheme.Warning "Default unstable feed ($DefaultUnstableFeed) is being overridden by the value of the DNX_UNSTABLE_FEED environment variable ($ActiveUnstableFeed)"
}
} else {
$selectedFeed = $ActiveFeed
if(!$selectedFeed) {
$selectedFeed = $DefaultFeed
} else {
_WriteOut -ForegroundColor $ColorScheme.Warning "Default stable feed ($DefaultFeed) is being overridden by the value of the DNX_FEED environment variable ($ActiveFeed)"
}
}
if(!$VersionNuPkgOrAlias) { if(!$VersionNuPkgOrAlias) {
_WriteOut "A version, nupkg path, or the string 'latest' must be provided." _WriteOut "A version, nupkg path, or the string 'latest' must be provided."
@ -927,7 +1084,8 @@ function dnvm-install {
} }
if ($VersionNuPkgOrAlias -eq "latest") { if ($VersionNuPkgOrAlias -eq "latest") {
$VersionNuPkgOrAlias = Find-Latest $Runtime $Architecture Write-Progress -Activity "Installing runtime" "Determining latest runtime" -Id 1
$VersionNuPkgOrAlias = Find-Latest $Runtime $Architecture -Feed:$selectedFeed
} }
$IsNuPkg = $VersionNuPkgOrAlias.EndsWith(".nupkg") $IsNuPkg = $VersionNuPkgOrAlias.EndsWith(".nupkg")
@ -936,6 +1094,7 @@ function dnvm-install {
if(!(Test-Path $VersionNuPkgOrAlias)) { if(!(Test-Path $VersionNuPkgOrAlias)) {
throw "Unable to locate package file: '$VersionNuPkgOrAlias'" throw "Unable to locate package file: '$VersionNuPkgOrAlias'"
} }
Write-Progress -Activity "Installing runtime" "Parsing package file name" -Id 1
$runtimeFullName = [System.IO.Path]::GetFileNameWithoutExtension($VersionNuPkgOrAlias) $runtimeFullName = [System.IO.Path]::GetFileNameWithoutExtension($VersionNuPkgOrAlias)
$Architecture = Get-PackageArch $runtimeFullName $Architecture = Get-PackageArch $runtimeFullName
$Runtime = Get-PackageRuntime $runtimeFullName $Runtime = Get-PackageRuntime $runtimeFullName
@ -960,6 +1119,7 @@ function dnvm-install {
if(Test-Path $RuntimeFolder) { if(Test-Path $RuntimeFolder) {
_WriteOut "'$runtimeFullName' is already installed." _WriteOut "'$runtimeFullName' is already installed."
dnvm-use $PackageVersion -Architecture:$Architecture -Runtime:$Runtime -Persistent:$Persistent
} }
else { else {
$Architecture = GetArch $Architecture $Architecture = GetArch $Architecture
@ -974,29 +1134,37 @@ function dnvm-install {
New-Item -Type Directory $UnpackFolder | Out-Null New-Item -Type Directory $UnpackFolder | Out-Null
if($IsNuPkg) { if($IsNuPkg) {
Write-Progress -Activity "Installing runtime" "Copying package" -Id 1
_WriteDebug "Copying local nupkg $VersionNuPkgOrAlias to $DownloadFile" _WriteDebug "Copying local nupkg $VersionNuPkgOrAlias to $DownloadFile"
Copy-Item $VersionNuPkgOrAlias $DownloadFile Copy-Item $VersionNuPkgOrAlias $DownloadFile
} else { } else {
# Download the package # Download the package
Write-Progress -Activity "Installing runtime" "Downloading runtime" -Id 1
_WriteDebug "Downloading version $VersionNuPkgOrAlias to $DownloadFile" _WriteDebug "Downloading version $VersionNuPkgOrAlias to $DownloadFile"
Download-Package $PackageVersion $Architecture $Runtime $DownloadFile -Proxy:$Proxy
Download-Package $PackageVersion $Architecture $Runtime $DownloadFile -Proxy:$Proxy -Feed:$selectedFeed
} }
Write-Progress -Activity "Installing runtime" "Unpacking runtime" -Id 1
Unpack-Package $DownloadFile $UnpackFolder Unpack-Package $DownloadFile $UnpackFolder
New-Item -Type Directory $RuntimeFolder -Force | Out-Null if(Test-Path $RuntimeFolder) {
_WriteOut "Installing to $RuntimeFolder" # Ensure the runtime hasn't been installed in the time it took to download the package.
_WriteDebug "Moving package contents to $RuntimeFolder" _WriteOut "'$runtimeFullName' is already installed."
Move-Item "$UnpackFolder\*" $RuntimeFolder }
_WriteDebug "Cleaning temporary directory $UnpackFolder" else {
Remove-Item $UnpackFolder -Force | Out-Null _WriteOut "Installing to $RuntimeFolder"
_WriteDebug "Moving package contents to $RuntimeFolder"
Move-Item $UnpackFolder $RuntimeFolder
}
dnvm-use $PackageVersion -Architecture:$Architecture -Runtime:$Runtime dnvm-use $PackageVersion -Architecture:$Architecture -Runtime:$Runtime -Persistent:$Persistent
if ($Runtime -eq "clr") { if ($Runtime -eq "clr") {
if (-not $NoNative) { if (-not $NoNative) {
if ((Is-Elevated) -or $Ngen) { if ((Is-Elevated) -or $Ngen) {
$runtimeBin = Get-RuntimePath $runtimeFullName $runtimeBin = Get-RuntimePath $runtimeFullName
Write-Progress -Activity "Installing runtime" "Generating runtime native images" -Id 1
Ngen-Library $runtimeBin $Architecture Ngen-Library $runtimeBin $Architecture
} }
else { else {
@ -1006,12 +1174,18 @@ function dnvm-install {
} }
elseif ($Runtime -eq "coreclr") { elseif ($Runtime -eq "coreclr") {
if ($NoNative) { if ($NoNative) {
_WriteOut "Skipping native image compilation." _WriteOut "Skipping native image compilation."
} }
else { else {
_WriteOut "Compiling native images for $runtimeFullName to improve startup performance..." _WriteOut "Compiling native images for $runtimeFullName to improve startup performance..."
Start-Process $CrossGenCommand -Wait Write-Progress -Activity "Installing runtime" "Generating runtime native images" -Id 1
_WriteOut "Finished native image compilation." if ($DebugPreference -eq 'SilentlyContinue') {
Start-Process $CrossGenCommand -Wait -WindowStyle Hidden
}
else {
Start-Process $CrossGenCommand -Wait -NoNewWindow
}
_WriteOut "Finished native image compilation."
} }
} }
else { else {
@ -1023,6 +1197,8 @@ function dnvm-install {
_WriteDebug "Aliasing installed runtime to '$Alias'" _WriteDebug "Aliasing installed runtime to '$Alias'"
dnvm-alias $Alias $PackageVersion -Architecture:$Architecture -Runtime:$Runtime dnvm-alias $Alias $PackageVersion -Architecture:$Architecture -Runtime:$Runtime
} }
Write-Progress -Activity "Install complete" -Id 1 -Complete
} }
@ -1040,7 +1216,7 @@ function dnvm-install {
#> #>
function dnvm-use { function dnvm-use {
param( param(
[Parameter(Mandatory=$false, Position=0)] [Parameter(Mandatory=$true, Position=0)]
[string]$VersionOrAlias, [string]$VersionOrAlias,
[Alias("arch")] [Alias("arch")]
@ -1057,13 +1233,6 @@ function dnvm-use {
[Parameter(Mandatory=$false)] [Parameter(Mandatory=$false)]
[switch]$Persistent) [switch]$Persistent)
if([String]::IsNullOrWhiteSpace($VersionOrAlias)) {
_WriteOut "Missing version or alias to add to path"
dnvm-help use
$Script:ExitCode = $ExitCodes.InvalidArguments
return
}
if ($versionOrAlias -eq "none") { if ($versionOrAlias -eq "none") {
_WriteOut "Removing all runtimes from process PATH" _WriteOut "Removing all runtimes from process PATH"
Set-Path (Change-Path $env:Path "" ($RuntimeDirs)) Set-Path (Change-Path $env:Path "" ($RuntimeDirs))
@ -1096,30 +1265,62 @@ function dnvm-use {
<# <#
.SYNOPSIS .SYNOPSIS
Gets the full name of a runtime Locates the dnx.exe for the specified version or alias and executes it, providing the remaining arguments to dnx.exe
.PARAMETER VersionOrAlias .PARAMETER VersionOrAlias
The version or alias of the runtime to place on the PATH The version of alias of the runtime to execute
.PARAMETER Architecture .PARAMETER DnxArguments
The processor architecture of the runtime to place on the PATH (default: x86, or whatever the alias specifies in the case of use-ing an alias) The arguments to pass to dnx.exe
.PARAMETER Runtime
The runtime flavor of the runtime to place on the PATH (default: clr, or whatever the alias specifies in the case of use-ing an alias)
#> #>
function dnvm-name { function dnvm-run {
param( param(
[Parameter(Mandatory=$false, Position=0)] [Parameter(Mandatory=$true, Position=0)]
[string]$VersionOrAlias, [string]$VersionOrAlias,
[Parameter(Mandatory=$false, Position=1, ValueFromRemainingArguments=$true)]
[object[]]$DnxArguments)
[Alias("arch")] $runtimeFullName = Get-RuntimeName $VersionOrAlias $Architecture $Runtime
[ValidateSet("x86","x64")] $runtimeBin = Get-RuntimePath $runtimeFullName
[Parameter(Mandatory=$false)] if ($runtimeBin -eq $null) {
[string]$Architecture = "", throw "Cannot find $runtimeFullName, do you need to run '$CommandName install $versionOrAlias'?"
}
$dnxExe = Join-Path $runtimeBin "dnx.exe"
if(!(Test-Path $dnxExe)) {
throw "Cannot find a dnx.exe in $runtimeBin, the installation may be corrupt. Try running 'dnvm install $VersionOrAlias -f' to reinstall it"
}
_WriteDebug "> $dnxExe $DnxArguments"
& $dnxExe @DnxArguments
}
[Alias("r")] <#
[ValidateSet("clr","coreclr")] .SYNOPSIS
[Parameter(Mandatory=$false)] Executes the specified command in a sub-shell where the PATH has been augmented to include the specified DNX
[string]$Runtime = "") .PARAMETER VersionOrAlias
The version of alias of the runtime to make active in the sub-shell
.PARAMETER Command
The command to execute in the sub-shell
#>
function dnvm-exec {
param(
[Parameter(Mandatory=$true, Position=0)]
[string]$VersionOrAlias,
[Parameter(Mandatory=$false, Position=1)]
[string]$Command,
[Parameter(Mandatory=$false, Position=2, ValueFromRemainingArguments=$true)]
[object[]]$Arguments)
Get-RuntimeName $VersionOrAlias $Architecture $Runtime $runtimeFullName = Get-RuntimeName $VersionOrAlias $Architecture $Runtime
$runtimeBin = Get-RuntimePath $runtimeFullName
if ($runtimeBin -eq $null) {
throw "Cannot find $runtimeFullName, do you need to run '$CommandName install $versionOrAlias'?"
}
$oldPath = $env:PATH
try {
$env:PATH = "$runtimeBin;$($env:PATH)"
& $Command @Arguments
} finally {
$env:PATH = $oldPath
}
} }
<# <#
@ -1140,28 +1341,12 @@ function dnvm-setup {
$ScriptFolder = Split-Path -Parent $ScriptPath $ScriptFolder = Split-Path -Parent $ScriptPath
if(!(Test-Path $Destination)) { # Copy script files (if necessary):
New-Item -Type Directory $Destination | Out-Null Safe-Filecopy "$CommandName.ps1" $ScriptFolder $Destination
} Safe-Filecopy "$CommandName.cmd" $ScriptFolder $Destination
$ps1Command = Join-Path $ScriptFolder "$CommandName.ps1"
if(Test-Path $ps1Command) {
_WriteOut "Installing '$CommandName.ps1' to '$Destination' ..."
Copy-Item $ps1Command $Destination -Force
} else {
_WriteOut "WARNING: Could not find '$CommandName.ps1' in '$ScriptFolder'. Unable to install!"
}
$cmdCommand = Join-Path $ScriptFolder "$CommandName.cmd"
if(Test-Path $cmdCommand) {
_WriteOut "Installing '$CommandName.cmd' to '$Destination' ..."
Copy-Item $cmdCommand $Destination -Force
} else {
_WriteOut "WARNING: Could not find '$CommandName.cmd' in '$ScriptFolder'. Unable to install!"
}
# Configure Environment Variables # Configure Environment Variables
# Also, clean old user home values if present # Also, clean old user home values if present
# We'll be removing any existing homes, both # We'll be removing any existing homes, both
$PathsToRemove = @( $PathsToRemove = @(
"%USERPROFILE%\$DefaultUserDirectoryName", "%USERPROFILE%\$DefaultUserDirectoryName",
@ -1184,7 +1369,7 @@ function dnvm-setup {
_WriteOut "Adding $DestinationHome to Process $HomeEnvVar" _WriteOut "Adding $DestinationHome to Process $HomeEnvVar"
$processHome = "" $processHome = ""
if(Test-Path "env:\$HomeEnvVar") { if(Test-Path "env:\$HomeEnvVar") {
$processHome = cat "env:\$HomeEnvVar" $processHome = Get-Content "env:\$HomeEnvVar"
} }
$processHome = Change-Path $processHome "%USERPROFILE%\$DefaultUserDirectoryName" $PathsToRemove $processHome = Change-Path $processHome "%USERPROFILE%\$DefaultUserDirectoryName" $PathsToRemove
Set-Content "env:\$HomeEnvVar" $processHome Set-Content "env:\$HomeEnvVar" $processHome
@ -1254,7 +1439,7 @@ try {
$Script:ExitCode = $ExitCodes.UnknownCommand $Script:ExitCode = $ExitCodes.UnknownCommand
} }
} catch { } catch {
Write-Error $_ throw
if(!$Script:ExitCode) { $Script:ExitCode = $ExitCodes.OtherError } if(!$Script:ExitCode) { $Script:ExitCode = $ExitCodes.OtherError }
} }

View File

@ -2,18 +2,37 @@
# Source this file from your .bash-profile or script to use # Source this file from your .bash-profile or script to use
# "Constants" # "Constants"
_DNVM_BUILDNUMBER="beta4-10345" _DNVM_BUILDNUMBER="beta5-10375"
_DNVM_AUTHORS="Microsoft Open Technologies, Inc." _DNVM_AUTHORS="Microsoft Open Technologies, Inc."
_DNVM_RUNTIME_PACKAGE_NAME="dnx" _DNVM_RUNTIME_PACKAGE_NAME="dnx"
_DNVM_RUNTIME_FRIENDLY_NAME=".NET Execution Environment" _DNVM_RUNTIME_FRIENDLY_NAME=".NET Execution Environment"
_DNVM_RUNTIME_SHORT_NAME="DNX" _DNVM_RUNTIME_SHORT_NAME="DNX"
_DNVM_RUNTIME_FOLDER_NAME=".dnx" _DNVM_RUNTIME_FOLDER_NAME=".dnx"
_DNVM_COMMAND_NAME="dnvm" _DNVM_COMMAND_NAME="dnvm"
_DNVM_PACKAGE_MANAGER_NAME="dnu"
_DNVM_VERSION_MANAGER_NAME=".NET Version Manager" _DNVM_VERSION_MANAGER_NAME=".NET Version Manager"
_DNVM_DEFAULT_FEED="https://www.myget.org/F/aspnetvnext/api/v2" _DNVM_DEFAULT_FEED="https://www.nuget.org/api/v2"
_DNVM_DEFAULT_UNSTABLE_FEED="https://www.myget.org/F/aspnetvnext/api/v2"
_DNVM_UPDATE_LOCATION="https://raw.githubusercontent.com/aspnet/Home/dev/dnvm.sh"
_DNVM_HOME_VAR_NAME="DNX_HOME" _DNVM_HOME_VAR_NAME="DNX_HOME"
[ "$_DNVM_BUILDNUMBER" = "{{*" ] && _DNVM_BUILDNUMBER="HEAD" if [ "$NO_COLOR" != "1" ]; then
# ANSI Colors
RCol='\e[0m' # Text Reset
# Regular Bold Underline High Intensity BoldHigh Intens Background High Intensity Backgrounds
Bla='\e[0;30m'; BBla='\e[1;30m'; UBla='\e[4;30m'; IBla='\e[0;90m'; BIBla='\e[1;90m'; On_Bla='\e[40m'; On_IBla='\e[0;100m';
Red='\e[0;31m'; BRed='\e[1;31m'; URed='\e[4;31m'; IRed='\e[0;91m'; BIRed='\e[1;91m'; On_Red='\e[41m'; On_IRed='\e[0;101m';
Gre='\e[0;32m'; BGre='\e[1;32m'; UGre='\e[4;32m'; IGre='\e[0;92m'; BIGre='\e[1;92m'; On_Gre='\e[42m'; On_IGre='\e[0;102m';
Yel='\e[0;33m'; BYel='\e[1;33m'; UYel='\e[4;33m'; IYel='\e[0;93m'; BIYel='\e[1;93m'; On_Yel='\e[43m'; On_IYel='\e[0;103m';
Blu='\e[0;34m'; BBlu='\e[1;34m'; UBlu='\e[4;34m'; IBlu='\e[0;94m'; BIBlu='\e[1;94m'; On_Blu='\e[44m'; On_IBlu='\e[0;104m';
Pur='\e[0;35m'; BPur='\e[1;35m'; UPur='\e[4;35m'; IPur='\e[0;95m'; BIPur='\e[1;95m'; On_Pur='\e[45m'; On_IPur='\e[0;105m';
Cya='\e[0;36m'; BCya='\e[1;36m'; UCya='\e[4;36m'; ICya='\e[0;96m'; BICya='\e[1;96m'; On_Cya='\e[46m'; On_ICya='\e[0;106m';
Whi='\e[0;37m'; BWhi='\e[1;37m'; UWhi='\e[4;37m'; IWhi='\e[0;97m'; BIWhi='\e[1;97m'; On_Whi='\e[47m'; On_IWhi='\e[0;107m';
fi
[[ "$_DNVM_BUILDNUMBER" = {{* ]] && _DNVM_BUILDNUMBER="HEAD"
__dnvm_has() { __dnvm_has() {
type "$1" > /dev/null 2>&1 type "$1" > /dev/null 2>&1
@ -30,20 +49,41 @@ fi
_DNVM_USER_PACKAGES="$DNX_USER_HOME/runtimes" _DNVM_USER_PACKAGES="$DNX_USER_HOME/runtimes"
_DNVM_ALIAS_DIR="$DNX_USER_HOME/alias" _DNVM_ALIAS_DIR="$DNX_USER_HOME/alias"
_DNVM_DNVM_DIR="$DNX_USER_HOME/dnvm"
if [ -z "$DNX_FEED" ]; then DNX_ACTIVE_FEED=""
DNX_FEED="$_DNVM_DEFAULT_FEED"
fi __dnvm_current_os()
{
local uname=$(uname)
if [[ $uname == "Darwin" ]]; then
echo "darwin"
else
echo "linux"
fi
}
__dnvm_find_latest() { __dnvm_find_latest() {
local platform="mono" local platform=$1
local arch=$2
if ! __dnvm_has "curl"; then if [ -z $platform ]; then
echo "$_DNVM_COMMAND_NAME needs curl to proceed." >&2; local platform="mono"
return 1
fi fi
local url="$DNX_FEED/GetUpdates()?packageIds=%27$_DNVM_RUNTIME_PACKAGE_NAME-$platform%27&versions=%270.0%27&includePrerelease=true&includeAllVersions=false" if ! __dnvm_has "curl"; then
printf "%b\n" "${Red}$_DNVM_COMMAND_NAME needs curl to proceed. ${RCol}" >&2;
return 1
fi
if [[ $platform == "mono" ]]; then
#dnx-mono
local packageId="$_DNVM_RUNTIME_PACKAGE_NAME-$platform"
else
#dnx-coreclr-linux-x64
local packageId="$_DNVM_RUNTIME_PACKAGE_NAME-$platform-$(__dnvm_current_os)-$arch"
fi
local url="$DNX_ACTIVE_FEED/GetUpdates()?packageIds=%27$packageId%27&versions=%270.0%27&includePrerelease=true&includeAllVersions=false"
xml="$(curl $url 2>/dev/null)" xml="$(curl $url 2>/dev/null)"
echo $xml | grep \<[a-zA-Z]:Version\>* >> /dev/null || return 1 echo $xml | grep \<[a-zA-Z]:Version\>* >> /dev/null || return 1
version="$(echo $xml | sed 's/.*<[a-zA-Z]:Version>\([^<]*\).*/\1/')" version="$(echo $xml | sed 's/.*<[a-zA-Z]:Version>\([^<]*\).*/\1/')"
@ -77,33 +117,69 @@ __dnvm_package_runtime() {
echo "$runtimeFullName" | sed "s/$_DNVM_RUNTIME_PACKAGE_NAME-\([^.-]*\).*/\1/" echo "$runtimeFullName" | sed "s/$_DNVM_RUNTIME_PACKAGE_NAME-\([^.-]*\).*/\1/"
} }
__dnvm_package_arch() {
local runtimeFullName="$1"
if [[ "$runtimeFullName" =~ $_DNVM_RUNTIME_PACKAGE_NAME-[^-.]*-[^-.]*-[^-.]*\..* ]];
then
echo "$runtimeFullName" | sed "s/$_DNVM_RUNTIME_PACKAGE_NAME-[^-.]*-[^-.]*-\([^-.]*\)\..*/\1/"
fi
}
__dnvm_update_self() {
local dnvmFileLocation="$_DNVM_DNVM_DIR/dnvm.sh"
if [ ! -e $dnvmFileLocation ]; then
local formattedDnvmFileLocation=`(echo $dnvmFileLocation | sed s=$HOME=~=g)`
local formattedDnvmHome=`(echo $_DNVM_DNVM_DIR | sed s=$HOME=~=g)`
printf "%b\n" "${Red}$formattedDnvmFileLocation doesn't exist. This command assumes you have installed dnvm in the usual location and are trying to update it. If you want to use update-self then dnvm.sh should be sourced from $formattedDnvmHome ${RCol}"
return 1
fi
printf "%b\n" "${Cya}Downloading dnvm.sh from $_DNVM_UPDATE_LOCATION ${RCol}"
local httpResult=$(curl -L -D - "$_DNVM_UPDATE_LOCATION" -o "$dnvmFileLocation" -# | grep "^HTTP/1.1" | head -n 1 | sed "s/HTTP.1.1 \([0-9]*\).*/\1/")
[[ $httpResult == "404" ]] &&printf "%b\n" "${Red}404. Unable to download DNVM from $_DNVM_UPDATE_LOCATION ${RCol}" && return 1
[[ $httpResult != "302" && $httpResult != "200" ]] && echo "${Red}HTTP Error $httpResult fetching DNVM from $_DNVM_UPDATE_LOCATION ${RCol}" && return 1
source "$dnvmFileLocation"
}
__dnvm_download() { __dnvm_download() {
local runtimeFullName="$1" local runtimeFullName="$1"
local runtimeFolder="$2" local runtimeFolder="$2"
local force="$3"
local pkgName=$(__dnvm_package_name "$runtimeFullName") local pkgName=$(__dnvm_package_name "$runtimeFullName")
local pkgVersion=$(__dnvm_package_version "$runtimeFullName") local pkgVersion=$(__dnvm_package_version "$runtimeFullName")
local url="$DNX_FEED/package/$pkgName/$pkgVersion" local url="$DNX_ACTIVE_FEED/package/$pkgName/$pkgVersion"
local runtimeFile="$runtimeFolder/$runtimeFullName.nupkg" local runtimeFile="$runtimeFolder/$runtimeFullName.nupkg"
if [ -e "$runtimeFolder" ]; then if [ -n "$force" ]; then
echo "$runtimeFullName already installed." printf "%b\n" "${Yel}Forcing download by deleting $runtimeFolder directory ${RCol}"
return 0 rm -rf "$runtimeFolder"
fi fi
echo "Downloading $runtimeFullName from $DNX_FEED" if [ -e "$runtimeFolder" ]; then
printf "%b\n" "${Gre}$runtimeFullName already installed. ${RCol}"
return 0
fi
if ! __dnvm_has "curl"; then if ! __dnvm_has "curl"; then
echo "$_DNVM_COMMAND_NAME needs curl to proceed." >&2; printf "%b\n" "${Red}$_DNVM_COMMAND_NAME needs curl to proceed. ${RCol}" >&2;
return 1 return 1
fi fi
mkdir -p "$runtimeFolder" > /dev/null 2>&1 mkdir -p "$runtimeFolder" > /dev/null 2>&1
local httpResult=$(curl -L -D - "$url" -o "$runtimeFile" 2>/dev/null | grep "^HTTP/1.1" | head -n 1 | sed "s/HTTP.1.1 \([0-9]*\).*/\1/") echo "Downloading $runtimeFullName from $DNX_ACTIVE_FEED"
echo "Download: $url"
[[ $httpResult == "404" ]] && echo "$runtimeFullName was not found in repository $DNX_FEED" && return 1 local httpResult=$(curl -L -D - "$url" -o "$runtimeFile" -# | grep "^HTTP/1.1" | head -n 1 | sed "s/HTTP.1.1 \([0-9]*\).*/\1/")
[[ $httpResult != "302" && $httpResult != "200" ]] && echo "HTTP Error $httpResult fetching $runtimeFullName from $DNX_FEED" && return 1
if [[ $httpResult == "404" ]]; then
printf "%b\n" "${Red}$runtimeFullName was not found in repository $DNX_ACTIVE_FEED ${RCol}"
printf "%b\n" "${Cya}This is most likely caused by the feed not having the version that you typed. Check that you typed the right version and try again. Other possible causes are the feed doesn't have a $_DNVM_RUNTIME_SHORT_NAME of the right name format or some other error caused a 404 on the server.${RCol}"
return 1
fi
[[ $httpResult != "302" && $httpResult != "200" ]] && echo "${Red}HTTP Error $httpResult fetching $runtimeFullName from $DNX_ACTIVE_FEED ${RCol}" && return 1
__dnvm_unpack $runtimeFile $runtimeFolder __dnvm_unpack $runtimeFile $runtimeFolder
return $? return $?
@ -133,27 +209,40 @@ __dnvm_unpack() {
#Set shell commands as executable #Set shell commands as executable
find "$runtimeFolder/bin/" -type f \ find "$runtimeFolder/bin/" -type f \
-exec sh -c "head -c 11 {} | grep '/bin/bash' > /dev/null" \; -print | xargs chmod 775 -exec sh -c "head -c 11 {} | grep '/bin/bash' > /dev/null" \; -print | xargs chmod 775
#Set dnx to be executable
chmod 775 "$runtimeFolder/bin/dnx"
} }
__dnvm_requested_version_or_alias() { __dnvm_requested_version_or_alias() {
local versionOrAlias="$1" local versionOrAlias="$1"
local runtime="$2"
local arch="$3"
local runtimeBin=$(__dnvm_locate_runtime_bin_from_full_name "$versionOrAlias") local runtimeBin=$(__dnvm_locate_runtime_bin_from_full_name "$versionOrAlias")
# If the name specified is an existing package, just use it as is # If the name specified is an existing package, just use it as is
if [ -n "$runtimeBin" ]; then if [ -n "$runtimeBin" ]; then
echo "$versionOrAlias" echo "$versionOrAlias"
else else
if [ -e "$_DNVM_ALIAS_DIR/$versionOrAlias.alias" ]; then if [ -e "$_DNVM_ALIAS_DIR/$versionOrAlias.alias" ]; then
local runtimeFullName=$(cat "$_DNVM_ALIAS_DIR/$versionOrAlias.alias") local runtimeFullName=$(cat "$_DNVM_ALIAS_DIR/$versionOrAlias.alias")
local pkgName=$(echo $runtimeFullName | sed "s/\([^.]*\).*/\1/") echo "$runtimeFullName"
local pkgVersion=$(echo $runtimeFullName | sed "s/[^.]*.\(.*\)/\1/")
local pkgPlatform=$(echo "$pkgName" | sed "s/$_DNVM_RUNTIME_PACKAGE_NAME-\([^.-]*\).*/\1/")
else else
local pkgVersion=$versionOrAlias local pkgVersion=$versionOrAlias
local pkgPlatform="mono"
fi
echo "$_DNVM_RUNTIME_PACKAGE_NAME-$pkgPlatform.$pkgVersion" if [[ -z $runtime || "$runtime" == "mono" ]]; then
echo "$_DNVM_RUNTIME_PACKAGE_NAME-mono.$pkgVersion"
elif [[ "$runtime" == "coreclr" ]]; then
local pkgArchitecture="x64"
local pkgSystem=$(__dnvm_current_os)
if [ "$arch" != "" ]; then
local pkgArchitecture="$arch"
fi
echo "$_DNVM_RUNTIME_PACKAGE_NAME-coreclr-$pkgSystem-$pkgArchitecture.$pkgVersion"
fi
fi
fi fi
} }
@ -163,64 +252,131 @@ __dnvm_locate_runtime_bin_from_full_name() {
[ -e "$_DNVM_USER_PACKAGES/$runtimeFullName/bin" ] && echo "$_DNVM_USER_PACKAGES/$runtimeFullName/bin" && return [ -e "$_DNVM_USER_PACKAGES/$runtimeFullName/bin" ] && echo "$_DNVM_USER_PACKAGES/$runtimeFullName/bin" && return
} }
__dnvm_help() { __echo_art() {
printf "%b" "${Cya}"
echo " ___ _ ___ ____ ___"
echo " / _ \/ |/ / | / / |/ /"
echo " / // / /| |/ / /|_/ / "
echo " /____/_/|_/ |___/_/ /_/ "
printf "%b" "${RCol}"
}
__dnvm_description() {
__echo_art
echo "" echo ""
echo "$_DNVM_VERSION_MANAGER_NAME - Version 1.0.0-$_DNVM_BUILDNUMBER" echo "$_DNVM_VERSION_MANAGER_NAME - Version 1.0.0-$_DNVM_BUILDNUMBER"
[ "$_DNVM_AUTHORS" != "{{*" ] && echo "By $_DNVM_AUTHORS" [[ "$_DNVM_AUTHORS" != {{* ]] && echo "By $_DNVM_AUTHORS"
echo "" echo ""
echo "USAGE: $_DNVM_COMMAND_NAME <command> [options]" echo "DNVM can be used to download versions of the $_DNVM_RUNTIME_FRIENDLY_NAME and manage which version you are using."
echo "You can control the URL of the stable and unstable channel by setting the DNX_FEED and DNX_UNSTABLE_FEED variables."
echo "" echo ""
echo "$_DNVM_COMMAND_NAME upgrade" printf "%b\n" "${Yel}Current feed settings:${RCol}"
echo "install latest $_DNVM_RUNTIME_SHORT_NAME from feed" printf "%b\n" "${Cya}Default Stable:${Yel} $_DNVM_DEFAULT_FEED"
echo "add $_DNVM_RUNTIME_SHORT_NAME bin to path of current command line" printf "%b\n" "${Cya}Default Unstable:${Yel} $_DNVM_DEFAULT_UNSTABLE_FEED"
echo "set installed version as default"
local dnxStableOverride="<none>"
[[ -n $DNX_FEED ]] && dnxStableOverride="$DNX_FEED"
printf "%b\n" "${Cya}Current Stable Override:${Yel} $dnxStableOverride"
local dnxUnstableOverride="<none>"
[[ -n $DNX_UNSTABLE_FEED ]] && dnxUnstableOverride="$DNX_UNSTABLE_FEED"
printf "%b\n" "${Cya}Current Unstable Override:${Yel} $dnxUnstableOverride${RCol}"
echo "" echo ""
echo "$_DNVM_COMMAND_NAME install <semver>|<alias>|<nupkg>|latest [-a|-alias <alias>] [-p -persistent]"
echo "<semver>|<alias> install requested $_DNVM_RUNTIME_SHORT_NAME from feed" }
echo "<nupkg> install requested $_DNVM_RUNTIME_SHORT_NAME from local package on filesystem"
echo "latest install latest version of $_DNVM_RUNTIME_SHORT_NAME from feed" __dnvm_help() {
echo "-a|-alias <alias> set alias <alias> for requested $_DNVM_RUNTIME_SHORT_NAME on install" __dnvm_description
echo "-p -persistent set installed version as default" printf "%b\n" "${Cya}USAGE:${Yel} $_DNVM_COMMAND_NAME <command> [options] ${RCol}"
echo "add $_DNVM_RUNTIME_SHORT_NAME bin to path of current command line"
echo "" echo ""
echo "$_DNVM_COMMAND_NAME use <semver>|<alias>|<package>|none [-p -persistent]" printf "%b\n" "${Yel}$_DNVM_COMMAND_NAME upgrade [-f|-force] [-u|-unstable] ${RCol}"
echo "<semver>|<alias>|<package> add $_DNVM_RUNTIME_SHORT_NAME bin to path of current command line " echo " install latest $_DNVM_RUNTIME_SHORT_NAME from feed"
echo "none remove $_DNVM_RUNTIME_SHORT_NAME bin from path of current command line" echo " adds $_DNVM_RUNTIME_SHORT_NAME bin to path of current command line"
echo "-p -persistent set selected version as default" echo " set installed version as default"
echo " -f|forces force upgrade. Overwrite existing version of $_DNVM_RUNTIME_SHORT_NAME if already installed"
echo " -u|unstable use unstable feed. Installs the $_DNVM_RUNTIME_SHORT_NAME from the unstable unstable feed"
echo " -r|runtime The runtime flavor to install [clr or coreclr] (default: clr)"
echo "" echo ""
echo "$_DNVM_COMMAND_NAME list" printf "%b\n" "${Yel}$_DNVM_COMMAND_NAME install <semver>|<alias>|<nupkg>|latest [-a|-alias <alias>] [-p|-persistent] [-f|-force] [-u|-unstable] ${RCol}"
echo "list $_DNVM_RUNTIME_SHORT_NAME versions installed " echo " <semver>|<alias> install requested $_DNVM_RUNTIME_SHORT_NAME from feed"
echo " <nupkg> install requested $_DNVM_RUNTIME_SHORT_NAME from local package on filesystem"
echo " latest install latest version of $_DNVM_RUNTIME_SHORT_NAME from feed"
echo " -a|-alias <alias> set alias <alias> for requested $_DNVM_RUNTIME_SHORT_NAME on install"
echo " -p|-persistent set installed version as default"
echo " -f|force force install. Overwrite existing version of $_DNVM_RUNTIME_SHORT_NAME if already installed"
echo " -u|unstable use unstable feed. Installs the $_DNVM_RUNTIME_SHORT_NAME from the unstable unstable feed"
echo " -r|runtime The runtime flavor to install [mono or coreclr] (default: mono)"
echo "" echo ""
echo "$_DNVM_COMMAND_NAME alias" echo " adds $_DNVM_RUNTIME_SHORT_NAME bin to path of current command line"
echo "list $_DNVM_RUNTIME_SHORT_NAME aliases which have been defined"
echo "" echo ""
echo "$_DNVM_COMMAND_NAME alias <alias>" printf "%b\n" "${Yel}$_DNVM_COMMAND_NAME use <semver>|<alias>|<package>|none [-p|-persistent] [-r|-runtime <runtime>] [-a|-arch <architecture>] ${RCol}"
echo "display value of the specified alias" echo " <semver>|<alias>|<package> add $_DNVM_RUNTIME_SHORT_NAME bin to path of current command line "
echo " none remove $_DNVM_RUNTIME_SHORT_NAME bin from path of current command line"
echo " -p|-persistent set selected version as default"
echo " -r|-runtime runtime to use (mono, coreclr)"
echo " -a|-arch architecture to use (x64)"
echo "" echo ""
echo "$_DNVM_COMMAND_NAME alias <alias> <semver>|<alias>|<package>" printf "%b\n" "${Yel}$_DNVM_COMMAND_NAME run <semver>|<alias> <args...> ${RCol}"
echo "<alias> the name of the alias to set" echo " <semver>|<alias> the version or alias to run"
echo "<semver>|<alias>|<package> the $_DNVM_RUNTIME_SHORT_NAME version to set the alias to. Alternatively use the version of the specified alias" echo " <args...> arguments to be passed to $_DNVM_RUNTIME_SHORT_NAME"
echo "" echo ""
echo "$_DNVM_COMMAND_NAME unalias <alias>" echo " runs the $_DNVM_RUNTIME_SHORT_NAME command from the specified version of the runtime without affecting the current PATH"
echo "remove the specified alias"
echo "" echo ""
printf "%b\n" "${Yel}$_DNVM_COMMAND_NAME exec <semver>|<alias> <command> <args...> ${RCol}"
echo " <semver>|<alias> the version or alias to execute in"
echo " <command> the command to run"
echo " <args...> arguments to be passed to the command"
echo ""
echo " runs the specified command in the context of the specified version of the runtime without affecting the current PATH"
echo " example: $_DNVM_COMMAND_NAME exec 1.0.0-beta4 $_DNVM_PACKAGE_MANAGER_NAME build"
echo ""
printf "%b\n" "${Yel}$_DNVM_COMMAND_NAME list ${RCol}"
echo " list $_DNVM_RUNTIME_SHORT_NAME versions installed "
echo ""
printf "%b\n" "${Yel}$_DNVM_COMMAND_NAME alias ${RCol}"
echo " list $_DNVM_RUNTIME_SHORT_NAME aliases which have been defined"
echo ""
printf "%b\n" "${Yel}$_DNVM_COMMAND_NAME alias <alias> ${RCol}"
echo " display value of the specified alias"
echo ""
printf "%b\n" "${Yel}$_DNVM_COMMAND_NAME alias <alias> <semver>|<alias>|<package> ${RCol}"
echo " <alias> the name of the alias to set"
echo " <semver>|<alias>|<package> the $_DNVM_RUNTIME_SHORT_NAME version to set the alias to. Alternatively use the version of the specified alias"
echo ""
printf "%b\n" "${Yel}$_DNVM_COMMAND_NAME unalias <alias> ${RCol}"
echo " remove the specified alias"
echo ""
printf "%b\n" "${Yel}$_DNVM_COMMAND_NAME [help|-h|-help|--help] ${RCol}"
echo " displays this help text."
echo ""
printf "%b\n" "${Yel}$_DNVM_COMMAND_NAME update-self ${RCol}"
echo " updates dnvm itself."
} }
dnvm() dnvm()
{ {
if [ $# -lt 1 ]; then if [ $# -lt 1 ]; then
__dnvm_help __dnvm_description
printf "%b\n" "Use ${Yel}$_DNVM_COMMAND_NAME [help|-h|-help|--help] ${RCol} to display help text."
echo ""
return return
fi fi
case $1 in case $1 in
"help" ) "help"|"-h"|"-help"|"--help" )
__dnvm_help __dnvm_help
;; ;;
"update-self" )
__dnvm_update_self
;;
"upgrade" ) "upgrade" )
[ $# -ne 1 ] && __dnvm_help && return shift
$_DNVM_COMMAND_NAME install latest -p $_DNVM_COMMAND_NAME install latest -p $@
;; ;;
"install" ) "install" )
@ -229,6 +385,10 @@ dnvm()
local persistent= local persistent=
local versionOrAlias= local versionOrAlias=
local alias= local alias=
local force=
local unstable=
local runtime="mono"
local arch="x64"
while [ $# -ne 0 ] while [ $# -ne 0 ]
do do
if [[ $1 == "-p" || $1 == "-persistent" ]]; then if [[ $1 == "-p" || $1 == "-persistent" ]]; then
@ -236,61 +396,128 @@ dnvm()
elif [[ $1 == "-a" || $1 == "-alias" ]]; then elif [[ $1 == "-a" || $1 == "-alias" ]]; then
local alias=$2 local alias=$2
shift shift
elif [[ $1 == "-f" || $1 == "-force" ]]; then
local force="-f"
elif [[ $1 == "-u" || $1 == "-unstable" ]]; then
local unstable="-u"
elif [[ $1 == "-r" || $1 == "-runtime" ]]; then
local runtime=$2
shift
elif [[ $1 == "-arch" ]]; then
local arch=$2
shift
if [[ $arch != "x86" && $arch != "x64" ]]; then
printf "%b\n" "${Red}Architecture must be x86 or x64.${RCol}"
return 1
fi
if [[ $arch == "x86" && $runtime == "coreclr" ]]; then
printf "%b\n" "${Red}Core CLR doesn't currently have a 32 bit build. You must use x64."
return 1
fi
elif [[ -n $1 ]]; then elif [[ -n $1 ]]; then
[[ -n $versionOrAlias ]] && echo "Invalid option $1" && __dnvm_help && return 1 [[ -n $versionOrAlias ]] && echo "Invalid option $1" && __dnvm_help && return 1
local versionOrAlias=$1 local versionOrAlias=$1
fi fi
shift shift
done done
if [[ "$versionOrAlias" == "latest" ]]; then
echo "Determining latest version" if [ -z $unstable ]; then
versionOrAlias=$(__dnvm_find_latest) DNX_ACTIVE_FEED="$DNX_FEED"
[[ $? == 1 ]] && echo "Error: Could not find latest version from feed $DNX_FEED" && return 1 if [ -z "$DNX_ACTIVE_FEED" ]; then
echo "Latest version is $versionOrAlias" DNX_ACTIVE_FEED="$_DNVM_DEFAULT_FEED"
else
printf "%b\n" "${Yel}Default stable feed ($_DNVM_DEFAULT_FEED) is being overridden by the value of the DNX_FEED variable ($DNX_FEED). ${RCol}"
fi
else
DNX_ACTIVE_FEED="$DNX_UNSTABLE_FEED"
if [ -z "$DNX_ACTIVE_FEED" ]; then
DNX_ACTIVE_FEED="$_DNVM_DEFAULT_UNSTABLE_FEED"
else
printf "%b\n" "${Yel}Default unstable feed ($_DNVM_DEFAULT_UNSTABLE_FEED) is being overridden by the value of the DNX_UNSTABLE_FEED variable ($DNX_UNSTABLE_FEED). ${RCol}"
fi
fi fi
if [[ $runtime == "mono" ]] && ! __dnvm_has "mono"; then
printf "%b\n" "${Yel}It appears you don't have Mono available. Remember to get Mono before trying to run $DNVM_RUNTIME_SHORT_NAME application. ${RCol}" >&2;
fi
if [[ "$versionOrAlias" == "latest" ]]; then
echo "Determining latest version"
versionOrAlias=$(__dnvm_find_latest "$runtime" "$arch")
[[ $? == 1 ]] && echo "Error: Could not find latest version from feed $DNX_ACTIVE_FEED" && return 1
printf "%b\n" "Latest version is ${Cya}$versionOrAlias ${RCol}"
fi
if [[ "$versionOrAlias" == *.nupkg ]]; then if [[ "$versionOrAlias" == *.nupkg ]]; then
local runtimeFullName=$(basename $versionOrAlias | sed "s/\(.*\)\.nupkg/\1/") local runtimeFullName=$(basename $versionOrAlias | sed "s/\(.*\)\.nupkg/\1/")
local runtimeVersion=$(__dnvm_package_version "$runtimeFullName") local runtimeVersion=$(__dnvm_package_version "$runtimeFullName")
local runtimeFolder="$_DNVM_USER_PACKAGES/$runtimeFullName" local runtimeFolder="$_DNVM_USER_PACKAGES/$runtimeFullName"
local runtimeFile="$runtimeFolder/$runtimeFullName.nupkg" local runtimeFile="$runtimeFolder/$runtimeFullName.nupkg"
local runtimeClr=$(__dnvm_package_runtime "$runtimeFullName")
if [ -n "$force" ]; then
printf "%b\n" "${Yel}Forcing download by deleting $runtimeFolder directory ${RCol}"
rm -rf "$runtimeFolder"
fi
if [ -e "$runtimeFolder" ]; then if [ -e "$runtimeFolder" ]; then
echo "$runtimeFullName already installed" echo "$runtimeFullName already installed"
else else
mkdir "$runtimeFolder" > /dev/null 2>&1 mkdir -p "$runtimeFolder" > /dev/null 2>&1
cp -a "$versionOrAlias" "$runtimeFile" cp -a "$versionOrAlias" "$runtimeFile"
__dnvm_unpack "$runtimeFile" "$runtimeFolder" __dnvm_unpack "$runtimeFile" "$runtimeFolder"
[[ $? == 1 ]] && return 1 [[ $? == 1 ]] && return 1
fi fi
$_DNVM_COMMAND_NAME use "$runtimeVersion" "$persistent" $_DNVM_COMMAND_NAME use "$runtimeVersion" "$persistent" -r "$runtimeClr"
[[ -n $alias ]] && $_DNVM_COMMAND_NAME alias "$alias" "$runtimeVersion" [[ -n $alias ]] && $_DNVM_COMMAND_NAME alias "$alias" "$runtimeVersion"
else else
local runtimeFullName="$(__dnvm_requested_version_or_alias $versionOrAlias)" local runtimeFullName=$(__dnvm_requested_version_or_alias "$versionOrAlias" "$runtime" "$arch")
local runtimeFolder="$_DNVM_USER_PACKAGES/$runtimeFullName" local runtimeFolder="$_DNVM_USER_PACKAGES/$runtimeFullName"
__dnvm_download "$runtimeFullName" "$runtimeFolder" __dnvm_download "$runtimeFullName" "$runtimeFolder" "$force"
[[ $? == 1 ]] && return 1 [[ $? == 1 ]] && return 1
$_DNVM_COMMAND_NAME use "$versionOrAlias" "$persistent" $_DNVM_COMMAND_NAME use "$versionOrAlias" "$persistent" "-runtime" "$runtime" "-arch" "$arch"
[[ -n $alias ]] && $_DNVM_COMMAND_NAME alias "$alias" "$versionOrAlias" [[ -n $alias ]] && $_DNVM_COMMAND_NAME alias "$alias" "$versionOrAlias"
fi fi
;; ;;
"use" ) "use"|"run"|"exec" )
[ $# -gt 3 ] && __dnvm_help && return [[ $1 == "use" && $# -lt 2 ]] && __dnvm_help && return
[ $# -lt 2 ] && __dnvm_help && return
local cmd=$1
local persistent=
local arch=
local runtime=
shift shift
local persistent= if [ $cmd == "use" ]; then
while [ $# -ne 0 ] local versionOrAlias=
do while [ $# -ne 0 ]
if [[ $1 == "-p" || $1 == "-persistent" ]]; then do
local persistent="true" if [[ $1 == "-p" || $1 == "-persistent" ]]; then
elif [[ -n $1 ]]; then local persistent="true"
local versionOrAlias=$1 elif [[ $1 == "-a" || $1 == "-arch" ]]; then
fi local arch=$2
shift
elif [[ $1 == "-r" || $1 == "-runtime" ]]; then
local runtime=$2
shift
elif [[ $1 == -* ]]; then
echo "Invalid option $1" && __dnvm_help && return 1
elif [[ -n $1 ]]; then
[[ -n $versionOrAlias ]] && echo "Invalid option $1" && __dnvm_help && return 1
local versionOrAlias=$1
fi
shift
done
else
local versionOrAlias=$1
shift shift
done fi
if [[ $versionOrAlias == "none" ]]; then if [[ $cmd == "use" && $versionOrAlias == "none" ]]; then
echo "Removing $_DNVM_RUNTIME_SHORT_NAME from process PATH" echo "Removing $_DNVM_RUNTIME_SHORT_NAME from process PATH"
# Strip other version from PATH # Strip other version from PATH
PATH=$(__dnvm_strip_path "$PATH" "/bin") PATH=$(__dnvm_strip_path "$PATH" "/bin")
@ -302,7 +529,7 @@ dnvm()
return 0 return 0
fi fi
local runtimeFullName=$(__dnvm_requested_version_or_alias "$versionOrAlias") local runtimeFullName=$(__dnvm_requested_version_or_alias "$versionOrAlias" "$runtime" "$arch")
local runtimeBin=$(__dnvm_locate_runtime_bin_from_full_name "$runtimeFullName") local runtimeBin=$(__dnvm_locate_runtime_bin_from_full_name "$runtimeFullName")
if [[ -z $runtimeBin ]]; then if [[ -z $runtimeBin ]]; then
@ -310,25 +537,44 @@ dnvm()
return 1 return 1
fi fi
echo "Adding" $runtimeBin "to process PATH" case $cmd in
"run")
local hostpath="$runtimeBin/dnx"
if [[ -e $hostpath ]]; then
$hostpath $@
else
echo "Cannot find $_DNVM_RUNTIME_SHORT_NAME in $runtimeBin. It may have been corrupted. Use '$_DNVM_COMMAND_NAME install $versionOrAlias -f' to attempt to reinstall it"
fi
;;
"exec")
(
PATH=$(__dnvm_strip_path "$PATH" "/bin")
PATH=$(__dnvm_prepend_path "$PATH" "$runtimeBin")
$@
)
;;
"use")
echo "Adding" $runtimeBin "to process PATH"
PATH=$(__dnvm_strip_path "$PATH" "/bin") PATH=$(__dnvm_strip_path "$PATH" "/bin")
PATH=$(__dnvm_prepend_path "$PATH" "$runtimeBin") PATH=$(__dnvm_prepend_path "$PATH" "$runtimeBin")
if [[ -n $persistent ]]; then if [[ -n $persistent ]]; then
local runtimeVersion=$(__dnvm_package_version "$runtimeFullName") local runtimeVersion=$(__dnvm_package_version "$runtimeFullName")
$_DNVM_COMMAND_NAME alias default "$runtimeVersion" $_DNVM_COMMAND_NAME alias default "$runtimeVersion"
fi fi
;;
esac
;; ;;
"alias" ) "alias" )
[[ $# -gt 3 ]] && __dnvm_help && return [[ $# -gt 7 ]] && __dnvm_help && return
[[ ! -e "$_DNVM_ALIAS_DIR/" ]] && mkdir "$_DNVM_ALIAS_DIR/" > /dev/null [[ ! -e "$_DNVM_ALIAS_DIR/" ]] && mkdir "$_DNVM_ALIAS_DIR/" > /dev/null
if [[ $# == 1 ]]; then if [[ $# == 1 ]]; then
echo "" echo ""
local format="%-20s %s\n" local format="%-25s %s\n"
printf "$format" "Alias" "Name" printf "$format" "Alias" "Name"
printf "$format" "-----" "----" printf "$format" "-----" "----"
if [ -d "$_DNVM_ALIAS_DIR" ]; then if [ -d "$_DNVM_ALIAS_DIR" ]; then
@ -341,17 +587,32 @@ dnvm()
echo "" echo ""
return return
fi fi
shift
local name="$1"
local name="$2" if [[ $# == 1 ]]; then
if [[ $# == 2 ]]; then
[[ ! -e "$_DNVM_ALIAS_DIR/$name.alias" ]] && echo "There is no alias called '$name'" && return [[ ! -e "$_DNVM_ALIAS_DIR/$name.alias" ]] && echo "There is no alias called '$name'" && return
cat "$_DNVM_ALIAS_DIR/$name.alias" cat "$_DNVM_ALIAS_DIR/$name.alias"
echo "" echo ""
return return
fi fi
local runtimeFullName=$(__dnvm_requested_version_or_alias "$3") shift
local versionOrAlias="$1"
shift
while [ $# -ne 0 ]
do
if [[ $1 == "-a" || $1 == "-arch" ]]; then
local arch=$2
shift
elif [[ $1 == "-r" || $1 == "-runtime" ]]; then
local runtime=$2
shift
fi
shift
done
local runtimeFullName=$(__dnvm_requested_version_or_alias "$versionOrAlias" "$runtime" "$arch")
[[ ! -d "$_DNVM_USER_PACKAGES/$runtimeFullName" ]] && echo "$runtimeFullName is not an installed $_DNVM_RUNTIME_SHORT_NAME version" && return 1 [[ ! -d "$_DNVM_USER_PACKAGES/$runtimeFullName" ]] && echo "$runtimeFullName is not an installed $_DNVM_RUNTIME_SHORT_NAME version" && return 1
@ -398,29 +659,29 @@ dnvm()
done done
fi fi
local formatString="%-6s %-20s %-7s %-20s %s\n" local formatString="%-6s %-20s %-7s %-4s %-20s %s\n"
printf "$formatString" "Active" "Version" "Runtime" "Location" "Alias" printf "$formatString" "Active" "Version" "Runtime" "Arch" "Location" "Alias"
printf "$formatString" "------" "-------" "-------" "--------" "-----" printf "$formatString" "------" "-------" "-------" "----" "--------" "-----"
local formattedHome=`(echo $_DNVM_USER_PACKAGES | sed s=$HOME=~=g)` local formattedHome=`(echo $_DNVM_USER_PACKAGES | sed s=$HOME=~=g)`
for f in $(find $_DNVM_USER_PACKAGES -name "$searchGlob" \( -type d -or -type l \) -prune -exec basename {} \;); do for f in $(find $_DNVM_USER_PACKAGES -name "$searchGlob" \( -type d -or -type l \) -prune -exec basename {} \;); do
local active="" local active=""
[[ $PATH == *"$_DNVM_USER_PACKAGES/$f/bin"* ]] && local active=" *" [[ $PATH == *"$_DNVM_USER_PACKAGES/$f/bin"* ]] && local active=" *"
local pkgName=$(__dnvm_package_runtime "$f") local pkgRuntime=$(__dnvm_package_runtime "$f")
local pkgName=$(__dnvm_package_name "$f")
local pkgVersion=$(__dnvm_package_version "$f") local pkgVersion=$(__dnvm_package_version "$f")
local pkgArch=$(__dnvm_package_arch "$f")
local alias="" local alias=""
local delim="" local delim=""
for i in "${arr[@]}"; do for i in "${arr[@]}"; do
temp="$_DNVM_RUNTIME_PACKAGE_NAME-$pkgName.$pkgVersion" if [[ ${i#*/} == "$pkgName.$pkgVersion" ]]; then
temp2="$_DNVM_RUNTIME_PACKAGE_NAME-$pkgName-x86.$pkgVersion"
if [[ ${i#*/} == $temp || ${i#*/} == $temp2 ]]; then
alias+="$delim${i%/*}" alias+="$delim${i%/*}"
delim=", " delim=", "
fi fi
done done
printf "$formatString" "$active" "$pkgVersion" "$pkgName" "$formattedHome" "$alias" printf "$formatString" "$active" "$pkgVersion" "$pkgRuntime" "$pkgArch" "$formattedHome" "$alias"
[[ $# == 2 ]] && echo "" && return 0 [[ $# == 2 ]] && echo "" && return 0
done done