@@ -129,23 +129,28 @@ export class DevfileTaskProvider implements vscode.TaskProvider {
129129 } ;
130130
131131 const writeEmitter = new vscode . EventEmitter < string > ( ) ;
132- const closeEmitter = new vscode . EventEmitter < void > ( ) ;
132+ const closeEmitter = new vscode . EventEmitter < number | void > ( ) ;
133133 const activeExecutions : vscode . TaskExecution [ ] = [ ] ;
134134
135135 const execution = new vscode . CustomExecution ( async ( ) : Promise < vscode . Pseudoterminal > => {
136136 const pty : vscode . Pseudoterminal = {
137137 onDidWrite : writeEmitter . event ,
138138 onDidClose : closeEmitter . event ,
139139 open : async ( ) => {
140+ let exitCode = 0 ;
140141 writeEmitter . fire ( `Running composite task: ${ name } \r\n` ) ;
141142 try {
142- await this . runComposite ( commandIds , parallel , writeEmitter , activeExecutions ) ;
143+ const result = await this . runComposite ( commandIds , parallel , writeEmitter , activeExecutions ) ;
144+ if ( result . failed ) {
145+ exitCode = 1 ;
146+ }
143147 writeEmitter . fire ( `Composite task finished: ${ name } \r\n` ) ;
144148 } catch ( error ) {
149+ exitCode = 1 ;
145150 writeEmitter . fire ( `Composite task failed: ${ name } \r\n` ) ;
146151 writeEmitter . fire ( `${ String ( error ) } \r\n` ) ;
147152 } finally {
148- closeEmitter . fire ( ) ;
153+ closeEmitter . fire ( exitCode ) ;
149154 }
150155 } ,
151156 close : ( ) => {
@@ -165,13 +170,13 @@ export class DevfileTaskProvider implements vscode.TaskProvider {
165170 parallel : boolean ,
166171 writeEmitter : vscode . EventEmitter < string > ,
167172 activeExecutions : vscode . TaskExecution [ ]
168- ) : Promise < void > {
173+ ) : Promise < { failed : boolean } > {
169174 const tasks = await vscode . tasks . fetchTasks ( { type : 'devfile' } ) ;
170175 const taskMap = new Map < string , vscode . Task > ( ) ;
171176
172177 for ( const task of tasks ) {
173178 const def = task . definition as DevfileTaskDefinition ;
174- if ( def ?. commandId ) {
179+ if ( def ?. commandId && ! def . command . startsWith ( 'composite:' ) ) {
175180 taskMap . set ( def . commandId , task ) ;
176181 }
177182 taskMap . set ( task . name , task ) ;
@@ -187,33 +192,48 @@ export class DevfileTaskProvider implements vscode.TaskProvider {
187192 }
188193 if ( ! targetTasks . length ) {
189194 writeEmitter . fire ( 'No tasks to run.\r\n' ) ;
190- return ;
195+ return { failed : true } ;
191196 }
192197
193198 if ( parallel ) {
194199 targetTasks . forEach ( task => writeEmitter . fire ( `Starting ${ task . name } \r\n` ) ) ;
195200 const executions = await Promise . all ( targetTasks . map ( task => vscode . tasks . executeTask ( task ) ) ) ;
196201 activeExecutions . push ( ...executions ) ;
197- await Promise . all ( executions . map ( ( execution , index ) => this . waitForTaskEnd ( execution , targetTasks [ index ] . name , writeEmitter ) ) ) ;
198- return ;
202+ const results = await Promise . all ( executions . map ( ( execution , index ) => this . waitForTaskEnd ( execution , targetTasks [ index ] . name , writeEmitter ) ) ) ;
203+ return { failed : results . some ( result => result . failed ) } ;
199204 }
200205
206+ let failed = false ;
201207 for ( const task of targetTasks ) {
202208 writeEmitter . fire ( `Starting ${ task . name } \r\n` ) ;
203209 const execution = await vscode . tasks . executeTask ( task ) ;
204210 activeExecutions . push ( execution ) ;
205- await this . waitForTaskEnd ( execution , task . name , writeEmitter ) ;
211+ const result = await this . waitForTaskEnd ( execution , task . name , writeEmitter ) ;
212+ if ( result . failed ) {
213+ failed = true ;
214+ }
206215 }
216+ return { failed } ;
207217 }
208218
209219 private waitForTaskEnd (
210220 execution : vscode . TaskExecution ,
211221 taskName : string ,
212222 writeEmitter : vscode . EventEmitter < string >
213- ) : Promise < void > {
223+ ) : Promise < { failed : boolean } > {
214224 return new Promise ( resolve => {
215225 let processEnded = false ;
216226 let exitCode : number | undefined ;
227+ let processStarted = false ;
228+ let processId : number | undefined ;
229+
230+ const startDisposable = vscode . tasks . onDidStartTaskProcess ( event => {
231+ if ( event . execution === execution ) {
232+ processStarted = true ;
233+ processId = event . processId ;
234+ writeEmitter . fire ( `Process started for ${ taskName } (pid ${ processId } )\r\n` ) ;
235+ }
236+ } ) ;
217237
218238 const processDisposable = vscode . tasks . onDidEndTaskProcess ( event => {
219239 if ( event . execution === execution ) {
@@ -224,18 +244,25 @@ export class DevfileTaskProvider implements vscode.TaskProvider {
224244
225245 const disposable = vscode . tasks . onDidEndTask ( event => {
226246 if ( event . execution === execution ) {
247+ startDisposable . dispose ( ) ;
227248 processDisposable . dispose ( ) ;
228249 disposable . dispose ( ) ;
250+ let failed = false ;
229251 if ( processEnded ) {
230252 if ( exitCode === 0 ) {
231253 writeEmitter . fire ( `Completed ${ taskName } (exit code 0)\r\n` ) ;
232254 } else {
233255 writeEmitter . fire ( `Completed ${ taskName } (exit code ${ exitCode } )\r\n` ) ;
256+ failed = true ;
234257 }
258+ } else if ( processStarted ) {
259+ writeEmitter . fire ( `Terminated ${ taskName } (pid ${ processId } )\r\n` ) ;
260+ failed = true ;
235261 } else {
236262 writeEmitter . fire ( `Terminated ${ taskName } \r\n` ) ;
263+ failed = true ;
237264 }
238- resolve ( ) ;
265+ resolve ( { failed } ) ;
239266 }
240267 } ) ;
241268 } ) ;
0 commit comments