Compare commits

..

8 Commits

Author SHA1 Message Date
Jordan Harband
ebdcdc4363 v0.28.0 2015-10-02 01:50:44 -07:00
Jordan Harband
b805de80cb Add PREFIX and NPM_CONFIG_PREFIX env vars to nvm debug 2015-10-01 10:05:13 -07:00
Jordan Harband
44f416d58f Create and use nvm_sanitize_path for nvm debug 2015-10-01 09:41:34 -07:00
Jordan Harband
3d1ccfec70 Sort nvm ls results by semver version, so the order goes: "unmerged node", "iojs", "merged node". 2015-09-30 22:05:18 -07:00
Jordan Harband
f73ee40dfe Merge pull request #854 from misterdjules/fix-node-smartos-support
Fix support for installing node on SmartOS
2015-10-01 00:04:13 -07:00
Julien Gilli
2d692d9d78 Fix support for installing node on SmartOS
uname on SmartOS cannot be used to guess if 32 and/or 64 bits binaries
are supported, and its output is different than other uname commands on
other operating systems.

This change uses pkg_info to determine what types of binaries pkgsrc
would install. If pkg_info fails to run or is not present, this change
falls back to using isainfo -n, which determines what the kernel
supports.

It allows users to install node binaries on Solaris derivatives. io.js
can also be installed on Solaris derivatives starting with version
v3.3.1.
2015-09-30 22:10:29 -07:00
Jordan Harband
8aebf86329 v0.27.1 2015-09-27 06:40:29 -07:00
Jordan Harband
39dad845cf Do not exit install.sh on errors (revert part of 0787a559). Fixes #853. 2015-09-27 06:32:00 -07:00
17 changed files with 302 additions and 20 deletions

View File

@@ -15,11 +15,11 @@ Note: `nvm` does not support [Fish] either (see [#303](https://github.com/creati
To install you could use the [install script][2] using cURL:
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.27.0/install.sh | bash
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.28.0/install.sh | bash
or Wget:
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.27.0/install.sh | bash
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.28.0/install.sh | bash
<sub>The script clones the nvm repository to `~/.nvm` and adds the source line to your profile (`~/.bash_profile`, `~/.zshrc` or `~/.profile`).</sub>
@@ -236,7 +236,7 @@ After the v0.8.6 release of node, nvm tries to install from binary packages. But
nvm install -s 0.8.6
[1]: https://github.com/creationix/nvm.git
[2]: https://github.com/creationix/nvm/blob/v0.27.0/install.sh
[2]: https://github.com/creationix/nvm/blob/v0.28.0/install.sh
[3]: https://travis-ci.org/creationix/nvm
[Urchin]: https://github.com/scraperwiki/urchin
[Fish]: http://fishshell.com

View File

@@ -1,7 +1,5 @@
#!/bin/bash
set -e
{ # this ensures the entire script is downloaded #
nvm_has() {
@@ -13,7 +11,7 @@ if [ -z "$NVM_DIR" ]; then
fi
nvm_latest_version() {
echo "v0.27.0"
echo "v0.28.0"
}
#

101
nvm.sh
View File

@@ -635,7 +635,6 @@ nvm_ls() {
s#^\($NVM_IOJS_PREFIX\)[-/]v#\1.v#;
s#^\($NVM_NODE_PREFIX\)[-/]v#\1.v#" \
| command sort -t. -u -k 2.2,2n -k 3,3n -k 4,4n \
| command sort -s -t- -k1.1,1.1 \
| command sed "
s/^\($NVM_IOJS_PREFIX\)\./\1-/;
s/^$NVM_NODE_PREFIX\.//" \
@@ -909,13 +908,30 @@ nvm_get_os() {
}
nvm_get_arch() {
local NVM_UNAME
NVM_UNAME="$(uname -m)"
local HOST_ARCH
local NVM_OS
local EXIT_CODE
NVM_OS="$(nvm_get_os)"
# If the OS is SunOS, first try to use pkgsrc to guess
# the most appropriate arch. If it's not available, use
# isainfo to get the instruction set supported by the
# kernel.
if [ "_$NVM_OS" = "_sunos" ]; then
HOST_ARCH=$(pkg_info -Q MACHINE_ARCH pkg_install)
EXIT_CODE=$?
if [ $EXIT_CODE -ne 0 ]; then
HOST_ARCH=$(isainfo -n)
fi
else
HOST_ARCH="$(uname -m)"
fi
local NVM_ARCH
case "$NVM_UNAME" in
x86_64) NVM_ARCH="x64" ;;
case "$HOST_ARCH" in
x86_64 | amd64) NVM_ARCH="x64" ;;
i*86) NVM_ARCH="x86" ;;
*) NVM_ARCH="$NVM_UNAME" ;;
*) NVM_ARCH="$HOST_ARCH" ;;
esac
echo "$NVM_ARCH"
}
@@ -1303,6 +1319,63 @@ nvm_die_on_prefix() {
fi
}
# Succeeds if $IOJS_VERSION represents an io.js version that has a
# Solaris binary, fails otherwise.
# Currently, only io.js 3.3.1 has a Solaris binary available, and it's the
# latest io.js version available. The expectation is that any potential io.js
# version later than v3.3.1 will also have Solaris binaries.
iojs_version_has_solaris_binary() {
local IOJS_VERSION=$1
local STRIPPED_IOJS_VERSION="$(nvm_strip_iojs_prefix $IOJS_VERSION)"
if [ "_$STRIPPED_IOJS_VERSION" = "$IOJS_VERSION" ]; then
return 1
fi
# io.js started shipping Solaris binaries with io.js v3.3.1
nvm_version_greater_than_or_equal_to "$STRIPPED_IOJS_VERSION" v3.3.1
}
# Succeeds if $NODE_VERSION represents a node version that has a
# Solaris binary, fails otherwise.
# Currently, node versions starting from v0.8.6 have a Solaris binary
# avaliable.
node_version_has_solaris_binary() {
local NODE_VERSION=$1
# Error out if $NODE_VERSION is actually an io.js version
local STRIPPED_IOJS_VERSION="$(nvm_strip_iojs_prefix $NODE_VERSION)"
if [ "_$STRIPPED_IOJS_VERSION" != "_$NODE_VERSION" ]; then
return 1
fi
# node (unmerged) started shipping Solaris binaries with v0.8.6 and
# node versions v1.0.0 or greater are not considered valid "unmerged" node
# versions.
nvm_version_greater_than_or_equal_to "$NODE_VERSION" v0.8.6 &&
! nvm_version_greater_than_or_equal_to "$NODE_VERSION" v1.0.0
}
# Succeeds if $VERSION represents a version (node, io.js or merged) that has a
# Solaris binary, fails otherwise.
nvm_has_solaris_binary() {
local VERSION=$1
if nvm_is_merged_node_version "$VERSION"; then
return 0 # All merged node versions have a Solaris binary
elif nvm_is_iojs_version "$VERSION"; then
iojs_version_has_solaris_binary "$VERSION"
else
node_version_has_solaris_binary "$VERSION"
fi
}
nvm_sanitize_path() {
local SANITIZED_PATH
SANITIZED_PATH="$1"
if [ "_$1" != "_$NVM_DIR" ]; then
SANITIZED_PATH="$(echo "$SANITIZED_PATH" | sed "s#$NVM_DIR#\$NVM_DIR#g")"
fi
echo "$SANITIZED_PATH" | sed "s#$HOME#\$HOME#g"
}
nvm() {
if [ $# -lt 1 ]; then
nvm help
@@ -1373,12 +1446,14 @@ nvm() {
setopt shwordsplit
fi
echo >&2 "\$SHELL: $SHELL"
echo >&2 "\$NVM_DIR: $(echo $NVM_DIR | sed "s#$HOME#\$HOME#g")"
echo >&2 "\$NVM_DIR: '$(nvm_sanitize_path "$NVM_DIR")'"
echo >&2 "\$PREFIX: '$(nvm_sanitize_path "$PREFIX")'"
echo >&2 "\$NPM_CONFIG_PREFIX: '$(nvm_sanitize_path "$NPM_CONFIG_PREFIX")'"
local NVM_DEBUG_OUTPUT
for NVM_DEBUG_COMMAND in 'nvm current' 'which node' 'which iojs' 'which npm' 'npm config get prefix' 'npm root -g'
do
NVM_DEBUG_OUTPUT="$($NVM_DEBUG_COMMAND 2>&1 | sed "s#$NVM_DIR#\$NVM_DIR#g")"
echo >&2 "$NVM_DEBUG_COMMAND: $NVM_DEBUG_OUTPUT"
NVM_DEBUG_OUTPUT="$($NVM_DEBUG_COMMAND 2>&1)"
echo >&2 "$NVM_DEBUG_COMMAND: $(nvm_sanitize_path "$NVM_DEBUG_OUTPUT")"
done
if [ "_$ZHS_HAS_SHWORDSPLIT_UNSET" = "_1" ] && nvm_has "unsetopt"; then
unsetopt shwordsplit
@@ -1485,10 +1560,12 @@ nvm() {
if [ "_$NVM_OS" = "_freebsd" ]; then
# node.js and io.js do not have a FreeBSD binary
nobinary=1
elif [ "_$NVM_OS" = "_sunos" ] && ([ "$NVM_IOJS" = true ] || [ "$NVM_NODE_MERGED" = true ]); then
# io.js does not have a SunOS binary
elif [ "_$NVM_OS" = "_sunos" ]; then
# Not all node/io.js versions have a Solaris binary
if ! nvm_has_solaris_binary "$VERSION"; then
nobinary=1
fi
fi
local NVM_INSTALL_SUCCESS
# skip binary install if "nobinary" option specified.
if [ $nobinary -ne 1 ] && nvm_binary_available "$VERSION"; then
@@ -2072,7 +2149,7 @@ $NVM_LS_REMOTE_POST_MERGED_OUTPUT" | command grep -v "N/A" | command sed '/^$/d'
nvm_remote_version "$2"
;;
"--version" )
echo "0.27.0"
echo "0.28.0"
;;
"unload" )
unset -f nvm nvm_print_versions nvm_checksum \

View File

@@ -1,6 +1,6 @@
{
"name": "nvm",
"version": "0.27.0",
"version": "0.28.0",
"description": "Node Version Manager - Simple bash script to manage multiple active node.js versions",
"directories": {
"test": "test"

13
test/common.sh Normal file
View File

@@ -0,0 +1,13 @@
assert_ok() {
local FUNCTION=$1
shift
$($FUNCTION $@) || die '"'"$FUNCTION $@"'" should have succeeded, but failed'
}
assert_not_ok() {
local FUNCTION=$1
shift
! $($FUNCTION $@) || die '"'"$FUNCTION $@"'" should have failed, but succeeded'
}

View File

@@ -0,0 +1,17 @@
#!/bin/sh
die () { echo $@ ; exit 1; }
. ../../../nvm.sh
. ../../common.sh
assert_not_ok iojs_version_has_solaris_binary ""
assert_not_ok iojs_version_has_solaris_binary "foo"
assert_not_ok iojs_version_has_solaris_binary "v1.1.0"
assert_ok iojs_version_has_solaris_binary "v3.3.1"
assert_ok iojs_version_has_solaris_binary "iojs-v3.3.1"
assert_ok iojs_version_has_solaris_binary "v3.3.2"
assert_ok iojs_version_has_solaris_binary "iojs-v3.3.2"
assert_ok iojs_version_has_solaris_binary "v3.4.1"
assert_ok iojs_version_has_solaris_binary "iojs-v3.4.1"

View File

@@ -0,0 +1,33 @@
#!/bin/sh
die () { echo $@ ; exit 1; }
. ../../../nvm.sh
. ../../common.sh
# Invalid version numbers fail
assert_not_ok node_version_has_solaris_binary ""
assert_not_ok node_version_has_solaris_binary "foo"
# "Invalid" node version numbers fail
assert_not_ok node_version_has_solaris_binary "v1.0.0"
assert_not_ok node_version_has_solaris_binary "v3.3.1"
# Valid io.js version numbers that have a Solaris binary fail
assert_not_ok node_version_has_solaris_binary "iojs-v3.3.1"
# Invvalid io.js version numbers fail
assert_not_ok node_version_has_solaris_binary "iojs-v0.12.7"
# Valid node version numbers that don't have a Solaris binary fail
assert_not_ok node_version_has_solaris_binary "v0.8.5"
# Valid node version numbers that have a Solaris binary succeed
assert_ok node_version_has_solaris_binary "v0.8.6"
assert_ok node_version_has_solaris_binary "v0.10.0"
assert_ok node_version_has_solaris_binary "v0.12.7"
# Valid "merged" version numbers fail, because they're not
# considered node version numbers
assert_not_ok node_version_has_solaris_binary "v4.0.0"
assert_not_ok node_version_has_solaris_binary "v4.1.1"

View File

@@ -0,0 +1,80 @@
#!/bin/sh
# Save the PATH as it was when the test started to restore it when it
# finishes
ORIG_PATH=$PATH
cleanup() {
# Restore the PATH as it was when the test started
export PATH=ORIG_PATH
}
die () { cleanup; echo $@ ; exit 1; }
. ../../../nvm.sh
# Directory where mocked binaries used by nvm_get_arch for each OS/arch are
# located
MOCKS_DIR=`pwd`/../../mocks
# Sets the PATH for these tests to include the symlinks to the mocked
# binaries
export PATH=.:${PATH}
# Setups mock binaries for a given OS and arch that mimic
# the output of the real binaries used by nvm_get_arch to guess
# the architecture of a given system.
setup_mock_arch() {
local OS=$1
local ARCH=$2
local OPT=$3
if [ "_$OS" = "_solaris" ] || [ "_$OS" = "_smartos" ]; then
ln -sf "${MOCKS_DIR}/isainfo_${ARCH}" ./isainfo
if [ "_$OPT" != "_no_pkg_info" ]; then
ln -sf "${MOCKS_DIR}/pkg_info_${ARCH}" ./pkg_info
fi
fi
ln -sf "${MOCKS_DIR}/uname_${OS}_${ARCH}" ./uname
}
# Cleans up the setup done by setup_mock_arch.
cleanup_mock_arch() {
local OS=$1
local ARCH=$2
if [ "_$OS" = "_solaris" ] || [ "_$OS" = "_smartos" ]; then
rm -f ./isainfo
rm -f ./pkg_info
fi
rm -f ./uname
}
# Runs nvm_get_arch for architecture $ARCH and OS $OS, and compares the
# expected output $EXPECTED_OUTPUT with the actual output. Does nothing
# and exits cleanly if they match, dies otherwise.
run_test() {
local ARCH=$1
local OS=$2
local EXPECTED_OUTPUT=$3
local OPT=$4
setup_mock_arch $OS $ARCH $OPT
local OUTPUT="$(nvm_get_arch)"
cleanup_mock_arch $OS $ARCH
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] ||
die "nvm_get_arch for OS \"$OS\" and arch \"$ARCH\" with OPT \"$OPT\" did
not return \"$EXPECTED_OUTPUT\"; got \"$OUTPUT\""
}
run_test x86 smartos x86
run_test x86 smartos x86 no_pkg_info
run_test amd64 smartos x64
run_test amd64 smartos x64 no_pkg_info
run_test x86 osx x86
run_test amd64 osx x64
cleanup

View File

@@ -0,0 +1,32 @@
#!/bin/sh
die () { echo $@ ; exit 1; }
. ../../../nvm.sh
. ../../common.sh
# Invalid version numbers fail
assert_not_ok nvm_has_solaris_binary ""
assert_not_ok nvm_has_solaris_binary "foo"
# "Invalid" node version numbers fail
assert_not_ok nvm_has_solaris_binary "v1.0.0"
assert_not_ok nvm_has_solaris_binary "v3.3.1"
# Valid io.js version numbers that have a Solaris binary succeed
assert_ok nvm_has_solaris_binary "iojs-v3.3.1"
# Invvalid io.js version numbers fail
assert_not_ok nvm_has_solaris_binary "iojs-v0.12.7"
# Valid node version numbers that don't have a Solaris binary fail
assert_not_ok nvm_has_solaris_binary "v0.8.5"
# Valid node version numbers that have a Solaris binary succeed
assert_ok nvm_has_solaris_binary "v0.8.6"
assert_ok nvm_has_solaris_binary "v0.10.0"
assert_ok nvm_has_solaris_binary "v0.12.7"
# Valid "merged" version numbers succeed
assert_ok nvm_has_solaris_binary "v4.0.0"
assert_ok nvm_has_solaris_binary "v4.1.1"

5
test/mocks/isainfo_amd64 Executable file
View File

@@ -0,0 +1,5 @@
if [ "_$1" = "_-n" ]; then
echo "amd64"
else
echo "amd64 i386"
fi

5
test/mocks/isainfo_x86 Executable file
View File

@@ -0,0 +1,5 @@
if [ "_$1" = "_-n" ]; then
echo "i386"
else
echo "i386"
fi

1
test/mocks/pkg_info_amd64 Executable file
View File

@@ -0,0 +1 @@
echo "x86_64"

1
test/mocks/pkg_info_x86 Executable file
View File

@@ -0,0 +1 @@
echo "i386"

5
test/mocks/uname_osx_amd64 Executable file
View File

@@ -0,0 +1,5 @@
if [ "_$1" = "_-m" ]; then
echo "x86_64"
else
echo "Darwin foo.local 13.4.0 Darwin Kernel Version 13.4.0: Sun Aug 17 19:50:11 PDT 2014; root:xnu-2422.115.4~1/RELEASE_X86_64 x86_64"
fi

5
test/mocks/uname_osx_x86 Executable file
View File

@@ -0,0 +1,5 @@
if [ "_$1" = "_-m" ]; then
echo "i386"
else
echo "Darwin foo.local 13.4.0 Darwin Kernel Version 13.4.0: Sun Aug 17 19:50:11 PDT 2014; root:xnu-2422.115.4~1/RELEASE_I386 i386"
fi

5
test/mocks/uname_smartos_amd64 Executable file
View File

@@ -0,0 +1,5 @@
if [ "_$1" = "_-m" ]; then
echo "i86pc"
else
echo "SunOS dev 5.11 joyent_20150219T102159Z i86pc i386 i86pc Solaris"
fi

5
test/mocks/uname_smartos_x86 Executable file
View File

@@ -0,0 +1,5 @@
if [ "_$1" = "_-m" ]; then
echo "i86pc"
else
echo "SunOS dev 5.11 joyent_20150219T102159Z i86pc i386 i86pc Solaris"
fi