Implemented kvm install and kvm use

This commit is contained in:
Graeme Christie 2014-05-24 16:01:02 +08:00
parent 4d5b16f25f
commit ff41e7d743
1 changed files with 151 additions and 19 deletions

170
kvm.sh
View File

@ -1,9 +1,14 @@
# kvm.sh # 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 # With inspriation from nvm.sh
SCRIPTPATH="$_" SCRIPTPATH="$_"
#Exit script when any command returns non 0 exit code
set -e
set -o pipefail
_kvm_has() { _kvm_has() {
type "$1" > /dev/null 2>&1 type "$1" > /dev/null 2>&1
return $? return $?
@ -16,8 +21,11 @@ if _kvm_has "unsetopt"; then
KVM_CD_FLAGS="-q" KVM_CD_FLAGS="-q"
fi fi
USERKREPATH="~/.kre" eval USERKREPATH=~/.kre
USERKREPACKAGES="$USERKREPATH/packages" USERKREPACKAGES="$USERKREPATH/packages"
MONO45=
X86=
X64=
# Traverse up in directory tree to find containing folder # Traverse up in directory tree to find containing folder
_kvm_find_up() { _kvm_find_up() {
@ -57,7 +65,7 @@ _kvm_find_latest() {
fi 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 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/") version=$(echo $xml | sed "s/.*<[a-zA-Z]:Version>\([^<]*\).*/\1/")
@ -77,20 +85,99 @@ _kvm_prepend_path() {
} }
_kvm_download() { _kvm_download() {
local packageName="$1" local kreFullName="$1"
local destinationFolder="$2" local kreFolder="$2"
echo "download $packageName $destinationFolder - TBD"
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() { _kvm_unpack() {
local file="$1" local kreFile="$1"
local destinationFolder="$2" local kreFolder="$2"
echo "unpack $file $destinationFolder - TBD"
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() { _kvm_requested_version_or_alias() {
local versionOrAlias="$1" 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() kvm()
@ -116,10 +203,10 @@ kvm()
echo "install requested KRE from feed" echo "install requested KRE from feed"
echo "add KRE bin to path of current command line" echo "add KRE bin to path of current command line"
echo "" echo ""
echo "kvm use <semver>|<alias>|none [-p --persistent]" echo "kvm use <semver>|<alias>|none [-p -persistent]"
echo "<semver>|<alias> add KRE bin to path of current command line " echo "<semver>|<alias> add KRE bin to path of current command line "
echo "none remove KRE bin from 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 ""
echo "kvm list" echo "kvm list"
echo "list KRE versions installed " echo "list KRE versions installed "
@ -163,15 +250,11 @@ kvm()
fi fi
echo "Adding $kreBin to current PATH" echo "Adding $kreBin to current PATH"
# Strip other version from PATH
PATH=`_kvm_strip_path "$PATH" "/bin"` PATH=`_kvm_strip_path "$PATH" "/bin"`
# Prepend current version
PATH=`_kvm_prepend_path "$PATH" "$kreBin"` PATH=`_kvm_prepend_path "$PATH" "$kreBin"`
else else
local kreFullName="$(_kvm_requested_version_or_alias $versionOrAlias)" local kreFullName="$(_kvm_requested_version_or_alias $versionOrAlias)"
local kreFolder="$USERKREPACKAGES/$kreFullName" local kreFolder="$USERKREPACKAGES/$kreFullName"
_kvm_download "$kreFullName" "$kreFolder" _kvm_download "$kreFullName" "$kreFolder"
kvm use "$versionOrAlias" kvm use "$versionOrAlias"
fi fi
@ -180,9 +263,50 @@ kvm()
"use" ) "use" )
[ $# -gt 3 ] && kvm help && return [ $# -gt 3 ] && kvm help && return
[ $# -lt 2 ] && kvm help && return [ $# -lt 2 ] && kvm help && return
local version="$2"
local persist="$3" shift
echo "use $version - TBD ... " 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" ) "alias" )
@ -192,5 +316,13 @@ kvm()
local semver="$3" local semver="$3"
echo "alias $alias $semver - TBD ..." echo "alias $alias $semver - TBD ..."
;;
"list" )
# TBD, this lets our persistant impl work for now
echo "default"
echo ""
esac esac
} }
kvm list default >/dev/null && kvm use default >/dev/null || true