From 6cc4cc66f1fb050dc4113e35cab59197fd48e04a Mon Sep 17 00:00:00 2001
From: isaacs <i@izs.me>
Date: Thu, 22 Aug 2019 00:58:06 -0700
Subject: [PATCH] explore: escape args properly on Windows Bash

Despite being bash, Node.js running on windows git mingw bash still
executes child processes using cmd.exe.  As a result, arguments in this
environment need to be escaped in the style of cmd.exe, not bash.
---
 lib/explore.js                | 6 ++++--
 lib/utils/escape-arg.js       | 4 ++--
 lib/utils/escape-exec-path.js | 4 ++--
 3 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/lib/explore.js b/lib/explore.js
index 826a527fa7ef3..0c9930f8e4ca7 100644
--- a/lib/explore.js
+++ b/lib/explore.js
@@ -9,10 +9,11 @@ var npm = require('./npm.js')
 var spawn = require('./utils/spawn')
 var path = require('path')
 var fs = require('graceful-fs')
-var isWindowsShell = require('./utils/is-windows-shell.js')
+var isWindows = require('./utils/is-windows.js')
 var escapeExecPath = require('./utils/escape-exec-path.js')
 var escapeArg = require('./utils/escape-arg.js')
 var output = require('./utils/output.js')
+var log = require('npmlog')
 
 function explore (args, cb) {
   if (args.length < 1 || !args[0]) return cb(explore.usage)
@@ -23,7 +24,7 @@ function explore (args, cb) {
 
   var shellArgs = []
   if (args) {
-    if (isWindowsShell) {
+    if (isWindows) {
       var execCmd = escapeExecPath(args.shift())
       var execArgs = [execCmd].concat(args.map(escapeArg))
       opts.windowsVerbatimArguments = true
@@ -49,6 +50,7 @@ function explore (args, cb) {
       )
     }
 
+    log.silly('explore', {sh, shellArgs, opts})
     var shell = spawn(sh, shellArgs, opts)
     shell.on('close', function (er) {
       // only fail if non-interactive.
diff --git a/lib/utils/escape-arg.js b/lib/utils/escape-arg.js
index d12ee5edf5820..114abaadaa090 100644
--- a/lib/utils/escape-arg.js
+++ b/lib/utils/escape-arg.js
@@ -1,6 +1,6 @@
 'use strict'
 var path = require('path')
-var isWindowsShell = require('./is-windows-shell.js')
+var isWindows = require('./is-windows.js')
 
 /*
 Escape the name of an executable suitable for passing to the system shell.
@@ -15,7 +15,7 @@ any single quotes in the filename.
 module.exports = escapify
 
 function escapify (str) {
-  if (isWindowsShell) {
+  if (isWindows) {
     return '"' + path.normalize(str) + '"'
   } else {
     if (/[^-_.~/\w]/.test(str)) {
diff --git a/lib/utils/escape-exec-path.js b/lib/utils/escape-exec-path.js
index bf94886efa331..42b64934867dd 100644
--- a/lib/utils/escape-exec-path.js
+++ b/lib/utils/escape-exec-path.js
@@ -1,6 +1,6 @@
 'use strict'
 var path = require('path')
-var isWindowsShell = require('./is-windows-shell.js')
+var isWindows = require('./is-windows.js')
 
 /*
 Escape the name of an executable suitable for passing to the system shell.
@@ -20,7 +20,7 @@ function windowsQuotes (str) {
 }
 
 function escapify (str) {
-  if (isWindowsShell) {
+  if (isWindows) {
     return path.normalize(str).split(/\\/).map(windowsQuotes).join('\\')
   } else if (/[^-_.~/\w]/.test(str)) {
     return "'" + str.replace(/'/g, "'\"'\"'") + "'"