summaryrefslogtreecommitdiff
path: root/deps/npm/node_modules/bin-links/lib/fix-bin.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/npm/node_modules/bin-links/lib/fix-bin.js')
-rw-r--r--deps/npm/node_modules/bin-links/lib/fix-bin.js44
1 files changed, 44 insertions, 0 deletions
diff --git a/deps/npm/node_modules/bin-links/lib/fix-bin.js b/deps/npm/node_modules/bin-links/lib/fix-bin.js
new file mode 100644
index 0000000000..a87a4d6945
--- /dev/null
+++ b/deps/npm/node_modules/bin-links/lib/fix-bin.js
@@ -0,0 +1,44 @@
+// make sure that bins are executable, and that they don't have
+// windows line-endings on the hashbang line.
+const fs = require('fs')
+const { promisify } = require('util')
+
+const execMode = 0o777 & (~process.umask())
+
+const writeFileAtomic = require('write-file-atomic')
+const open = promisify(fs.open)
+const close = promisify(fs.close)
+const read = promisify(fs.read)
+const chmod = promisify(fs.chmod)
+const readFile = promisify(fs.readFile)
+
+const isWindowsHashBang = buf =>
+ buf[0] === '#'.charCodeAt(0) &&
+ buf[1] === '!'.charCodeAt(0) &&
+ /^#![^\n]+\r\n/.test(buf.toString())
+
+const isWindowsHashbangFile = file => {
+ const FALSE = () => false
+ return open(file, 'r').then(fd => {
+ const buf = Buffer.alloc(2048)
+ return read(fd, buf, 0, 2048, 0)
+ .then(
+ () => {
+ const isWHB = isWindowsHashBang(buf)
+ return close(fd).then(() => isWHB, () => isWHB)
+ },
+ // don't leak FD if read() fails
+ () => close(fd).then(FALSE, FALSE)
+ )
+ }, FALSE)
+}
+
+const dos2Unix = file =>
+ readFile(file, 'utf8').then(content =>
+ writeFileAtomic(file, content.replace(/^(#![^\n]+)\r\n/, '$1\n')))
+
+const fixBin = file => chmod(file, execMode)
+ .then(() => isWindowsHashbangFile(file))
+ .then(isWHB => isWHB ? dos2Unix(file) : null)
+
+module.exports = fixBin