Skip to content

Commit

Permalink
Add initial directory setting for unix sessions
Browse files Browse the repository at this point in the history
issue #184
  • Loading branch information
sedwards2009 committed Apr 27, 2019
1 parent b25108a commit 90708b5
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 7 deletions.
Expand Up @@ -33,7 +33,8 @@ class UnixBackend implements SessionBackend {
name: "Default shell",
type: "unix",
useDefaultShell: true,
shell: ""
shell: "",
initialDirectory: "",
};
return [loginSessionConfig];
}
Expand Down Expand Up @@ -69,6 +70,11 @@ class UnixBackend implements SessionBackend {
rows: rows,
preMessage
};

if (sessionConfig.initialDirectory != null && sessionConfig.initialDirectory !== "") {
options.cwd = sessionConfig.initialDirectory;
}

return new UnixPty(this._log, options);
}

Expand Down
50 changes: 44 additions & 6 deletions extensions/UnixSessionEditor/src/UnixSessionEditorExtension.ts
Expand Up @@ -49,15 +49,16 @@ export function activate(context: ExtensionContext): any {
this._loadConfig(config);
}

_loadConfig(config: UnixSessionConfiguration): void {
private _loadConfig(config: UnixSessionConfiguration): void {
let fixedConfig = config;
if (config.shell == null) {
fixedConfig = {
uuid: config.uuid,
name: config.name,
useDefaultShell: true,
shell: "",
args: ""
args: "",
initialDirectory: ""
};
}

Expand All @@ -66,20 +67,23 @@ export function activate(context: ExtensionContext): any {
this._ui.shell = fixedConfig.shell;
this._ui.etcShells = etcShells;
this._ui.args = fixedConfig.args;
this._ui.initialDirectory = fixedConfig.initialDirectory || "";
}

_dataChanged(): void {
private _dataChanged(): void {
const changes = {
name: this._ui.name,
useDefaultShell: this._ui.useDefaultShell === 1,
shell: this._ui.shell,
args: this._ui.args
args: this._ui.args,
initialDirectory: this._ui.initialDirectory,
};
this._checkShellPath();
this._checkInitialDirectory();
this.updateSessionConfiguration(changes);
}

_checkShellPath(): void {
private _checkShellPath(): void {
if ( ! this._ui.useDefaultShell && this._ui.shell !== "") {
const shellPath = this._ui.shell;

Expand All @@ -93,7 +97,7 @@ export function activate(context: ExtensionContext): any {
}
}

async _checkExecutablePath(exePath: string): Promise<string> {
private async _checkExecutablePath(exePath: string): Promise<string> {
try {
const metadata = await fse.stat(exePath);
if ( ! metadata.isFile()) {
Expand All @@ -112,6 +116,40 @@ export function activate(context: ExtensionContext): any {
}
return "";
}

private _checkInitialDirectory(): void {
if ( this._ui.initialDirectory !== "") {
const initialDirectory = this._ui.initialDirectory;

this._checkDirectoryPath(initialDirectory).then(resultMsg => {
if (initialDirectory === this._ui.initialDirectory) {
this._ui.initialDirectoryErrorMsg = resultMsg;
}
});
} else {
this._ui.initialDirectoryErrorMsg = "";
}
}

private async _checkDirectoryPath(exePath: string): Promise<string> {
try {
const metadata = await fse.stat(exePath);
if ( ! metadata.isDirectory()) {
return "Path isn't a directory";
}

await fse.access(exePath, fse.constants.R_OK);
} catch(err) {
if (err.errno === -constants.ENOENT) {
return "Path doesn't exist";
}
if (err.errno === -constants.EACCES) {
return "Path isn't readable";
}
return "errno: " + err.errno + ", err.code: " + err.code;
}
return "";
}
}

context.window.registerSessionEditor("unix", UnixSessionEditor);
Expand Down
9 changes: 9 additions & 0 deletions extensions/UnixSessionEditor/src/UnixSessionEditorUi.ts
Expand Up @@ -36,6 +36,13 @@ import { trimBetweenTags } from 'extraterm-trim-between-tags';
<label for="args">Arguments:</label>
<input type="text" name="args" v-model="args">
<label for="initialDirectory">Initial Directory:</label>
<input type="text" name="initialDirectory" v-model="initialDirectory">
<template v-if="initialDirectoryErrorMsg != ''">
<label></label>
<span><i class="fas fa-exclamation-triangle"></i> {{ initialDirectoryErrorMsg }}</span>
</template>
</div>
<datalist id="etcShells">
Expand All @@ -50,4 +57,6 @@ export class UnixSessionEditorUi extends Vue {
shellErrorMsg = "";
etcShells: string[] = [];
args: string = "";
initialDirectory = "";
initialDirectoryErrorMsg = "";
}
1 change: 1 addition & 0 deletions packages/extraterm-extension-api/main.ts
Expand Up @@ -473,6 +473,7 @@ export interface SessionConfiguration {
name: string; // Human readable name for the profile.
type?: string; // type - "cygwin", "babun" or "native" ("" means "native")
args?: string; // command line arguments to be passed to command
initialDirectory?: string;
}

/**
Expand Down

0 comments on commit 90708b5

Please sign in to comment.