From 401e29083cb711cd361dbcc2dac9749a5cdd1980 Mon Sep 17 00:00:00 2001 From: Avital Oliver Date: Tue, 22 Jan 2013 23:04:04 -0800 Subject: [PATCH] npm: enable pinning subdependencies to github tarballs also some minor reorg --- lib/meteor_npm.js | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/lib/meteor_npm.js b/lib/meteor_npm.js index 14495b550d..d79e250abe 100644 --- a/lib/meteor_npm.js +++ b/lib/meteor_npm.js @@ -48,6 +48,7 @@ var meteorNpm = module.exports = { // - call `npm install`, which reads from npm-shrinkwrap.json // - call `npm install name@version` for any package that needs to be updated // - call `npm prune` to remove any unused packages from node_modules + // - delete package.json, to ensure that npm-shrinkwrap.json generated below doesn't contain "name" and "version" // - call `npm shrinkwrap` to update npm-shrinkwrap.json // - copy the temporary directory back to .npm self._updateExistingNpmDirectory(packageName, newPackageNpmDir, packageNpmDir, npmDependencies); @@ -104,7 +105,18 @@ var meteorNpm = module.exports = { // remove ununsed packages self._prune(newPackageNpmDir); - self._finalizeTmpPackageDirAndRename(newPackageNpmDir, packageNpmDir); + // delete package.json + fs.unlinkSync(path.join(newPackageNpmDir, 'package.json')); + + // if we had no installed dependencies to begine with, *DON'T* + // shrinkwrap. this is important so that we can pin versions of + // deep dependencies to tarballs, e.g. + // https://github.com/meteor/js-bson/tarball/master + if (!_.isEmpty(installedDependencies)) { + self._shrinkwrap(newPackageNpmDir); + } + + self._renameAlmostAtomically(newPackageNpmDir, packageNpmDir); } }, @@ -116,7 +128,9 @@ var meteorNpm = module.exports = { self._installNpmModule(name, version, newPackageNpmDir); }); - self._finalizeTmpPackageDirAndRename(newPackageNpmDir, packageNpmDir); + self._shrinkwrap(newPackageNpmDir); + + self._renameAlmostAtomically(newPackageNpmDir, packageNpmDir); }, _execFileSync: function(file, args, opts) { @@ -144,20 +158,14 @@ var meteorNpm = module.exports = { fs.writeFileSync(packageJsonPath, packageJsonContents); }, - // - call `npm shrinkwrap` - // - delete package.json // - rename original .npm dir to another name (require for atomicity in next step) // - atomically rename temporary package npm dir to the original package's .npm dir // - delete the renamed original .npm directory - _finalizeTmpPackageDirAndRename: function(newPackageNpmDir, packageNpmDir) { + _renameAlmostAtomically: function(newPackageNpmDir, packageNpmDir) { var self = this; - - if (fs.existsSync(path.join(newPackageNpmDir, 'package.json'))) - fs.unlinkSync(path.join(newPackageNpmDir, 'package.json')); - self._shrinkwrap(newPackageNpmDir); + var oldPackageNpmDir = packageNpmDir + '-old-' + self._randomToken();; if (fs.existsSync(packageNpmDir)) { - var oldPackageNpmDir = packageNpmDir + '-old-' + self._randomToken();; fs.renameSync(packageNpmDir, oldPackageNpmDir); fs.renameSync(newPackageNpmDir, packageNpmDir); files.rm_recursive(oldPackageNpmDir);