@@ -33,15 +33,15 @@ export interface GradleTaskDefinition extends vscode.TaskDefinition {
3333
3434let autoDetectOverride : boolean = false ;
3535let cachedTasks : Promise < vscode . Task [ ] > | undefined ;
36- let refreshProcess : cp . ChildProcessWithoutNullStreams | undefined ;
36+ let gradleTasksProcess : cp . ChildProcessWithoutNullStreams | undefined ;
3737
3838export function enableTaskDetection ( ) {
3939 autoDetectOverride = true ;
4040}
4141
4242export function killRefreshProcess ( ) {
43- if ( refreshProcess ) {
44- refreshProcess . kill ( ) ;
43+ if ( gradleTasksProcess ) {
44+ gradleTasksProcess . kill ( ) ;
4545 }
4646}
4747
@@ -133,23 +133,22 @@ export class GradleTaskProvider implements vscode.TaskProvider {
133133 return emptyTasks ;
134134 }
135135
136- const tasks : vscode . Task [ ] = [ ] ;
137-
138- for ( const gradleProject of gradleProjects ) {
139- for ( const gradleTask of gradleProject . tasks ) {
140- tasks . push (
141- await createTask (
142- gradleTask ,
143- folder ! ,
144- command ,
145- rootProject . name ,
146- vscode . Uri . file ( gradleProject . buildFile )
136+ return gradleProjects . reduce (
137+ ( allTasks : vscode . Task [ ] , gradleProject : GradleProject ) => {
138+ return allTasks . concat (
139+ gradleProject . tasks . map ( gradleTask =>
140+ createTaskFromGradleTask (
141+ gradleTask ,
142+ folder ! ,
143+ command ,
144+ rootProject . name ,
145+ vscode . Uri . file ( gradleProject . buildFile )
146+ )
147147 )
148148 ) ;
149- }
150- }
151-
152- return tasks ;
149+ } ,
150+ [ ]
151+ ) ;
153152 }
154153
155154 private async getProjectsFromGradle (
@@ -164,7 +163,7 @@ export class GradleTaskProvider implements vscode.TaskProvider {
164163 const command = getTasksScriptCommand ( ) ;
165164 const cwd = this . context . asAbsolutePath ( 'lib' ) ;
166165 const args = [ folder . uri . fsPath , tempFile ] ;
167- return spawn ( command , args , { cwd } , this . outputChannel )
166+ return executeGradleTasksCommand ( command , args , { cwd } , this . outputChannel )
168167 . then ( ( ) => fs . promises . readFile ( tempFile , 'utf8' ) )
169168 . finally ( async ( ) => {
170169 this . statusBarItem . hide ( ) ;
@@ -221,35 +220,21 @@ export function getTasksScriptCommand(): string {
221220 }
222221}
223222
224- export async function createTask (
225- gradleTask : GradleTask ,
223+ export function createTaskFromDefinition (
224+ definition : vscode . TaskDefinition ,
226225 folder : vscode . WorkspaceFolder ,
227- command : string ,
228- rootProject : string ,
229- buildFile : vscode . Uri
230- ) : Promise < vscode . Task > {
231- function getCommandLine ( task : string ) : string {
232- return `"${ command } " ${ task } ` ;
233- }
234-
235- const friendlyTaskName = gradleTask . path . replace ( / ^ : / , '' ) ;
236- const definition : GradleTaskDefinition = {
237- type : 'gradle' ,
238- script : friendlyTaskName ,
239- description : gradleTask . description ,
240- group : ( gradleTask . group || 'other' ) . toLowerCase ( ) ,
241- project : gradleTask . project ,
242- buildFile : buildFile . fsPath ,
243- rootProject
244- } ;
226+ cmd : string ,
227+ args : string [ ] = [ ]
228+ ) {
229+ const crossShellCmd = `"${ cmd } "` ;
245230 const cwd = folder . uri . fsPath ;
246- const cmd = getCommandLine ( definition . script ) ;
231+ const allArgs = [ definition . script , ... args ] ;
247232 const task = new vscode . Task (
248233 definition ,
249234 folder ,
250235 definition . script ,
251236 'gradle' ,
252- new vscode . ShellExecution ( cmd , { cwd } ) ,
237+ new vscode . ShellExecution ( crossShellCmd , allArgs , { cwd } ) ,
253238 [ '$gradle' ]
254239 ) ;
255240 task . presentationOptions = {
@@ -260,6 +245,39 @@ export async function createTask(
260245 return task ;
261246}
262247
248+ export function createTaskFromGradleTask (
249+ gradleTask : GradleTask ,
250+ folder : vscode . WorkspaceFolder ,
251+ command : string ,
252+ rootProject : string ,
253+ buildFile : vscode . Uri ,
254+ shellArgs : string [ ] = [ ]
255+ ) : vscode . Task {
256+ const friendlyTaskName = gradleTask . path . replace ( / ^ : / , '' ) ;
257+ const definition : GradleTaskDefinition = {
258+ type : 'gradle' ,
259+ script : friendlyTaskName ,
260+ description : gradleTask . description ,
261+ group : ( gradleTask . group || 'other' ) . toLowerCase ( ) ,
262+ project : gradleTask . project ,
263+ buildFile : buildFile . fsPath ,
264+ rootProject
265+ } ;
266+ return createTaskFromDefinition ( definition , folder , command , shellArgs ) ;
267+ }
268+
269+ export async function cloneTask (
270+ task : vscode . Task ,
271+ args : string [ ] = [ ]
272+ ) : Promise < vscode . Task | undefined > {
273+ const folder = task . scope as vscode . WorkspaceFolder ;
274+ const command = await getGradleWrapperCommandFromPath ( folder . uri . fsPath ) ;
275+ if ( ! command ) {
276+ return undefined ;
277+ }
278+ return createTaskFromDefinition ( task . definition , folder , command , args ) ;
279+ }
280+
263281export async function hasGradleProject ( ) : Promise < boolean > {
264282 const folders = vscode . workspace . workspaceFolders ;
265283 if ( ! folders ) {
@@ -296,34 +314,33 @@ export function parseGradleProjects(buffer: Buffer | string): GradleProject[] {
296314function debugCommand (
297315 command : string ,
298316 args : ReadonlyArray < string > ,
299- options : cp . SpawnOptionsWithoutStdio ,
300317 outputChannel : vscode . OutputChannel
301318) {
302319 const message = `Executing: ${ command } ${ args . join ( ' ' ) } ` ;
303320 outputChannel . appendLine ( message ) ;
304321}
305322
306- export function spawn (
323+ export function executeGradleTasksCommand (
307324 command : string ,
308325 args : ReadonlyArray < string > = [ ] ,
309326 options : cp . SpawnOptionsWithoutStdio = { } ,
310327 outputChannel : vscode . OutputChannel
311328) : Promise < string > {
312- debugCommand ( command , args , options , outputChannel ) ;
329+ debugCommand ( command , args , outputChannel ) ;
313330 return new Promise ( ( resolve , reject ) => {
314- refreshProcess = cp . spawn ( command , args , options ) ;
315- refreshProcess . stdout . on ( 'data' , ( buffer : Buffer ) =>
331+ gradleTasksProcess = cp . spawn ( command , args , options ) ;
332+ gradleTasksProcess . stdout . on ( 'data' , ( buffer : Buffer ) =>
316333 outputChannel . append ( buffer . toString ( ) )
317334 ) ;
318- refreshProcess . stderr . on ( 'data' , ( buffer : Buffer ) =>
335+ gradleTasksProcess . stderr . on ( 'data' , ( buffer : Buffer ) =>
319336 outputChannel . append ( buffer . toString ( ) )
320337 ) ;
321- refreshProcess . on ( 'error' , reject ) ;
322- refreshProcess . on ( 'exit' , ( code : number ) => {
338+ gradleTasksProcess . on ( 'error' , reject ) ;
339+ gradleTasksProcess . on ( 'exit' , ( code : number ) => {
323340 if ( code === 0 ) {
324341 resolve ( ) ;
325342 } else {
326- reject ( ) ;
343+ reject ( new Error ( `Process exited with code ${ code } ` ) ) ;
327344 }
328345 } ) ;
329346 } ) ;
0 commit comments