From c19a49c0df82183097544f0dcb3426b6a65df1ad Mon Sep 17 00:00:00 2001 From: Dustin Campbell Date: Thu, 29 Sep 2016 09:18:29 -0700 Subject: [PATCH] Stream output of dotnet restore to .NET Pane (Fixes #445) --- src/features/commands.ts | 51 +++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/src/features/commands.ts b/src/features/commands.ts index c0facef072..fc7b3ee0bd 100644 --- a/src/features/commands.ts +++ b/src/features/commands.ts @@ -30,8 +30,8 @@ export default function registerCommands(server: OmnisharpServer, extensionPath: // register two commands for running and debugging xunit tests let d6 = dotnetTest.registerDotNetTestRunCommand(server); - let d7 = dotnetTest.registerDotNetTestDebugCommand(server); - + let d7 = dotnetTest.registerDotNetTestDebugCommand(server); + // register process picker for attach let attachItemsProvider = DotNetAttachItemsProviderFactory.Get(); let attacher = new AttachPicker(attachItemsProvider); @@ -92,7 +92,7 @@ function projectsToCommands(projects: protocol.DotNetProject[]): Promise { - if (!('DotNet in info') || info.DotNet.Projects.length < 1) { + if (!info.DotNet || info.DotNet.Projects.length < 1) { return Promise.reject("No .NET Core projects found"); } @@ -131,7 +131,7 @@ export function dotnetRestoreForProject(server: OmnisharpServer, fileName: strin return serverUtils.requestWorkspaceInformation(server).then(info => { - if (!('DotNet in info') || info.DotNet.Projects.length < 1) { + if (!info.DotNet || info.DotNet.Projects.length < 1) { return Promise.reject("No .NET Core projects found"); } @@ -139,28 +139,47 @@ export function dotnetRestoreForProject(server: OmnisharpServer, fileName: strin for (let project of info.DotNet.Projects) { if (project.Path === directory) { - return runDotnetRestore(directory, fileName); + return dotnetRestore(directory, fileName); } } }); } -function runDotnetRestore(cwd: string, fileName?: string) { - return new Promise((resolve, reject) => { +function dotnetRestore(cwd: string, fileName?: string) { + return new Promise((resolve, reject) => { channel.clear(); channel.show(); - let cmd = 'dotnet restore'; + let cmd = 'dotnet'; + let args = ['restore']; + if (fileName) { - cmd = `${cmd} "${fileName}"` + args.push(fileName); } - return cp.exec(cmd, { cwd: cwd, env: process.env }, (err, stdout, stderr) => { - channel.append(stdout.toString()); - channel.append(stderr.toString()); - if (err) { - channel.append('ERROR: ' + err); - } + let dotnet = cp.spawn(cmd, args, { cwd: cwd, env: process.env }); + + function handleData(stream: NodeJS.ReadableStream) { + stream.on('data', chunk => { + channel.append(chunk.toString()); + }); + + stream.on('err', err => { + channel.append(`ERROR: ${err}`); + }); + } + + handleData(dotnet.stdout); + handleData(dotnet.stderr); + + dotnet.on('close', (code, signal) => { + channel.appendLine(`Done: ${code}.`); + resolve(); + }); + + dotnet.on('error', err => { + channel.appendLine(`ERROR: ${err}`); + reject(err) }); }); } \ No newline at end of file