@@ -146,7 +146,12 @@ nvm_has_system_iojs() {
146
146
}
147
147
148
148
nvm_is_version_installed () {
149
- [ -n " ${1-} " ] && [ -x " $( nvm_version_path " $1 " 2> /dev/null) " /bin/node ]
149
+ local NVM_OS
150
+ NVM_OS=" $( nvm_get_os) "
151
+ local NODE
152
+ NODE=' node'
153
+ [ " _${NVM_OS} " = " _win" ] && NODE=' node.exe'
154
+ [ -n " ${1-} " ] && [ -x " $( nvm_version_path " $1 " 2> /dev/null) " /bin/" ${NODE} " ]
150
155
}
151
156
152
157
nvm_print_npm_version () {
@@ -326,10 +331,14 @@ nvm_tree_contains_path() {
326
331
return 2
327
332
fi
328
333
334
+ local previous_pathdir
335
+ previous_pathdir=" ${node_path} "
329
336
local pathdir
330
- pathdir=$( dirname " ${node_path} " )
331
- while [ " ${pathdir} " != " " ] && [ " ${pathdir} " != " ." ] && [ " ${pathdir} " != " /" ] && [ " ${pathdir} " != " ${tree} " ]; do
332
- pathdir=$( dirname " ${pathdir} " )
337
+ pathdir=$( dirname " ${previous_pathdir} " )
338
+ while [ " ${pathdir} " != " " ] && [ " ${pathdir} " != " ." ] && [ " ${pathdir} " != " /" ] &&
339
+ [ " ${pathdir} " != " ${tree} " ] && [ " ${pathdir} " != " ${previous_pathdir} " ]; do
340
+ previous_pathdir=" ${pathdir} "
341
+ pathdir=$( dirname " ${previous_pathdir} " )
333
342
done
334
343
[ " ${pathdir} " = " ${tree} " ]
335
344
}
@@ -1559,7 +1568,7 @@ nvm_get_checksum() {
1559
1568
SHASUMS_URL=" ${MIRROR} /${3} /SHASUMS.txt"
1560
1569
fi
1561
1570
1562
- nvm_download -L -s " ${SHASUMS_URL} " -o - | command awk " { if (\" ${4} .tar. ${5} \" == \$ 2) print \$ 1}"
1571
+ nvm_download -L -s " ${SHASUMS_URL} " -o - | command awk " { if (\" ${4} .${5} \" == \$ 2) print \$ 1}"
1563
1572
}
1564
1573
1565
1574
nvm_print_versions () {
@@ -1761,6 +1770,7 @@ nvm_get_os() {
1761
1770
SunOS\ * ) NVM_OS=sunos ;;
1762
1771
FreeBSD\ * ) NVM_OS=freebsd ;;
1763
1772
AIX\ * ) NVM_OS=aix ;;
1773
+ CYGWIN* | MSYS* | MINGW* ) NVM_OS=win ;;
1764
1774
esac
1765
1775
nvm_echo " ${NVM_OS-} "
1766
1776
}
@@ -1858,6 +1868,57 @@ nvm_get_mirror() {
1858
1868
esac
1859
1869
}
1860
1870
1871
+ # args: os, prefixed version, tarball, extract directory
1872
+ nvm_install_binary_extract () {
1873
+ local NVM_OS
1874
+ local PREFIXED_VERSION
1875
+ local TARBALL
1876
+ local TMPDIR
1877
+ NVM_OS=" ${1} "
1878
+ PREFIXED_VERSION=" ${2} "
1879
+ TARBALL=" ${3} "
1880
+ TMPDIR=" ${4} "
1881
+
1882
+ local VERSION_PATH
1883
+
1884
+ [ -n " ${TMPDIR-} " ] && \
1885
+ command mkdir -p " ${TMPDIR} " && \
1886
+ VERSION_PATH=" $( nvm_version_path " ${PREFIXED_VERSION} " ) " || return 1
1887
+
1888
+ # For Windows system (GitBash with MSYS, Cygwin)
1889
+ if [ " ${NVM_OS} " = ' win' ]; then
1890
+ VERSION_PATH=" ${VERSION_PATH} /bin"
1891
+ command unzip -q " ${TARBALL} " -d " ${TMPDIR} " || return 1
1892
+ # For non Windows system (including WSL running on Windows)
1893
+ else
1894
+ local tar_compression_flag
1895
+ tar_compression_flag=' z'
1896
+ if nvm_supports_xz " ${VERSION} " ; then
1897
+ tar_compression_flag=' J'
1898
+ fi
1899
+
1900
+ local tar
1901
+ if [ " ${NVM_OS} " = ' aix' ]; then
1902
+ tar=' gtar'
1903
+ else
1904
+ tar=' tar'
1905
+ fi
1906
+ command " ${tar} " -x${tar_compression_flag} f " ${TARBALL} " -C " ${TMPDIR} " --strip-components 1 || return 1
1907
+ fi
1908
+
1909
+ command mkdir -p " ${VERSION_PATH} " || return 1
1910
+
1911
+ if [ " ${NVM_OS} " = ' win' ]; then
1912
+ command mv " ${TMPDIR} /" * /* " ${VERSION_PATH} " || return 1
1913
+ else
1914
+ command mv " ${TMPDIR} /" * " ${VERSION_PATH} " || return 1
1915
+ fi
1916
+
1917
+ command rm -rf " ${TMPDIR} " || return 1
1918
+
1919
+ return 0
1920
+ }
1921
+
1861
1922
# args: flavor, type, version, reinstall
1862
1923
nvm_install_binary () {
1863
1924
local FLAVOR
@@ -1882,19 +1943,15 @@ nvm_install_binary() {
1882
1943
local VERSION
1883
1944
VERSION=" $( nvm_strip_iojs_prefix " ${PREFIXED_VERSION} " ) "
1884
1945
1885
- if [ -z " $( nvm_get_os) " ]; then
1886
- return 2
1887
- fi
1946
+ local NVM_OS
1947
+ NVM_OS=" $( nvm_get_os) "
1888
1948
1889
- local tar_compression_flag
1890
- tar_compression_flag=' z'
1891
- if nvm_supports_xz " ${VERSION} " ; then
1892
- tar_compression_flag=' J'
1949
+ if [ -z " ${NVM_OS} " ]; then
1950
+ return 2
1893
1951
fi
1894
1952
1895
1953
local TARBALL
1896
1954
local TMPDIR
1897
- local VERSION_PATH
1898
1955
1899
1956
local PROGRESS_BAR
1900
1957
local NODE_OR_IOJS
@@ -1914,21 +1971,8 @@ nvm_install_binary() {
1914
1971
if [ -f " ${TARBALL} " ]; then
1915
1972
TMPDIR=" $( dirname " ${TARBALL} " ) /files"
1916
1973
fi
1917
- local tar
1918
- tar=' tar'
1919
- if [ " ${NVM_OS} " = ' aix' ]; then
1920
- tar=' gtar'
1921
- fi
1922
- if (
1923
- [ -n " ${TMPDIR-} " ] && \
1924
- command mkdir -p " ${TMPDIR} " && \
1925
- command " ${tar} " -x${tar_compression_flag} f " ${TARBALL} " -C " ${TMPDIR} " --strip-components 1 && \
1926
- VERSION_PATH=" $( nvm_version_path " ${PREFIXED_VERSION} " ) " && \
1927
- command mkdir -p " ${VERSION_PATH} " && \
1928
- command mv " ${TMPDIR} /" * " ${VERSION_PATH} " && \
1929
- command rm -rf " ${TMPDIR} "
1930
- ); then
1931
1974
1975
+ if nvm_install_binary_extract " ${NVM_OS} " " ${PREFIXED_VERSION} " " ${TARBALL} " " ${TMPDIR} " ; then
1932
1976
if [ -n " ${ALIAS-} " ]; then
1933
1977
nvm alias " ${ALIAS} " " ${provided_version} "
1934
1978
fi
@@ -2028,10 +2072,15 @@ nvm_download_artifact() {
2028
2072
local SLUG
2029
2073
SLUG=" $( nvm_get_download_slug " ${FLAVOR} " " ${KIND} " " ${VERSION} " ) "
2030
2074
2075
+ local NVM_OS
2076
+ NVM_OS=" $( nvm_get_os) "
2077
+
2031
2078
local COMPRESSION
2032
- COMPRESSION=' gz'
2033
- if nvm_supports_xz " ${VERSION} " ; then
2034
- COMPRESSION=' xz'
2079
+ COMPRESSION=' tar.gz'
2080
+ if [ " ${NVM_OS} " = " win" ]; then
2081
+ COMPRESSION=' zip'
2082
+ elif nvm_supports_xz " ${VERSION} " ; then
2083
+ COMPRESSION=' tar.xz'
2035
2084
fi
2036
2085
2037
2086
local CHECKSUM
@@ -2049,13 +2098,13 @@ nvm_download_artifact() {
2049
2098
)
2050
2099
2051
2100
local TARBALL
2052
- TARBALL=" ${tmpdir} /${SLUG} .tar. ${COMPRESSION} "
2101
+ TARBALL=" ${tmpdir} /${SLUG} .${COMPRESSION} "
2053
2102
local TARBALL_URL
2054
2103
if nvm_version_greater_than_or_equal_to " ${VERSION} " 0.1.14; then
2055
- TARBALL_URL=" ${MIRROR} /${VERSION} /${SLUG} .tar. ${COMPRESSION} "
2104
+ TARBALL_URL=" ${MIRROR} /${VERSION} /${SLUG} .${COMPRESSION} "
2056
2105
else
2057
2106
# node <= 0.1.13 does not have a directory
2058
- TARBALL_URL=" ${MIRROR} /${SLUG} .tar. ${COMPRESSION} "
2107
+ TARBALL_URL=" ${MIRROR} /${SLUG} .${COMPRESSION} "
2059
2108
fi
2060
2109
2061
2110
if [ -r " ${TARBALL} " ]; then
@@ -2317,6 +2366,36 @@ nvm_npmrc_bad_news_bears() {
2317
2366
return 1
2318
2367
}
2319
2368
2369
+ # args: path to check and transform if needed
2370
+ nvm_ensure_posix_path () {
2371
+ [ -z " $1 " ] && nvm_err " Need the location as first parameter" && return 1
2372
+ local location
2373
+ location=" $1 "
2374
+
2375
+ # If already posix path, just return it
2376
+ [ " $( printf ' %s' " $location " | command cut -b 1) " = " /" ] && nvm_echo " $location " && return 0
2377
+
2378
+ local letter
2379
+ letter=$( printf ' %s' " $location " | command cut -b 1 | command tr ' [:upper:]' ' [:lower:]' )
2380
+ local letter_upper
2381
+ letter_upper=$( printf ' %s' " $letter " | command tr ' [:lower:]' ' [:upper:]' )
2382
+ local letter_prefix
2383
+ [ -d ' /mnt/' ] && letter_prefix=' /mnt'
2384
+ # prefix like /mnt/c or /c
2385
+ if [ -d " $letter_prefix /$letter " ]; then
2386
+ letter_prefix=" $letter_prefix /$letter "
2387
+ # prefix like /mnt/C or /C
2388
+ elif [ -d " $letter_prefix /$letter_upper " ]; then
2389
+ letter_prefix=" $letter_prefix /$letter_upper "
2390
+ else
2391
+ nvm_err " Unable to convert the path to posix"
2392
+ return 1
2393
+ fi
2394
+ # Remove Windows prefix (eg. C:) and replace \ by /
2395
+ location=$( printf ' %s' " $location " | command cut -b 3- | command sed ' s#\\#/#g' )
2396
+ nvm_echo " ${letter_prefix}${location} "
2397
+ }
2398
+
2320
2399
nvm_die_on_prefix () {
2321
2400
local NVM_DELETE_PREFIX
2322
2401
NVM_DELETE_PREFIX=" ${1-} "
@@ -2346,6 +2425,9 @@ nvm_die_on_prefix() {
2346
2425
return 3
2347
2426
fi
2348
2427
2428
+ local NVM_OS
2429
+ NVM_OS=" $( nvm_get_os) "
2430
+
2349
2431
# npm normalizes NPM_CONFIG_-prefixed env vars
2350
2432
# https://github.com/npm/npmconf/blob/22827e4038d6eebaafeb5c13ed2b92cf97b8fb82/npmconf.js#L331-L348
2351
2433
# https://github.com/npm/npm/blob/5e426a78ca02d0044f8dd26e0c5f881217081cbd/lib/config/core.js#L343-L359
@@ -2357,6 +2439,9 @@ nvm_die_on_prefix() {
2357
2439
if [ -n " ${NVM_NPM_CONFIG_PREFIX_ENV-} " ]; then
2358
2440
local NVM_CONFIG_VALUE
2359
2441
eval " NVM_CONFIG_VALUE=\"\$ ${NVM_NPM_CONFIG_PREFIX_ENV} \" "
2442
+ if [ -n " $NVM_CONFIG_VALUE " ] && [ " _${NVM_OS} " = " _win" ]; then
2443
+ NVM_CONFIG_VALUE=" $( nvm_ensure_posix_path " $NVM_CONFIG_VALUE " ) "
2444
+ fi
2360
2445
if [ -n " ${NVM_CONFIG_VALUE-} " ] && ! nvm_tree_contains_path " ${NVM_DIR} " " ${NVM_CONFIG_VALUE} " ; then
2361
2446
nvm deactivate > /dev/null 2>&1
2362
2447
nvm_err " nvm is not compatible with the \" ${NVM_NPM_CONFIG_PREFIX_ENV} \" environment variable: currently set to \" ${NVM_CONFIG_VALUE} \" "
@@ -3130,8 +3215,13 @@ nvm() {
3130
3215
nvm_get_make_jobs
3131
3216
fi
3132
3217
3133
- NVM_NO_PROGRESS=" ${NVM_NO_PROGRESS:- ${noprogress} } " nvm_install_source " ${FLAVOR} " std " ${VERSION} " " ${NVM_MAKE_JOBS} " " ${ADDITIONAL_PARAMETERS} "
3134
- EXIT_CODE=$?
3218
+ if [ " _${NVM_OS} " = " _win" ]; then
3219
+ nvm_err " Unable to install from source for Windows"
3220
+ EXIT_CODE=1
3221
+ else
3222
+ NVM_NO_PROGRESS=" ${NVM_NO_PROGRESS:- ${noprogress} } " nvm_install_source " ${FLAVOR} " std " ${VERSION} " " ${NVM_MAKE_JOBS} " " ${ADDITIONAL_PARAMETERS} "
3223
+ EXIT_CODE=$?
3224
+ fi
3135
3225
fi
3136
3226
3137
3227
fi
@@ -3944,6 +4034,7 @@ nvm() {
3944
4034
nvm_npmrc_bad_news_bears \
3945
4035
nvm_get_colors nvm_set_colors nvm_print_color_code nvm_format_help_message_colors \
3946
4036
nvm_echo_with_colors nvm_err_with_colors \
4037
+ nvm_ensure_posix_path \
3947
4038
> /dev/null 2>&1
3948
4039
unset NVM_RC_VERSION NVM_NODEJS_ORG_MIRROR NVM_IOJS_ORG_MIRROR NVM_DIR \
3949
4040
NVM_CD_FLAGS NVM_BIN NVM_INC NVM_MAKE_JOBS \
0 commit comments