You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by ra...@apache.org on 2018/09/16 16:10:57 UTC

[cordova-common] branch cross-spawn updated (a68fec2 -> 6e7177f)

This is an automated email from the ASF dual-hosted git repository.

raphinesse pushed a change to branch cross-spawn
in repository https://gitbox.apache.org/repos/asf/cordova-common.git.


 discard a68fec2  WIP proof of concept cross-spawn
     new 6e7177f  Use `cross-spawn` for platform-independent spawning

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (a68fec2)
            \
             N -- N -- N   refs/heads/cross-spawn (6e7177f)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org


[cordova-common] 01/01: Use `cross-spawn` for platform-independent spawning

Posted by ra...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

raphinesse pushed a commit to branch cross-spawn
in repository https://gitbox.apache.org/repos/asf/cordova-common.git

commit 6e7177fa1a20c446fca2d419f050b9dc52affc09
Author: Raphael von der GrĂ¼n <ra...@gmail.com>
AuthorDate: Sun Sep 9 13:44:26 2018 +0200

    Use `cross-spawn` for platform-independent spawning
---
 package.json            |  1 +
 spec/superspawn.spec.js | 21 +++++++++++++++++++++
 src/superspawn.js       | 50 +++----------------------------------------------
 3 files changed, 25 insertions(+), 47 deletions(-)

diff --git a/package.json b/package.json
index 19c5e27..1a1bcbb 100644
--- a/package.json
+++ b/package.json
@@ -25,6 +25,7 @@
   "dependencies": {
     "ansi": "^0.3.1",
     "bplist-parser": "^0.1.0",
+    "cross-spawn": "^6.0.5",
     "elementtree": "0.1.7",
     "endent": "^1.1.1",
     "fs-extra": "^6.0.1",
diff --git a/spec/superspawn.spec.js b/spec/superspawn.spec.js
index 5a63564..d506318 100644
--- a/spec/superspawn.spec.js
+++ b/spec/superspawn.spec.js
@@ -88,4 +88,25 @@ describe('spawn method', function () {
             });
     });
 
+    describe('operation on windows', () => {
+        const cp = require('child_process');
+
+        beforeEach(() => {
+            spyOn(cp, 'spawn').and.returnValue({ on: _ => _ });
+        });
+
+        it('should escape arguments if `cmd` is not an *.exe', () => {
+            if (process.platform !== 'win32') {
+                pending('test should only run on windows');
+            }
+
+            superspawn.spawn('npm.cmd', [ 'install', 'foo@^1.2.3' ]);
+            expect(cp.spawn).toHaveBeenCalledWith(
+                'cmd.exe',
+                [ '/d', '/s', '/c', '"npm.cmd ^"install^" ^"foo@^^1.2.3^""' ],
+                jasmine.objectContaining({ windowsVerbatimArguments: true })
+            );
+        });
+    });
+
 });
diff --git a/src/superspawn.js b/src/superspawn.js
index eae552c..7ddb89c 100644
--- a/src/superspawn.js
+++ b/src/superspawn.js
@@ -17,41 +17,13 @@
     under the License.
 */
 
-var child_process = require('child_process');
+var crossSpawn = require('cross-spawn');
 var fs = require('fs-extra');
-var path = require('path');
 var _ = require('underscore');
 var Q = require('q');
-var which = require('which');
 var events = require('./events');
 var iswin32 = process.platform === 'win32';
 
-// On Windows, spawn() for batch files requires absolute path & having the extension.
-function resolveWindowsExe (cmd) {
-    var winExtensions = ['.exe', '.bat', '.cmd', '.js', '.vbs'];
-    function isValidExe (c) {
-        return winExtensions.includes(path.extname(c)) && fs.existsSync(c);
-    }
-    if (isValidExe(cmd)) {
-        return cmd;
-    }
-    cmd = which.sync(cmd, { nothrow: true }) || cmd;
-    if (!isValidExe(cmd)) {
-        winExtensions.some(function (ext) {
-            if (fs.existsSync(cmd + ext)) {
-                cmd = cmd + ext;
-                return true;
-            }
-        });
-    }
-    return cmd;
-}
-
-function maybeQuote (a) {
-    if (/^[^"].*[ &].*[^"]/.test(a)) return '"' + a + '"';
-    return a;
-}
-
 /**
  * A special implementation for child_process.spawn that handles
  *   Windows-specific issues with batch files and spaces in paths. Returns a
@@ -91,22 +63,6 @@ exports.spawn = function (cmd, args, opts) {
     var spawnOpts = {};
     var d = Q.defer();
 
-    if (iswin32) {
-        cmd = resolveWindowsExe(cmd);
-        // If we couldn't find the file, likely we'll end up failing,
-        // but for things like "del", cmd will do the trick.
-        if (path.extname(cmd) !== '.exe') {
-            var cmdArgs = '"' + [cmd].concat(args).map(maybeQuote).join(' ') + '"';
-            // We need to use /s to ensure that spaces are parsed properly with cmd spawned content
-            args = [['/s', '/c', cmdArgs].join(' ')];
-            cmd = 'cmd';
-            spawnOpts.windowsVerbatimArguments = true;
-        } else if (!fs.existsSync(cmd)) {
-            // We need to use /s to ensure that spaces are parsed properly with cmd spawned content
-            args = ['/s', '/c', cmd].concat(args).map(maybeQuote);
-        }
-    }
-
     if (opts.stdio !== 'default') {
         // Ignore 'default' value for stdio because it corresponds to child_process's default 'pipe' option
         spawnOpts.stdio = opts.stdio;
@@ -129,9 +85,9 @@ exports.spawn = function (cmd, args, opts) {
         }
     }
 
-    events.emit(opts.printCommand ? 'log' : 'verbose', 'Running command: ' + maybeQuote(cmd) + ' ' + args.map(maybeQuote).join(' '));
+    events.emit(opts.printCommand ? 'log' : 'verbose', 'Running command: ' + cmd + ' ' + args.join(' '));
 
-    var child = child_process.spawn(cmd, args, spawnOpts);
+    var child = crossSpawn.spawn(cmd, args, spawnOpts);
     var capturedOut = '';
     var capturedErr = '';
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org