From 24acc9fc89d99d87cc66206c6c6f7cdc82fbf763 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=CC=81rton=20Salomva=CC=81ry?= Date: Mon, 22 Jul 2019 12:06:53 +0200 Subject: [PATCH] Revert "inflate-shrinkwrap: Stop shortcircuiting tree walks with fake children" This reverts commit 2f0c883519f17c94411dd1d9877c5666f260c12f to fix https://npm.community/t/installing-the-same-module-under-multiple-relative-paths-fails-on-linux/8863 Add (failing) test for failing relative paths Test case to shocase a bug reported here: https://npm.community/t/installing-the-same-module-under-multiple-relative-paths-fails-on-linux/8863/1 PR-URL: https://github.com/npm/cli/pull/217 Credit: @salomvary Close: #217 Reviewed-by: @isaacs --- lib/install/inflate-shrinkwrap.js | 2 +- test/tap/install-from-local-multipath.js | 182 +++++++++++++++++++++++ 2 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 test/tap/install-from-local-multipath.js diff --git a/lib/install/inflate-shrinkwrap.js b/lib/install/inflate-shrinkwrap.js index 5da9418bbdb7a..b0b71ef6b1323 100644 --- a/lib/install/inflate-shrinkwrap.js +++ b/lib/install/inflate-shrinkwrap.js @@ -167,7 +167,7 @@ function makeFakeChild (name, topPath, tree, sw, requested) { } const child = createChild({ package: pkg, - loaded: false, + loaded: true, parent: tree, children: [], fromShrinkwrap: requested, diff --git a/test/tap/install-from-local-multipath.js b/test/tap/install-from-local-multipath.js new file mode 100644 index 0000000000000..83dbdadde9e55 --- /dev/null +++ b/test/tap/install-from-local-multipath.js @@ -0,0 +1,182 @@ +var fs = require('graceful-fs') +var path = require('path') + +var mkdirp = require('mkdirp') +var osenv = require('osenv') +var rimraf = require('rimraf') +var test = require('tap').test + +var common = require('../common-tap') + +var root = common.pkg +// Allow running this test on older commits (useful for bisecting) +if (!root) { + var main = require.main.filename + root = path.resolve(path.dirname(main), path.basename(main, '.js')) +} +var pkg = path.join(root, 'parent') + +var EXEC_OPTS = { cwd: pkg } + +var parent = { + name: 'parent', + version: '0.0.0', + dependencies: { + 'child-1-1': 'file:../children/child-1-1', + 'child-1-2': 'file:../children/child-1-2', + 'child-2': 'file:../children/child-2' + } +} + +var parentLock = { + 'name': 'parent', + 'version': '1.0.0', + 'lockfileVersion': 1, + 'requires': true, + 'dependencies': { + 'child-1-1': { + 'version': 'file:../children/child-1-1', + 'requires': { + 'child-2': 'file:../children/child-2' + } + }, + 'child-1-2': { + 'version': 'file:../children/child-1-2', + 'requires': { + 'child-1-1': 'file:../children/child-1-1', + 'child-2': 'file:../children/child-2' + } + }, + 'child-2': { + 'version': 'file:../children/child-2' + } + } +} + +var child11 = { + name: 'parent', + version: '0.0.0', + 'dependencies': { + 'child-2': 'file:../child-2' + } +} + +var child11Lock = { + 'name': 'child-1-1', + 'version': '1.0.0', + 'lockfileVersion': 1, + 'requires': true, + 'dependencies': { + 'child-2': { + 'version': 'file:../child-2' + } + } +} + +var child12 = { + 'name': 'child-1-2', + 'version': '1.0.0', + 'dependencies': { + 'child-1-1': 'file:../child-1-1', + 'child-2': 'file:../child-2' + } +} + +var child12Lock = { + 'name': 'child-1-2', + 'version': '1.0.0', + 'lockfileVersion': 1, + 'requires': true, + 'dependencies': { + 'child-1-1': { + 'version': 'file:../child-1-1', + 'requires': { + 'child-2': 'file:../child-2' + } + }, + 'child-2': { + 'version': 'file:../child-2' + } + } +} + +var child2 = { + 'name': 'child-2', + 'version': '1.0.0', + 'dependencies': {} +} + +var child2Lock = { + 'name': 'child-2', + 'version': '1.0.0', + 'lockfileVersion': 1, + 'requires': true, + 'dependencies': {} +} + +test('setup', function (t) { + rimraf.sync(pkg) + mkdirp.sync(pkg) + fs.writeFileSync( + path.join(pkg, 'package.json'), + JSON.stringify(parent, null, 2) + ) + + fs.writeFileSync( + path.join(pkg, 'package-lock.json'), + JSON.stringify(parentLock, null, 2) + ) + + mkdirp.sync(path.join(root, 'children', 'child-1-1')) + fs.writeFileSync( + path.join(root, 'children', 'child-1-1', 'package.json'), + JSON.stringify(child11, null, 2) + ) + fs.writeFileSync( + path.join(root, 'children', 'child-1-1', 'package-lock.json'), + JSON.stringify(child11Lock, null, 2) + ) + + mkdirp.sync(path.join(root, 'children', 'child-1-2')) + fs.writeFileSync( + path.join(root, 'children', 'child-1-2', 'package.json'), + JSON.stringify(child12, null, 2) + ) + fs.writeFileSync( + path.join(root, 'children', 'child-1-2', 'package-lock.json'), + JSON.stringify(child12Lock, null, 2) + ) + + mkdirp.sync(path.join(root, 'children', 'child-2')) + fs.writeFileSync( + path.join(root, 'children', 'child-2', 'package.json'), + JSON.stringify(child2, null, 2) + ) + fs.writeFileSync( + path.join(root, 'children', 'child-2', 'package-lock.json'), + JSON.stringify(child2Lock, null, 2) + ) + + process.chdir(pkg) + t.end() +}) + +test('\'npm install\' should install local packages', function (t) { + common.npm( + [ + 'install', '.' + ], + EXEC_OPTS, + function (err, code) { + t.ifError(err, 'error should not exist') + t.notOk(code, 'npm install exited with code 0') + t.end() + } + ) +}) + +test('cleanup', function (t) { + process.chdir(osenv.tmpdir()) + rimraf.sync(root) + t.end() +})