Skip to content

Commit 73ad7de

Browse files
hide the parent terminal and makes only child terminal visible
1 parent 4ea254e commit 73ad7de

File tree

2 files changed

+71
-42
lines changed

2 files changed

+71
-42
lines changed

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

Lines changed: 62 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,7 @@ export class CompositeTaskBuilder {
5757
}
5858

5959
if (parallel) {
60-
queueMicrotask(() => {
61-
execs.forEach((e, index) => {
62-
const childTask = this.buildExecTask(e, index === 0);
63-
64-
vscode.tasks.executeTask(childTask);
65-
});
66-
});
67-
68-
return undefined;
60+
return this.buildParallelCrossComponent(command, execs);
6961
}
7062

7163
return this.buildSeqCrossComponent(command, execs);
@@ -239,6 +231,64 @@ export class CompositeTaskBuilder {
239231
);
240232
}
241233

234+
private buildParallelCrossComponent(
235+
command: any,
236+
execs: ResolvedExec[],
237+
): vscode.Task {
238+
const execution = new vscode.CustomExecution(async () => {
239+
const writeEmitter = new vscode.EventEmitter<string>();
240+
const closeEmitter = new vscode.EventEmitter<number>();
241+
242+
const pty: vscode.Pseudoterminal = {
243+
onDidWrite: writeEmitter.event,
244+
245+
onDidClose: closeEmitter.event,
246+
247+
open: () => {
248+
execs.forEach((e, index) => {
249+
const childTask = this.buildExecTask(e, index === 0);
250+
251+
vscode.tasks.executeTask(childTask);
252+
});
253+
closeEmitter.fire(0);
254+
},
255+
256+
close: () => {
257+
closeEmitter.fire(0);
258+
},
259+
260+
handleInput: () => {},
261+
};
262+
263+
return pty;
264+
});
265+
266+
const first = execs[0];
267+
268+
const task = new vscode.Task(
269+
{
270+
type: "devfile",
271+
command: command.id,
272+
workdir: first.workdir,
273+
component: first.component,
274+
},
275+
vscode.TaskScope.Workspace,
276+
command.composite.label || command.id,
277+
"devfile",
278+
execution,
279+
[],
280+
);
281+
282+
task.presentationOptions = {
283+
reveal: vscode.TaskRevealKind?.Never ?? 0,
284+
panel: vscode.TaskPanelKind?.Dedicated ?? 1,
285+
clear: false,
286+
showReuseMessage: false,
287+
};
288+
289+
return task;
290+
}
291+
242292
private buildExecTask(e: ResolvedExec, focus: boolean): vscode.Task {
243293
const task = new vscode.Task(
244294
{
@@ -262,9 +312,9 @@ export class CompositeTaskBuilder {
262312

263313
task.presentationOptions = {
264314
reveal: focus
265-
? vscode.TaskRevealKind.Always
266-
: vscode.TaskRevealKind.Silent,
267-
panel: vscode.TaskPanelKind.Dedicated,
315+
? (vscode.TaskRevealKind.Always ?? 1)
316+
: (vscode.TaskRevealKind.Silent ?? 2),
317+
panel: vscode.TaskPanelKind.Dedicated ?? 1,
268318
clear: false,
269319
};
270320

code/extensions/che-commands/tests/compositeTaskBuilder.test.ts

Lines changed: 9 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -114,14 +114,12 @@ describe("Composite — cross component execution", () => {
114114
expect(term.calls.map((c) => c.component)).toEqual(["backend", "frontend"]);
115115
});
116116

117-
test("parallel composite executes all components", async () => {
118-
const term = new MockTerminalAPI();
117+
test("parallel composite executes all components and opens only child terminals", async () => {
119118
let executedTasks: vscode.Task[] = [];
120119

121-
const listeners: any[] = [];
122-
123120
(vscode as any).TaskRevealKind = {
124-
Never: 0,
121+
Always: 1,
122+
Silent: 2,
125123
};
126124

127125
(vscode as any).TaskPanelKind = {
@@ -131,34 +129,12 @@ describe("Composite — cross component execution", () => {
131129
(vscode as any).tasks = {
132130
executeTask: async (task: vscode.Task) => {
133131
executedTasks.push(task);
134-
135-
const exec = task.execution as any;
136-
if (exec?.callback) {
137-
const pty = await exec.callback();
138-
if (pty?.open) {
139-
await pty.open();
140-
}
141-
}
142-
143-
const fakeExecution = {
144-
terminate: () => {},
145-
};
146-
147-
setTimeout(() => {
148-
listeners.forEach((l) =>
149-
l({ execution: fakeExecution, exitCode: 0 }),
150-
);
151-
}, 0);
152-
153-
return fakeExecution;
154-
},
155-
156-
onDidEndTaskProcess: (listener: any) => {
157-
listeners.push(listener);
158-
return { dispose: () => {} };
132+
return { terminate() {} };
159133
},
160134
};
161135

136+
const term = new MockTerminalAPI();
137+
162138
const tasks = await provide(devfile, term);
163139

164140
await runByName(tasks!, "par");
@@ -170,6 +146,9 @@ describe("Composite — cross component execution", () => {
170146
.sort();
171147

172148
expect(comps).toEqual(["backend", "frontend"]);
149+
expect(
150+
executedTasks.some((t) => (t.definition as any).command === "par"),
151+
).toBe(false);
173152
});
174153
});
175154

0 commit comments

Comments
 (0)