Skip to content

Commit 080c9bc

Browse files
committed
fix: vscode v1_92 breaking api change when spawning .bat or .cmd files
Signed-off-by: Zoupers <1171443643@qq.com>
1 parent 6a2f0cd commit 080c9bc

File tree

4 files changed

+49
-15
lines changed

4 files changed

+49
-15
lines changed

src/cli.ts

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22

3-
import { spawn, spawnSync } from 'child_process';
3+
import { CommonSpawnOptions, spawn, spawnSync } from 'child_process';
44
import { platform } from 'os';
55
import { window } from 'vscode';
66
import { GaugeCommands, GRADLE_COMMAND, MAVEN_COMMAND } from './constants';
@@ -28,7 +28,15 @@ export class CLI {
2828
let mvnCommand = this.getCommand(MAVEN_COMMAND);
2929
let gradleCommand = this.getGradleCommand();
3030
if (!gaugeCommand || gaugeCommand === '') return new CLI(gaugeCommand, {}, mvnCommand, gradleCommand);
31-
let gv = spawnSync(gaugeCommand, [GaugeCommands.Version, GaugeCommands.MachineReadable]);
31+
let options: CommonSpawnOptions = {};
32+
if(platform() === "win32") {
33+
options.shell = true;
34+
}
35+
let gv = spawnSync(
36+
gaugeCommand,
37+
[GaugeCommands.Version, GaugeCommands.MachineReadable],
38+
options
39+
);
3240
let gaugeVersionInfo;
3341
try {
3442
gaugeVersionInfo = JSON.parse(gv.stdout.toString());
@@ -67,7 +75,15 @@ export class CLI {
6775
let oc = window.createOutputChannel("Gauge Install");
6876
let chan = new OutputChannel(oc, `Installing gauge ${language} plugin ...\n`, "");
6977
return new Promise((resolve, reject) => {
70-
let childProcess = spawn(this._gaugeCommand, [GaugeCommands.Install, language]);
78+
let options: CommonSpawnOptions = {};
79+
if (platform() === "win32") {
80+
options.shell = true;
81+
}
82+
let childProcess = spawn(
83+
this._gaugeCommand,
84+
[GaugeCommands.Install, language],
85+
options
86+
);
7187
childProcess.stdout.on('data', (chunk) => chan.appendOutBuf(chunk.toString()));
7288
childProcess.stderr.on('data', (chunk) => chan.appendErrBuf(chunk.toString()));
7389
childProcess.on('exit', (code) => {
@@ -102,10 +118,14 @@ export class CLI {
102118

103119
private static getCommand(command: string): string {
104120
let validExecExt = [""];
105-
if (platform() === 'win32') validExecExt.push(".bat", ".exe", ".cmd");
121+
let options: CommonSpawnOptions = {};
122+
if (platform() === 'win32') {
123+
validExecExt.push(".bat", ".exe", ".cmd");
124+
options.shell = true;
125+
}
106126
for (const ext of validExecExt) {
107127
let executable = `${command}${ext}`;
108-
if (!spawnSync(executable).error) return executable;
128+
if (!spawnSync(executable, [], options).error) return executable;
109129
}
110130
}
111131

src/execution/gaugeExecutor.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22

3-
import { ChildProcess, spawn } from 'child_process';
3+
import { ChildProcess, spawn, SpawnOptions } from 'child_process';
44
import { platform } from 'os';
55
import {
66
CancellationTokenSource, commands, Disposable, Position,
@@ -67,9 +67,11 @@ export class GaugeExecutor extends Disposable {
6767
const relPath = relative(config.getProject().root(), config.getStatus());
6868
this.preExecute.forEach((f) => { f.call(null, env, relPath); });
6969
this.aborted = false;
70-
let options = { cwd: config.getProject().root(), env: env , detached: false};
70+
let options: SpawnOptions = { cwd: config.getProject().root(), env: env , detached: false };
7171
if (platform() !== 'win32') {
7272
options.detached = true;
73+
} else {
74+
options.shell = true;
7375
}
7476
this.childProcess = spawn(cmd, args, options);
7577
this.childProcess.stdout.on('data', this.filterStdoutDataDumpsToTextLines((lineText: string) => {

src/gaugeWorkspace.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
CancellationTokenSource, commands, Disposable, OutputChannel, Uri,
77
window, workspace, WorkspaceConfiguration, WorkspaceFoldersChangeEvent
88
} from "vscode";
9-
import { DynamicFeature, LanguageClient, LanguageClientOptions, RevealOutputChannelOn } from "vscode-languageclient/node";
9+
import { DynamicFeature, LanguageClient, LanguageClientOptions, RevealOutputChannelOn, ServerOptions } from "vscode-languageclient/node";
1010
import { CLI } from './cli';
1111
import GaugeConfig from './config/gaugeConfig';
1212
import { GaugeJavaProjectConfig } from './config/gaugeProjectConfig';
@@ -146,12 +146,16 @@ export class GaugeWorkspace extends Disposable {
146146
let project = ProjectFactory.get(folder);
147147
if (this._clientsMap.has(project.root())) return;
148148
process.env.GAUGE_IGNORE_RUNNER_BUILD_FAILURES = "true";
149-
let serverOptions = {
150-
command: this.cli.gaugeCommand(),
151-
args: ["daemon", "--lsp", "--dir=" + project.root()],
152-
options: { env: { ...process.env, ...project.envs(this.cli) } }
149+
let serverOptions: ServerOptions = {
150+
command: this.cli.gaugeCommand(),
151+
args: ["daemon", "--lsp", "--dir=" + project.root()],
152+
options: { env: { ...process.env, ...project.envs(this.cli) } },
153153
};
154154

155+
if(platform() == "win32") {
156+
serverOptions.options.shell = true;
157+
}
158+
155159
this._launchConfig = workspace.getConfiguration(GAUGE_LAUNCH_CONFIG);
156160
if (this._launchConfig.get(DEBUG_LOG_LEVEL_CONFIG)) {
157161
serverOptions.args.push("-l");

src/init/projectInit.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
'use strict';
22

3-
import { spawn, spawnSync } from 'child_process';
3+
import { CommonSpawnOptions, spawn, spawnSync } from 'child_process';
44
import * as fs from 'fs-extra';
55
import * as path from 'path';
66
import { commands, Disposable, Progress, Uri, window, workspace } from 'vscode';
77
import { CLI } from '../cli';
88
import { GaugeCommands, GaugeVSCodeCommands, INSTALL_INSTRUCTION_URI, VSCodeCommands } from "../constants";
99
import { FileListItem } from '../types/fileListItem';
10+
import { platform } from 'os';
1011
export class ProjectInitializer extends Disposable {
1112
private readonly _disposable: Disposable;
1213

@@ -67,7 +68,10 @@ export class ProjectInitializer extends Disposable {
6768

6869
private async createFromCommandLine(template: FileListItem, projectFolder: Uri, p: ProgressHandler) {
6970
let args = [GaugeCommands.Init, template.label];
70-
let options = { cwd: projectFolder.fsPath, env: process.env };
71+
let options: CommonSpawnOptions = { cwd: projectFolder.fsPath, env: process.env };
72+
if (platform() === "win32") {
73+
options.shell = true;
74+
}
7175
p.report("Initializing project...");
7276
let proc = spawn(this.cli.gaugeCommand(), args, options);
7377
proc.addListener('error', async (err) => {
@@ -82,7 +86,11 @@ export class ProjectInitializer extends Disposable {
8286

8387
private async getTemplatesList(): Promise<Array<FileListItem>> {
8488
let args = ["template", "--list", "--machine-readable"];
85-
let cp = spawnSync(this.cli.gaugeCommand(), args, { env: process.env });
89+
let options: CommonSpawnOptions = { env: process.env };
90+
if (platform() === "win32") {
91+
options.shell = true;
92+
}
93+
let cp = spawnSync(this.cli.gaugeCommand(), args, options);
8694
try {
8795
let _templates = JSON.parse(cp.stdout.toString());
8896
return _templates.map((tmpl) => new FileListItem(tmpl.key, tmpl.Description, tmpl.value));

0 commit comments

Comments
 (0)