Skip to content

Commit 37f56d4

Browse files
committed
Enable task terminal location in gitpod-web
1 parent 0e0485d commit 37f56d4

File tree

4 files changed

+34
-27
lines changed

4 files changed

+34
-27
lines changed

extensions/gitpod-remote/src/extension.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
/// <reference path='../../../src/vs/vscode.d.ts'/>
66

77
import * as cp from 'child_process';
8-
import { GitpodExtensionContext, setupGitpodContext } from 'gitpod-shared';
8+
import { GitpodExtensionContext, registerTasks, setupGitpodContext } from 'gitpod-shared';
99
import * as http from 'http';
1010
import * as path from 'path';
1111
import * as util from 'util';
@@ -30,6 +30,7 @@ export async function activate(context: vscode.ExtensionContext) {
3030
return;
3131
}
3232

33+
registerTasks(gitpodContext, (options) => vscode.window.createTerminal(options));
3334
installInitialExtensions(gitpodContext);
3435
registerHearbeat(gitpodContext);
3536
registerCLI(gitpodContext);

extensions/gitpod-shared/src/extension.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
*--------------------------------------------------------------------------------------------*/
44

55
import * as vscode from 'vscode';
6-
import { createGitpodExtensionContext, GitpodExtensionContext, registerDefaultLayout, registerNotifications, registerWorkspaceCommands, registerWorkspaceSharing, registerWorkspaceTimeout, registerTasks } from './features';
6+
import { createGitpodExtensionContext, GitpodExtensionContext, registerDefaultLayout, registerNotifications, registerWorkspaceCommands, registerWorkspaceSharing, registerWorkspaceTimeout } from './features';
77
import { performance } from 'perf_hooks';
88

9-
export { GitpodExtensionContext, SupervisorConnection } from './features';
9+
export { GitpodExtensionContext, SupervisorConnection, registerTasks } from './features';
1010
export * from './gitpod-plugin-model';
1111

1212
export async function setupGitpodContext(context: vscode.ExtensionContext): Promise<GitpodExtensionContext | undefined> {
@@ -34,7 +34,6 @@ export async function setupGitpodContext(context: vscode.ExtensionContext): Prom
3434
registerWorkspaceTimeout(gitpodContext);
3535
registerNotifications(gitpodContext);
3636
registerDefaultLayout(gitpodContext);
37-
registerTasks(gitpodContext);
3837
return gitpodContext;
3938
}
4039

extensions/gitpod-shared/src/features.ts

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -651,7 +651,7 @@ function installCLIProxy(context: vscode.ExtensionContext, output: vscode.Output
651651

652652
type TerminalOpenMode = 'tab-before' | 'tab-after' | 'split-left' | 'split-right' | 'split-top' | 'split-bottom';
653653

654-
export async function registerTasks(context: GitpodExtensionContext): Promise<void> {
654+
export async function registerTasks(context: GitpodExtensionContext, createTerminal: (options: vscode.ExtensionTerminalOptions, parent: vscode.Terminal | undefined) => vscode.Terminal): Promise<void> {
655655
const tokenSource = new vscode.CancellationTokenSource();
656656
const token = tokenSource.token;
657657
context.subscriptions.push({
@@ -698,30 +698,42 @@ export async function registerTasks(context: GitpodExtensionContext): Promise<vo
698698
return;
699699
}
700700

701-
const terminals = new Map<string, SupervisorTerminal>();
701+
const taskTerminals = new Map<string, SupervisorTerminal>();
702702
try {
703703
const response = await util.promisify(context.supervisor.terminal.list.bind(context.supervisor.terminal, new ListTerminalsRequest(), context.supervisor.metadata, {
704704
deadline: Date.now() + context.supervisor.deadlines.long
705705
}))();
706-
for (const terminal of response.getTerminalsList()) {
707-
terminals.set(terminal.getAlias(), terminal);
706+
for (const term of response.getTerminalsList()) {
707+
taskTerminals.set(term.getAlias(), term);
708708
}
709709
} catch (e) {
710-
console.error('failed to list terminals:', e);
710+
console.error('failed to list task terminals:', e);
711711
}
712712

713713
let prevTerminal: vscode.Terminal | undefined;
714714
for (const [alias, taskStatus] of tasks.entries()) {
715-
const terminal = terminals.get(alias);
716-
if (terminal) {
715+
const taskTerminal = taskTerminals.get(alias);
716+
if (taskTerminal) {
717717
const openMode: TerminalOpenMode | undefined = taskStatus.getPresentation()?.getOpenMode() as TerminalOpenMode;
718-
let parentTerminal = (openMode && openMode !== 'tab-before' && openMode !== 'tab-after') ? prevTerminal : undefined;
719-
prevTerminal = registerTask(alias, terminal.getTitle(), context, token, parentTerminal);
718+
const parentTerminal = (openMode && openMode !== 'tab-before' && openMode !== 'tab-after') ? prevTerminal : undefined;
719+
const pty = createTaskPty(alias, context, token);
720+
721+
// Delegate creation of the terminal to the extension caller
722+
// if proposed API usage is required.
723+
const terminal = createTerminal(
724+
{
725+
name: taskTerminal.getTitle(),
726+
pty
727+
},
728+
parentTerminal
729+
);
730+
terminal.show();
731+
prevTerminal = terminal;
720732
}
721733
}
722734
}
723735

724-
function registerTask(alias: string, initialTitle: string, context: GitpodExtensionContext, contextToken: vscode.CancellationToken, parentTerminal?: vscode.Terminal): vscode.Terminal {
736+
function createTaskPty(alias: string, context: GitpodExtensionContext, contextToken: vscode.CancellationToken): vscode.Pseudoterminal {
725737
const tokenSource = new vscode.CancellationTokenSource();
726738
contextToken.onCancellationRequested(() => tokenSource.cancel());
727739
const token = tokenSource.token;
@@ -876,16 +888,5 @@ function registerTask(alias: string, initialTitle: string, context: GitpodExtens
876888
}
877889
};
878890

879-
let proposedOptions = vscode.env.uiKind === vscode.UIKind.Web ? {
880-
location: parentTerminal ? { parentTerminal } : 1 /* vscode.TerminalLocation.Panel */
881-
} : {};
882-
proposedOptions = {}; // TODO: enable this
883-
const terminal = vscode.window.createTerminal({
884-
name: initialTitle,
885-
pty,
886-
...proposedOptions
887-
});
888-
terminal.show();
889-
890-
return terminal;
891+
return pty;
891892
}

extensions/gitpod-web/src/extension.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import * as workspaceInstance from '@gitpod/gitpod-protocol/lib/workspace-instance';
99
import * as grpc from '@grpc/grpc-js';
1010
import * as fs from 'fs';
11-
import { GitpodPluginModel, GitpodExtensionContext, setupGitpodContext } from 'gitpod-shared';
11+
import { GitpodPluginModel, GitpodExtensionContext, setupGitpodContext, registerTasks } from 'gitpod-shared';
1212
import { GetTokenRequest } from '@gitpod/supervisor-api-grpc/lib/token_pb';
1313
import { PortsStatus, ExposedPortInfo, PortsStatusRequest, PortsStatusResponse, PortAutoExposure, PortVisibility, OnPortExposedAction } from '@gitpod/supervisor-api-grpc/lib/status_pb';
1414
import { TunnelVisiblity, TunnelPortRequest, RetryAutoExposeRequest, CloseTunnelRequest } from '@gitpod/supervisor-api-grpc/lib/port_pb';
@@ -31,6 +31,12 @@ export async function activate(context: vscode.ExtensionContext) {
3131
}
3232
registerAuth(gitpodContext);
3333
registerPorts(gitpodContext);
34+
registerTasks(gitpodContext, (options, parentTerminal) => {
35+
return vscode.window.createTerminal({
36+
...options,
37+
location: parentTerminal ? { parentTerminal } : vscode.TerminalLocation.Panel
38+
});
39+
});
3440

3541
const codeServer = new GitpodCodeServer();
3642
registerCLI(codeServer, gitpodContext);

0 commit comments

Comments
 (0)