From 067ec181391b095cc2eaef313e77769d8b41e0ae Mon Sep 17 00:00:00 2001 From: David Greenspan Date: Fri, 14 Dec 2012 16:18:03 -0800 Subject: [PATCH] untargz in process when fetching packages --- lib/files.js | 9 +++++++++ lib/packages.js | 38 +++++++++++++++++++++----------------- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/lib/files.js b/lib/files.js index 5fe9f59a33..6abf92e13d 100644 --- a/lib/files.js +++ b/lib/files.js @@ -4,6 +4,7 @@ var _ = require('underscore'); var zlib = require("zlib"); var tar = require("tar"); var Future = require('fibers/future'); +var request = require('request'); var files = module.exports = { // A sort comparator to order files into load order. @@ -372,6 +373,14 @@ var files = module.exports = { throw error; // succeed! no return value. + }, + + // A thin wrapper around request(...) that makes the response "body" + // the main callback argument. This facilitates using `Future.wrap`. + getUrl: function (urlOrOptions, callback) { + return request(urlOrOptions, function (error, response, body) { + callback(error, body, response); + }); } }; diff --git a/lib/packages.js b/lib/packages.js index 4de640aa43..7d1920e202 100644 --- a/lib/packages.js +++ b/lib/packages.js @@ -412,7 +412,11 @@ var packages = module.exports = { }, existsInPackageCache: function (name, version) { - return fs.existsSync(path.join(__dirname, '..', 'cache', 'packages', name, version)); + // Look for presence of "package.js" file in directory so we don't count + // an empty dir as a package. An empty dir could be left by a failed + // package untarring, for example. + return fs.existsSync(path.join(__dirname, '..', 'cache', 'packages', name, version, + 'package.js')); }, // fetches the manifest file for the given release version. also fetches @@ -477,27 +481,27 @@ var packages = module.exports = { _.each(manifest.packages, function (version, name) { if (!self.existsInPackageCache(name, version)) { var packageDir = path.join(__dirname, '..', 'cache', 'packages', name, version); - files.mkdir_p(packageDir); + var packageUrl = PACKAGES_URLBASE + "/packages/" + name + "/" + + version + ".tar.gz"; - var future = new Future; - futures.push(future); - exec( - "curl " + PACKAGES_URLBASE + "/packages/" + name + "/" - + version + ".tar.gz" - + "| tar xvz", - {cwd: packageDir}, - function (error, stdout, stderr) { - console.log('stdout: ' + stdout); - console.log('stderr: ' + stderr); - if (error !== null) { - console.log('exec error: ' + error); - } - future['return'](); + console.log("Fetching " + packageUrl + "..."); + futures.push(Future.wrap(function (cb) { + files.getUrl({url: packageUrl, encoding: null}, function (error, result) { + if (! error && result) + result = { buffer: result, packageDir: packageDir }; + cb(error, result); }); - } + })()); + } }); Future.wait(futures); + + _.each(futures, function (f) { + var result = f.get(); + files.mkdir_p(result.packageDir); + files.extractTarGz(result.buffer, result.packageDir); + }); } } };