diff --git a/kvm.sh b/kvm.sh index 6a098a461f..5974ef378c 100644 --- a/kvm.sh +++ b/kvm.sh @@ -1,9 +1,14 @@ # kvm.sh -# Source this file from you .bash-profile or script to use +# Source this file from your .bash-profile or script to use # With inspriation from nvm.sh SCRIPTPATH="$_" +#Exit script when any command returns non 0 exit code + +set -e +set -o pipefail + _kvm_has() { type "$1" > /dev/null 2>&1 return $? @@ -16,8 +21,11 @@ if _kvm_has "unsetopt"; then KVM_CD_FLAGS="-q" fi -USERKREPATH="~/.kre" +eval USERKREPATH=~/.kre USERKREPACKAGES="$USERKREPATH/packages" +MONO45= +X86= +X64= # Traverse up in directory tree to find containing folder _kvm_find_up() { @@ -57,7 +65,7 @@ _kvm_find_latest() { fi local url="https://www.myget.org/F/aspnetvnext/api/v2/GetUpdates()?packageIds=%27KRE-$platform-$architecture%27&versions=%270.0%27&includePrerelease=true&includeAllVersions=false" - local xml=$(curl -silent -u aspnetreadonly:4d8a2d9c-7b80-4162-9978-47e918c9658c $url) + local xml=$(curl -silent -L -u aspnetreadonly:4d8a2d9c-7b80-4162-9978-47e918c9658c $url) version=$(echo $xml | sed "s/.*<[a-zA-Z]:Version>\([^<]*\).*/\1/") @@ -77,20 +85,99 @@ _kvm_prepend_path() { } _kvm_download() { - local packageName="$1" - local destinationFolder="$2" - echo "download $packageName $destinationFolder - TBD" + local kreFullName="$1" + local kreFolder="$2" + + local pkgName=$(echo "$kreFullName" | sed "s/\([^.]*\).*/\1/") + local pkgVersion=$(echo "$kreFullName" | sed "s/[^.]*.\(.*\)/\1/") + local url="https://www.myget.org/F/aspnetvnext/api/v2/package/$pkgName/$pkgVersion" + local kreFile="$kreFolder/$kreFullName.nupkg" + + if [ -e "$kreFolder" ]; then + echo "$kreFullName already installed." + return 0 + fi + + echo "Downloading" $kreFullName "from https://www.myget.org/F/aspnetvnext/api/v2/" + + if ! _kvm_has "curl"; then + echo "KVM Needs curl to proceed." >&2; + return 1 + fi + + mkdir -p "$kreFolder" > /dev/null 2>&1 + + curl -silent -L -u aspnetreadonly:4d8a2d9c-7b80-4162-9978-47e918c9658c "$url" -o "$kreFile" + + _kvm_unpack $kreFile $kreFolder } _kvm_unpack() { - local file="$1" - local destinationFolder="$2" - echo "unpack $file $destinationFolder - TBD" + local kreFile="$1" + local kreFolder="$2" + + echo "Installing to $kreFolder" + + if ! _kvm_has "unzip"; then + echo "KVM Needs unzip to proceed." >&2; + return 1 + fi + + unzip $kreFile -d $kreFolder > /dev/null 2>&1 + + [ -e "$kreFolder/[Content_Types].xml" ] && rm "$kreFolder/[Content_Types].xml" + + [ -e "$kreFolder/_rels/" ] && rm -rf "$kreFolder/_rels/" + + [ -e "$kreFolder/package/" ] && rm -rf "$kreFolder/_package/" + +} + +# This is not really needed. Placeholder until I get clarification on the supported platforms for mono +_kvm_requested_platform() { + local default=$1 + + [[ $MONO45 ]] && echo "mono45" && return + + echo $default +} + +# Ditto - waiting for clarification on mono-x64 packages +_kvm_requested_architecture() { + local default=$1 + + [[ $X86 && $X64 ]] && echo "This command cannot accept both -x86 and -x64" && return 1 + + [[ $X86 ]] && echo "x86" && return + + [[ $X64 ]] && echo "x64" && return + + echo $default } _kvm_requested_version_or_alias() { local versionOrAlias="$1" - echo "Requested version or alias $versionOrAlias - TBD" + + if [ -e "$USERKREPATH/alias/$versionOrAlias.alias" ]; then + local aliasValue=$(cat "$USERKREPATH/alias/$versionOrAlias.alias") + local pkgName=$(echo $kreFullName | sed "s/\([^.]*\).*/\1/") + local pkgVersion=$(echo $kreFullName | sed "s/[^.]*\(.*\)/\1/") + local pkgPlatform=$(echo $pgkName | sed "s/.*-\([^-]*\).*/\1/" | _kvm_requested_platform) + local pkgArchitecture=$(echo $pgkName | sed "s/.*-.*-\([^-]*\).*/\1/" | _kvm_requested_architecture) + else + local pkgVersion=$versionOrAlias + local pkgPlatform=$(_kvm_requested_platform "mono45") + local pkgArchitecture=$(_kvm_requested_architecture "x86") + fi + + echo "KRE-$pkgPlatform-$pkgArchitecture.$pkgVersion" +} + +# This will be more relevant if we support global installs +_kvm_locate_kre_bin_from_full_name() { + local kreFullName=$1 + + [ -e "$USERKREPACKAGES/$kreFullName/bin" ] && echo "$USERKREPACKAGES/$kreFullName/bin" && return } kvm() @@ -116,10 +203,10 @@ kvm() echo "install requested KRE from feed" echo "add KRE bin to path of current command line" echo "" - echo "kvm use ||none [-p --persistent]" + echo "kvm use ||none [-p -persistent]" echo "| add KRE bin to path of current command line " echo "none remove KRE bin from path of current command line" - echo "-p --persistent persist selected version to .kvmrc" + echo "-p -persistent persist selected version to .kvmrc" echo "" echo "kvm list" echo "list KRE versions installed " @@ -163,15 +250,11 @@ kvm() fi echo "Adding $kreBin to current PATH" - - # Strip other version from PATH PATH=`_kvm_strip_path "$PATH" "/bin"` - # Prepend current version PATH=`_kvm_prepend_path "$PATH" "$kreBin"` else local kreFullName="$(_kvm_requested_version_or_alias $versionOrAlias)" local kreFolder="$USERKREPACKAGES/$kreFullName" - _kvm_download "$kreFullName" "$kreFolder" kvm use "$versionOrAlias" fi @@ -180,9 +263,50 @@ kvm() "use" ) [ $# -gt 3 ] && kvm help && return [ $# -lt 2 ] && kvm help && return - local version="$2" - local persist="$3" - echo "use $version - TBD ... " + + shift + local persistant= + + while [ $# -ne 0 ] + do + if [[ $1 == "-p" || $1 == "-persistant" ]]; then + local persistant="true" + else + local versionOrAlias=$1 + fi + shift + done + + if [[ $versionOrAlias == "none" ]]; then + echo "Removing KRE from process PATH" + # Strip other version from PATH + PATH=`_kvm_strip_path "$PATH" "/bin"` + + if [[ $persistent&& -e "$USERKREPATH/alias/default.alias" ]]; then + echo "Setting default KRE to none" + + rm "$USERKREPATH/alias/default.alias" + fi + return 0 + fi + + local kreFullName=$(_kvm_requested_version_or_alias "$versionOrAlias") + local kreBin=$(_kvm_locate_kre_bin_from_full_name "$kreFullName") + + if [[ ! $kreBin ]]; then + echo "Cannot find $kreFullName, do you need to run 'kvm install $versionOrAlias'?" + return 1 + fi + + echo "Adding" $kreBin "to process PATH" + + PATH=`_kvm_strip_path "$PATH" "/bin"` + PATH=`_kvm_prepend_path "$PATH" "$kreBin"` + + if [[ $persistent ]]; then + echo "Setting $kreBin as default KRE" + kvm alias default "$versionOrAlias" + fi ;; "alias" ) @@ -192,5 +316,13 @@ kvm() local semver="$3" echo "alias $alias $semver - TBD ..." + + ;; + "list" ) + # TBD, this lets our persistant impl work for now + echo "default" + echo "" esac } + +kvm list default >/dev/null && kvm use default >/dev/null || true