Skip to content

Commit a029c72

Browse files
fix
Signed-off-by: Roman Nikitenko <rnikiten@redhat.com>
1 parent 0509d39 commit a029c72

1 file changed

Lines changed: 38 additions & 11 deletions

File tree

code/extensions/che-commands/src/taskProvider.ts

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)