Skip to content
This repository has been archived by the owner on Apr 4, 2023. It is now read-only.

Use cwd for terminal creation #115

Merged
merged 3 commits into from
May 13, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,10 @@ import { MenuBar as MenuBarWidget } from '@phosphor/widgets';
import { TerminalKeybindingContext } from './keybinding-context';
import { CHEWorkspaceService } from '../../common/workspace-service';
import { TerminalWidget, TerminalWidgetOptions } from '@theia/terminal/lib/browser/base/terminal-widget';
import { REMOTE_TERMINAL_WIDGET_FACTORY_ID } from '../terminal-widget/remote-terminal-widget';
import { REMOTE_TERMINAL_WIDGET_FACTORY_ID, RemoteTerminalWidget, RemoteTerminalWidgetFactoryOptions } from '../terminal-widget/remote-terminal-widget';
import { filterRecipeContainers } from './terminal-command-filter';
import URI from '@theia/core/lib/common/uri';
import { EnvVariablesServer } from '@theia/core/lib/common/env-variables';

export const NewTerminalInSpecificContainer = {
id: 'terminal-in-specific-container:new',
Expand Down Expand Up @@ -50,7 +51,11 @@ export class ExecTerminalFrontendContribution extends TerminalFrontendContributi
@inject(CHEWorkspaceService)
protected readonly cheWorkspaceService: CHEWorkspaceService;

@inject(EnvVariablesServer)
protected readonly baseEnvVariablesServer: EnvVariablesServer;

private readonly mainMenuId = 'theia:menubar';
private editorContainerName;

async registerCommands(registry: CommandRegistry) {
const serverUrl = <URI | undefined>await this.termApiEndPointProvider();
Expand Down Expand Up @@ -86,12 +91,45 @@ export class ExecTerminalFrontendContribution extends TerminalFrontendContributi
}
}

public async newTerminalPerContainer(containerName: string, options?: TerminalWidgetOptions): Promise<TerminalWidget> {
try {
const workspaceId = <string>await this.baseEnvVariablesServer.getValue('CHE_WORKSPACE_ID').then(v => v ? v.value : undefined);
const termApiEndPoint = <URI | undefined>await this.termApiEndPointProvider();

const widget = <RemoteTerminalWidget>await this.widgetManager.getOrCreateWidget(REMOTE_TERMINAL_WIDGET_FACTORY_ID, <RemoteTerminalWidgetFactoryOptions>{
created: new Date().toString(),
machineName: containerName,
workspaceId: workspaceId,
endpoint: termApiEndPoint.toString(true),
...options
});
return widget;
} catch (err) {
console.error('Failed to create terminal widget. Cause: ', err);
}
throw new Error('Unable to create new terminal for machine: ' + containerName);
}

async openTerminalByContainerName(containerName: string): Promise<void> {
const termWidget = await this.terminalQuickOpen.newTerminalPerContainer(containerName, {});
this.open(termWidget, {});
const editorContainer = await this.getEditorContainerName();
let cwd: string;
// use information about volumes to cover cwd for development containers too. Depends on https://github.com/eclipse/che/issues/13290
if (containerName === editorContainer) {
cwd = await this.selectTerminalCwd();
}

const termWidget = await this.newTerminalPerContainer(containerName, { cwd });
this.open(termWidget);
termWidget.start();
}

async getEditorContainerName() {
if (!this.editorContainerName) {
this.editorContainerName = await this.cheWorkspaceService.findEditorMachineName();
}
return this.editorContainerName;
}

async newTerminal(options: TerminalWidgetOptions): Promise<TerminalWidget> {
let containerName;

Expand All @@ -100,11 +138,11 @@ export class ExecTerminalFrontendContribution extends TerminalFrontendContributi
}

if (!containerName) {
containerName = await this.cheWorkspaceService.findEditorMachineName();
containerName = await this.getEditorContainerName();
}

if (containerName) {
const termWidget = await this.terminalQuickOpen.newTerminalPerContainer(containerName, options);
const termWidget = await this.newTerminalPerContainer(containerName, options);
return termWidget;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,14 @@
**********************************************************************/

import { injectable, inject } from 'inversify';
import { QuickOpenModel, QuickOpenItem, QuickOpenHandler, QuickOpenService } from '@theia/core/lib/browser/quick-open/';
import { QuickOpenMode, QuickOpenOptions, WidgetManager, ApplicationShell, KeybindingRegistry } from '@theia/core/lib/browser';
import { EnvVariablesServer } from '@theia/core/lib/common/env-variables';
import { REMOTE_TERMINAL_WIDGET_FACTORY_ID, RemoteTerminalWidgetFactoryOptions } from '../terminal-widget/remote-terminal-widget';
import {
QuickOpenMode, QuickOpenOptions, ApplicationShell, KeybindingRegistry,
QuickOpenModel, QuickOpenItem, QuickOpenHandler, QuickOpenService
} from '@theia/core/lib/browser';
import { CHEWorkspaceService } from '../../common/workspace-service';
import { TerminalApiEndPointProvider } from '../server-definition/terminal-proxy-creator';
import { TerminalWidget, TerminalWidgetOptions } from '@theia/terminal/lib/browser/base/terminal-widget';
import { RemoteTerminalWidget } from '../terminal-widget/remote-terminal-widget';
import { OpenTerminalHandler } from './exec-terminal-contribution';
import { filterRecipeContainers } from './terminal-command-filter';
import URI from '@theia/core/lib/common/uri';

@injectable()
export class TerminalQuickOpenService implements QuickOpenHandler, QuickOpenModel {
Expand All @@ -32,12 +29,6 @@ export class TerminalQuickOpenService implements QuickOpenHandler, QuickOpenMode
@inject(QuickOpenService)
private readonly quickOpenService: QuickOpenService;

@inject(WidgetManager)
private readonly widgetManager: WidgetManager;

@inject(EnvVariablesServer)
protected readonly baseEnvVariablesServer: EnvVariablesServer;

@inject('TerminalApiEndPointProvider')
protected readonly termApiEndPointProvider: TerminalApiEndPointProvider;

Expand All @@ -53,25 +44,6 @@ export class TerminalQuickOpenService implements QuickOpenHandler, QuickOpenMode
@inject('terminal-in-specific-container-command-id')
protected readonly terminalInSpecificContainerCommandId: string;

public async newTerminalPerContainer(containerName: string, options?: TerminalWidgetOptions): Promise<TerminalWidget> {
try {
const workspaceId = <string>await this.baseEnvVariablesServer.getValue('CHE_WORKSPACE_ID').then(v => v ? v.value : undefined);
const termApiEndPoint = <URI | undefined>await this.termApiEndPointProvider();

const widget = <RemoteTerminalWidget>await this.widgetManager.getOrCreateWidget(REMOTE_TERMINAL_WIDGET_FACTORY_ID, <RemoteTerminalWidgetFactoryOptions>{
created: new Date().toString(),
machineName: containerName,
workspaceId: workspaceId,
endpoint: termApiEndPoint.toString(true),
...options
});
return widget;
} catch (err) {
console.error('Failed to create terminal widget. Cause: ', err);
}
throw new Error('Unable to create new terminal for machine: ' + containerName);
}

async displayListMachines(doOpen: OpenTerminalHandler) {
const items: QuickOpenItem[] = [];

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ export class RemoteTerminalWidget extends TerminalWidgetImpl {
workspaceId: this.options.workspaceId
},
cmd: cmd,
cwd: this.options.cwd,
cols,
rows,
tty: true,
Expand Down