From 4234f62783c03e6740847bd57449dda8966e5043 Mon Sep 17 00:00:00 2001 From: Timothy Gu Date: Mon, 5 Oct 2015 22:05:10 -0700 Subject: [PATCH 1/3] Fix downloading npm for newer Node.js --- get_npm.js | 64 +++++++++++++++++++++++++----------------------------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/get_npm.js b/get_npm.js index b4deca4..a0ea307 100644 --- a/get_npm.js +++ b/get_npm.js @@ -3,53 +3,49 @@ var util = require('util'), path = require('path'), wget = require('./wget'); -var NPM_PKG_JSON_URL = 'https://raw.githubusercontent.com/%s/%s/deps/npm/package.json'; -// https://github.com/npm/npm/tags +var NPM_PKG_JSON_URL = 'https://raw.githubusercontent.com/%s/%s/deps/npm/package.json'; +// https://github.com/npm/npm/tags var NVMW_NPM_MIRROR = process.env.NVMW_NPM_MIRROR || 'https://github.com/npm/npm/archive'; var BASE_URL = NVMW_NPM_MIRROR + '/v%s.zip'; - + var targetDir = process.argv[2]; var versions = process.argv[3].split('/'); var binType = versions[0]; var binVersion = versions[1]; +var pkgUri; if (binType === 'iojs') { // detect npm version from https://iojs.org/dist/index.json var NVMW_IOJS_ORG_MIRROR = process.env.NVMW_IOJS_ORG_MIRROR || 'https://iojs.org/dist'; - var pkgUri = NVMW_IOJS_ORG_MIRROR + '/index.json'; - wget(pkgUri, function (filename, content) { - if (filename === null) { - return noNpmAndExit(); - } - var npmVersion; - var items = JSON.parse(content); - for (var i = 0; i < items.length; i++) { - var item = items[i]; - if (!npmVersion) { - // make sure has a npm version - npmVersion = item.npm; - } - if (item.version === binVersion && item.npm) { - npmVersion = item.npm; - break; - } - } - + pkgUri = NVMW_IOJS_ORG_MIRROR + '/index.json'; +} else { + // detect npm version from https://nodejs.org/dist/index.json + var NVMW_NODEJS_ORG_MIRROR = process.env.NVMW_NODEJS_ORG_MIRROR || 'https://nodejs.org/dist'; + pkgUri = NVMW_NODEJS_ORG_MIRROR + '/index.json'; +} +wget(pkgUri, function (filename, content) { + if (filename === null) { + return noNpmAndExit(); + } + var npmVersion; + var items = JSON.parse(content); + for (var i = 0; i < items.length; i++) { + var item = items[i]; if (!npmVersion) { - return noNpmAndExit(); + // make sure has a npm version + npmVersion = item.npm; } - downloadNpmZip(npmVersion); - }); -} else { - var pkgUri = util.format(NPM_PKG_JSON_URL, 'joyent/node', - binVersion === 'latest' ? 'master' : binVersion); - wget(pkgUri, function (filename, pkg) { - if (filename === null) { - return noNpmAndExit(); + if (item.version === binVersion && item.npm) { + npmVersion = item.npm; + break; } - downloadNpmZip(JSON.parse(pkg).version); - }); -} + } + + if (!npmVersion) { + return noNpmAndExit(); + } + downloadNpmZip(npmVersion); +}); function noNpmAndExit() { console.error('%s %s does not include npm', binType, binVersion); From a7102727adb104ae7b20a28bdc850a6538ecd4ea Mon Sep 17 00:00:00 2001 From: Timothy Gu Date: Mon, 5 Oct 2015 22:05:39 -0700 Subject: [PATCH 2/3] wget: Allow responses w/o content-length As is often the case for GitHub tarballs. --- wget.js | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/wget.js b/wget.js index fade3e4..698d05f 100644 --- a/wget.js +++ b/wget.js @@ -24,32 +24,37 @@ function wget(uri, callback) { } var contentLength = parseInt(res.headers['content-length'], 10); if (isNaN(contentLength)) { - console.log('Can\'t get \'content-length\''); - callback(null); - return; + console.warn('Can\'t get \'content-length\''); + } else { + console.log('Content length is %s', bytes(contentLength)); } - console.log('Content length is %s', bytes(contentLength)); - var data = new Buffer(contentLength); + var data = []; var offset = 0; var start = Date.now(); console.log(''); // New line for ESC_UP_CLL res.on('data', function (buf) { - buf.copy(data, offset); + data.push(buf); offset += buf.length; var use = Date.now() - start; if (use === 0) { use = 1; } - console.log(ESC_UP_CLL + 'Download %d%, %s / %s, %s/s ...', - parseInt(offset / contentLength * 100, 10), bytes(offset), bytes(contentLength), - bytes(offset / use * 1000)); + if (contentLength) { + console.log(ESC_UP_CLL + 'Download %d%, %s / %s, %s/s ...', + offset / contentLength * 100 | 0, bytes(offset), bytes(contentLength), + bytes(offset / use * 1000)); + } else { + console.log(ESC_UP_CLL + 'Download %s, %s/s ...', + bytes(offset), + bytes(offset / use * 1000)); + } }); res.on('end', function () { console.log('Donwload done'); - callback(filename, data); + callback(filename, Buffer.concat(data, offset)); }); }); From 04fbbdfbdbf14014476ab3fabb4da345bbfb89ed Mon Sep 17 00:00:00 2001 From: Timothy Gu Date: Mon, 5 Oct 2015 22:06:41 -0700 Subject: [PATCH 3/3] Support Node.js >= 4.0.0 --- nvmw.bat | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/nvmw.bat b/nvmw.bat index cce9b6a..e93b5e1 100644 --- a/nvmw.bat +++ b/nvmw.bat @@ -130,12 +130,18 @@ if %NODE_TYPE% == iojs ( ) else ( set NODE_EXE_URL=%NVMW_IOJS_ORG_MIRROR%/%NODE_VERSION%/win-x64/iojs.exe ) -) else ( +) else if %NODE_VERSION:~1,1% == 0 ( if %ARCH% == x32 ( set NODE_EXE_URL=%NVMW_NODEJS_ORG_MIRROR%/%NODE_VERSION%/node.exe ) else ( set NODE_EXE_URL=%NVMW_NODEJS_ORG_MIRROR%/%NODE_VERSION%/x64/node.exe ) +) else ( + if %ARCH% == x32 ( + set NODE_EXE_URL=%NVMW_NODEJS_ORG_MIRROR%/%NODE_VERSION%/win-x86/node.exe + ) else ( + set NODE_EXE_URL=%NVMW_NODEJS_ORG_MIRROR%/%NODE_VERSION%/win-x64/node.exe + ) ) set "NODE_HOME=%NVMW_HOME%%NODE_VERSION%"