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

Commit

Permalink
Use cwd for terminal creation (#115)
Browse files Browse the repository at this point in the history
* Use cwd for terminal creation

Signed-off-by: Oleksandr Andriienko <oandriie@redhat.com>

* Use cwd only for editor container. Limited by eclipse-che/che#1329

Signed-off-by: Oleksandr Andriienko <oandriie@redhat.com>

* Clean up.

Signed-off-by: Oleksandr Andriienko <oandriie@redhat.com>
  • Loading branch information
AndrienkoAleksandr committed May 13, 2019
1 parent 9f7d0d3 commit 18cd3d6
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 37 deletions.
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

0 comments on commit 18cd3d6

Please sign in to comment.