From 12d4fae91c3f125f889fb5fd44d18f2747629a24 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 18 Dec 2014 17:54:42 -0800 Subject: [PATCH] Fall back to system root for cmd.exe path --- spec/buffered-process-spec.coffee | 19 ++++++++++++++----- src/buffered-process.coffee | 10 +++++++++- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/spec/buffered-process-spec.coffee b/spec/buffered-process-spec.coffee index ad9ba2121..ea9abe001 100644 --- a/spec/buffered-process-spec.coffee +++ b/spec/buffered-process-spec.coffee @@ -1,5 +1,6 @@ -BufferedProcess = require '../src/buffered-process' ChildProcess = require 'child_process' +path = require 'path' +BufferedProcess = require '../src/buffered-process' describe "BufferedProcess", -> describe "when a bad command is specified", -> @@ -42,7 +43,7 @@ describe "BufferedProcess", -> expect(window.onerror.mostRecentCall.args[0]).toContain 'Failed to spawn command `bad-command-nope`' expect(window.onerror.mostRecentCall.args[4].name).toBe 'BufferedProcessError' - describe "when the explorer command is spawned on Windows", -> + describe "on Windows", -> originalPlatform = null beforeEach -> @@ -61,6 +62,14 @@ describe "BufferedProcess", -> afterEach -> Object.defineProperty process, 'platform', value: originalPlatform - it "doesn't quote arguments of the form /root,C...", -> - new BufferedProcess({command: 'explorer.exe', args: ['/root,C:\\foo']}) - expect(ChildProcess.spawn.argsForCall[0][1][2]).toBe '"explorer.exe /root,C:\\foo"' + describe "when the explorer command is spawned on Windows", -> + it "doesn't quote arguments of the form /root,C...", -> + new BufferedProcess({command: 'explorer.exe', args: ['/root,C:\\foo']}) + expect(ChildProcess.spawn.argsForCall[0][1][2]).toBe '"explorer.exe /root,C:\\foo"' + + it "spawns the command using a cmd.exe wrapper", -> + new BufferedProcess({command: 'dir'}) + expect(path.basename(ChildProcess.spawn.argsForCall[0][0])).toBe 'cmd.exe' + expect(ChildProcess.spawn.argsForCall[0][1][0]).toBe '/s' + expect(ChildProcess.spawn.argsForCall[0][1][1]).toBe '/c' + expect(ChildProcess.spawn.argsForCall[0][1][2]).toBe '"dir"' diff --git a/src/buffered-process.coffee b/src/buffered-process.coffee index c1dfab992..653ce1844 100644 --- a/src/buffered-process.coffee +++ b/src/buffered-process.coffee @@ -67,7 +67,7 @@ class BufferedProcess cmdArgs = ['/s', '/c', "\"#{cmdArgs.join(' ')}\""] cmdOptions = _.clone(options) cmdOptions.windowsVerbatimArguments = true - @process = ChildProcess.spawn(process.env.comspec or 'cmd.exe', cmdArgs, cmdOptions) + @process = ChildProcess.spawn(@getCmdPath(), cmdArgs, cmdOptions) else @process = ChildProcess.spawn(command, args, options) @killed = false @@ -199,6 +199,14 @@ class BufferedProcess else false + getCmdPath: -> + if process.env.comspec + process.env.compec + else if process.env.SystemRoot + path.join(process.env.SystemRoot, 'System32', 'cmd.exe') + else + 'cmd.exe' + # Public: Terminate the process. kill: -> return if @killed