Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorRebecca Turner <me@re-becca.org>2015-09-10 01:41:42 +0300
committerRebecca Turner <me@re-becca.org>2015-09-10 22:16:47 +0300
commit25fbaedd68919223867c9b2c0856966c1981dd06 (patch)
tree16da1195606a03a37a0705f49fce111d18688b6f /test
parente6db459deac9713b584092c80dd014066e3a1d24 (diff)
gently-rm: Treat cmd-shims the same way we treat symlinks
PR-URL: https://github.com/npm/npm/pull/9537 Fixes: 9394
Diffstat (limited to 'test')
-rw-r--r--test/tap/gently-rm-cmdshims.js157
1 files changed, 157 insertions, 0 deletions
diff --git a/test/tap/gently-rm-cmdshims.js b/test/tap/gently-rm-cmdshims.js
new file mode 100644
index 000000000..ebe0b7d7a
--- /dev/null
+++ b/test/tap/gently-rm-cmdshims.js
@@ -0,0 +1,157 @@
+'use strict'
+var path = require('path')
+var fs = require('graceful-fs')
+var test = require('tap').test
+var mkdirp = require('mkdirp')
+var rimraf = require('rimraf')
+var npm = require('../../lib/npm.js')
+
+var work = path.join(__dirname, path.basename(__filename, '.js'))
+var doremove = path.join(work, 'doremove')
+var dontremove = path.join(work, 'dontremove')
+var example_json = {
+ name: 'example',
+ version: '1.0.0',
+ bin: {
+ 'example': 'example.js'
+ }
+}
+var example_bin =
+ '#!/usr/bin/env node\n' +
+ 'true\n'
+
+// NOTE: if this were actually produced on windows it would be \ not / of
+// course, buuut, path.resolve doesn't understand \ outside of windows =/
+var do_example_cmd =
+ '@IF EXIST "%~dp0\\node.exe" (\n' +
+ ' "%~dp0\\node.exe" "%~dp0\\../example/example.js" %*\n' +
+ ') ELSE (\n' +
+ ' @SETLOCAL\n' +
+ ' @SET PATHEXT=%PATHEXT:;.JS;=;%\n' +
+ ' node "%~dp0\\../example/example.js" %*\n' +
+ ')\n'
+
+var do_example_cygwin =
+ '#!/bin/sh\n' +
+ 'basedir=`dirname "$0"`\n' +
+ '\n' +
+ 'case `uname` in\n' +
+ ' *CYGWIN*) basedir=`cygpath -w "$basedir"`;;\n' +
+ 'esac\n' +
+ '\n' +
+ 'if [ -x "$basedir/node" ]; then\n' +
+ ' "$basedir/node" "$basedir/../example/example.js" "$@"\n' +
+ ' ret=$?\n' +
+ 'else\n' +
+ ' node "$basedir/../example/example.js" "$@"\n' +
+ ' ret=$?\n' +
+ 'fi\n' +
+ 'exit $ret\n'
+
+var dont_example_cmd =
+ '@IF EXIST "%~dp0\\node.exe" (\n' +
+ ' "%~dp0\\node.exe" "%~dp0\\../example-other/example.js" %*\n' +
+ ') ELSE (\n' +
+ ' @SETLOCAL\n' +
+ ' @SET PATHEXT=%PATHEXT:;.JS;=;%\n' +
+ ' node "%~dp0\\../example-other/example.js" %*\n' +
+ ')\n'
+
+var dont_example_cygwin =
+ '#!/bin/sh\n' +
+ 'basedir=`dirname "$0"`\n' +
+ '\n' +
+ 'case `uname` in\n' +
+ ' *CYGWIN*) basedir=`cygpath -w "$basedir"`;;\n' +
+ 'esac\n' +
+ '\n' +
+ 'if [ -x "$basedir/node" ]; then\n' +
+ ' "$basedir/node" "$basedir/../example-other/example.js" "$@"\n' +
+ ' ret=$?\n' +
+ 'else\n' +
+ ' node "$basedir/../example-other/example.js" "$@"\n' +
+ ' ret=$?\n' +
+ 'fi\n' +
+ 'exit $ret\n'
+
+function cleanup () {
+ rimraf.sync(work)
+}
+
+var doremove_module = path.join(doremove, 'node_modules', 'example')
+var doremove_example_cmd = path.join(doremove, 'node_modules', '.bin', 'example.cmd')
+var doremove_example_cygwin = path.join(doremove, 'node_modules', '.bin', 'example')
+var dontremove_module = path.join(dontremove, 'node_modules', 'example')
+var dontremove_example_cmd = path.join(dontremove, 'node_modules', '.bin', 'example.cmd')
+var dontremove_example_cygwin = path.join(dontremove, 'node_modules', '.bin', 'example')
+
+function setup () {
+ mkdirp.sync(doremove_module)
+ mkdirp.sync(path.join(doremove, 'node_modules', '.bin'))
+ fs.writeFileSync(path.join(doremove, 'node_modules', 'example', 'package.json'), JSON.stringify(example_json))
+ fs.writeFileSync(path.join(doremove, 'node_modules', 'example', 'example.js'), JSON.stringify(example_bin))
+ fs.writeFileSync(doremove_example_cmd, do_example_cmd)
+ fs.writeFileSync(doremove_example_cygwin, do_example_cygwin)
+
+ mkdirp.sync(dontremove_module)
+ mkdirp.sync(path.join(dontremove, 'node_modules', '.bin'))
+ fs.writeFileSync(path.join(dontremove, 'node_modules', 'example', 'package.json'), JSON.stringify(example_json))
+ fs.writeFileSync(path.join(dontremove, 'node_modules', 'example', 'example.js'), JSON.stringify(example_bin))
+ fs.writeFileSync(dontremove_example_cmd, dont_example_cmd)
+ fs.writeFileSync(dontremove_example_cygwin, dont_example_cygwin)
+}
+
+test('setup', function (t) {
+ cleanup()
+ setup()
+ npm.load({}, function () {
+ t.done()
+ })
+})
+
+// Like slide.chain, but runs all commands even if they have errors, also
+// throws away results.
+function runAll (cmds, done) {
+ runNext()
+ function runNext () {
+ if (cmds.length === 0) return done()
+ var cmdline = cmds.shift()
+ var cmd = cmdline.shift()
+ cmdline.push(runNext)
+ cmd.apply(null, cmdline)
+ }
+}
+
+test('remove-cmd-shims', function (t) {
+ t.plan(2)
+
+ var gentlyRm = require('../../lib/utils/gently-rm.js')
+ runAll([ [gentlyRm, doremove_example_cmd, true, doremove_module],
+ [gentlyRm, doremove_example_cygwin, true, doremove_module] ], function () {
+ fs.stat(doremove_example_cmd, function (er) {
+ t.is(er && er.code, 'ENOENT', 'cmd-shim was removed')
+ })
+ fs.stat(doremove_example_cygwin, function (er) {
+ t.is(er && er.code, 'ENOENT', 'cmd-shim cygwin script was removed')
+ })
+ })
+})
+
+test('dont-remove-cmd-shims', function (t) {
+ t.plan(2)
+ var gentlyRm = require('../../lib/utils/gently-rm.js')
+ runAll([ [gentlyRm, dontremove_example_cmd, true, dontremove_module],
+ [gentlyRm, dontremove_example_cygwin, true, dontremove_module] ], function () {
+ fs.stat(dontremove_example_cmd, function (er) {
+ t.is(er, null, 'cmd-shim was not removed')
+ })
+ fs.stat(dontremove_example_cygwin, function (er) {
+ t.is(er, null, 'cmd-shim cygwin script was not removed')
+ })
+ })
+})
+
+test('cleanup', function (t) {
+ cleanup()
+ t.done()
+})