diff --git a/.gitattributes b/.gitattributes index 5bfd3199c0181..5d3dbc3b3ac65 100644 --- a/.gitattributes +++ b/.gitattributes @@ -7,7 +7,7 @@ /configure text eol=lf # our cmd scripts always need to be CRLF -/bin/*.cmd text eol=crlf +/bin/**/*.cmd text eol=crlf # ignore all line endings in node_modules since we dont control that /node_modules/** -text diff --git a/bin/node-gyp-bin/node-gyp b/bin/node-gyp-bin/node-gyp new file mode 100755 index 0000000000000..70efb6f339f76 --- /dev/null +++ b/bin/node-gyp-bin/node-gyp @@ -0,0 +1,6 @@ +#!/usr/bin/env sh +if [ "x$npm_config_node_gyp" = "x" ]; then + node "`dirname "$0"`/../../node_modules/node-gyp/bin/node-gyp.js" "$@" +else + "$npm_config_node_gyp" "$@" +fi diff --git a/bin/node-gyp-bin/node-gyp.cmd b/bin/node-gyp-bin/node-gyp.cmd new file mode 100755 index 0000000000000..083c9c58a502a --- /dev/null +++ b/bin/node-gyp-bin/node-gyp.cmd @@ -0,0 +1,5 @@ +if not defined npm_config_node_gyp ( + node "%~dp0\..\..\node_modules\node-gyp\bin\node-gyp.js" %* +) else ( + node "%npm_config_node_gyp%" %* +) diff --git a/test/bin/windows-shims.js b/test/bin/windows-shims.js index 5e8a75842293d..5fa6ff142b737 100644 --- a/test/bin/windows-shims.js +++ b/test/bin/windows-shims.js @@ -1,20 +1,23 @@ const t = require('tap') const { spawnSync } = require('child_process') const { resolve, join, extname, basename, sep } = require('path') -const { copyFileSync, readFileSync, chmodSync, readdirSync, rmSync } = require('fs') +const { copyFileSync, readFileSync, chmodSync, readdirSync, rmSync, statSync } = require('fs') const Diff = require('diff') const { sync: which } = require('which') const { version } = require('../../package.json') -const ROOT = resolve(__dirname, '../..') -const BIN = join(ROOT, 'bin') -const SHIMS = readdirSync(BIN).reduce((acc, shim) => { - if (extname(shim) !== '.js') { - acc[shim] = readFileSync(join(BIN, shim), 'utf-8') +const readNonJsFiles = (dir) => readdirSync(dir).reduce((acc, shim) => { + const p = join(dir, shim) + if (extname(p) !== '.js' && !statSync(p).isDirectory()) { + acc[shim] = readFileSync(p, 'utf-8') } return acc }, {}) +const ROOT = resolve(__dirname, '../..') +const BIN = join(ROOT, 'bin') +const SHIMS = readNonJsFiles(BIN) +const NODE_GYP = readNonJsFiles(join(BIN, 'node-gyp-bin')) const SHIM_EXTS = [...new Set(Object.keys(SHIMS).map(p => extname(p)))] // windows requires each segment of a command path to be quoted when using shell: true @@ -63,6 +66,21 @@ t.test('shim contents', t => { }) }) +t.test('node-gyp', t => { + // these files need to exist to avoid breaking yarn 1.x + + for (const [key, file] of Object.entries(NODE_GYP)) { + t.match(file, /npm_config_node_gyp/, `${key} contains env var`) + t.match( + file, + /[\\/]\.\.[\\/]\.\.[\\/]node_modules[\\/]node-gyp[\\/]bin[\\/]node-gyp\.js/, + `${key} contains path` + ) + } + + t.end() +}) + t.test('run shims', t => { const path = t.testdir({ ...SHIMS,