From 1a8d4bf61da751ccaa99178e7705082b26dac9de Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Mon, 25 Jul 2022 13:44:47 -0700 Subject: [PATCH] Restore waitOnExit, type, hideFromUser, reconnectionOwner terminal properties on reconnect (#155346) --- src/vs/platform/terminal/common/terminal.ts | 16 ++- .../terminal/common/terminalProcess.ts | 6 +- src/vs/platform/terminal/node/ptyService.ts | 6 +- .../tasks/browser/terminalTaskSystem.ts | 100 ++++++++++-------- .../contrib/terminal/browser/terminal.ts | 13 ++- .../browser/terminalEditorSerializer.ts | 6 +- .../terminal/browser/terminalInstance.ts | 40 +++++-- .../browser/terminalProcessManager.ts | 1 - 8 files changed, 124 insertions(+), 64 deletions(-) diff --git a/src/vs/platform/terminal/common/terminal.ts b/src/vs/platform/terminal/common/terminal.ts index 4c3c72a1f30..3f56c931175 100644 --- a/src/vs/platform/terminal/common/terminal.ts +++ b/src/vs/platform/terminal/common/terminal.ts @@ -169,8 +169,14 @@ export interface IPtyHostAttachTarget { environmentVariableCollections: ISerializableEnvironmentVariableCollections | undefined; reconnectionOwner?: string; task?: { label: string; id: string; lastTask: string; group?: string }; + waitOnExit?: WaitOnExitValue; + hideFromUser?: boolean; + isFeatureTerminal?: boolean; + type?: TerminalType; } +export type TerminalType = 'Task' | 'Local' | undefined; + export enum TitleEventSource { /** From the API or the rename command that overrides any other type */ Api, @@ -446,7 +452,7 @@ export interface IShellLaunchConfig { reconnectionOwner?: string; /** Whether to wait for a key press before closing the terminal. */ - waitOnExit?: boolean | string | ((exitCode: number) => string); + waitOnExit?: WaitOnExitValue; /** * A string including ANSI escape sequences that will be written to the terminal emulator @@ -469,7 +475,9 @@ export interface IShellLaunchConfig { /** * This is a terminal that attaches to an already running terminal. */ - attachPersistentProcess?: { id: number; findRevivedId?: boolean; pid: number; title: string; titleSource: TitleEventSource; cwd: string; icon?: TerminalIcon; color?: string; hasChildProcesses?: boolean; fixedDimensions?: IFixedTerminalDimensions; environmentVariableCollections?: ISerializableEnvironmentVariableCollections; reconnectionOwner?: string; task?: { label: string; id: string; lastTask: string; group?: string } }; + attachPersistentProcess?: { + id: number; findRevivedId?: boolean; pid: number; title: string; titleSource: TitleEventSource; cwd: string; icon?: TerminalIcon; color?: string; hasChildProcesses?: boolean; fixedDimensions?: IFixedTerminalDimensions; environmentVariableCollections?: ISerializableEnvironmentVariableCollections; reconnectionOwner?: string; task?: { label: string; id: string; lastTask: string; group?: string }; type?: TerminalType; waitOnExit?: WaitOnExitValue; hideFromUser?: boolean; isFeatureTerminal?: boolean; + }; /** * Whether the terminal process environment should be exactly as provided in @@ -544,9 +552,11 @@ export interface IShellLaunchConfig { /** * The task associated with this terminal */ - task?: { lastTask: string; group?: string; label: string; id: string }; + task?: { label: string; id: string; lastTask: string; group?: string }; } +export type WaitOnExitValue = boolean | string | ((exitCode: number) => string); + export interface ICreateContributedTerminalProfileOptions { icon?: URI | string | { light: URI; dark: URI }; color?: string; diff --git a/src/vs/platform/terminal/common/terminalProcess.ts b/src/vs/platform/terminal/common/terminalProcess.ts index 4329c9e0635..dc360427a6b 100644 --- a/src/vs/platform/terminal/common/terminalProcess.ts +++ b/src/vs/platform/terminal/common/terminalProcess.ts @@ -5,7 +5,7 @@ import { UriComponents } from 'vs/base/common/uri'; import { ISerializableEnvironmentVariableCollection, ISerializableEnvironmentVariableCollections } from 'vs/platform/terminal/common/environmentVariable'; -import { IFixedTerminalDimensions, IRawTerminalTabLayoutInfo, ITerminalEnvironment, ITerminalTabLayoutInfoById, TerminalIcon, TitleEventSource } from 'vs/platform/terminal/common/terminal'; +import { IFixedTerminalDimensions, IRawTerminalTabLayoutInfo, ITerminalEnvironment, ITerminalTabLayoutInfoById, TerminalIcon, TerminalType, TitleEventSource, WaitOnExitValue } from 'vs/platform/terminal/common/terminal'; export interface ISingleTerminalConfiguration { userValue: T | undefined; @@ -62,6 +62,10 @@ export interface IProcessDetails { environmentVariableCollections: ISerializableEnvironmentVariableCollections | undefined; reconnectionOwner?: string; task?: { label: string; id: string; lastTask: string; group?: string }; + waitOnExit?: WaitOnExitValue; + hideFromUser?: boolean; + isFeatureTerminal?: boolean; + type?: TerminalType; } export type ITerminalTabLayoutInfoDto = IRawTerminalTabLayoutInfo; diff --git a/src/vs/platform/terminal/node/ptyService.ts b/src/vs/platform/terminal/node/ptyService.ts index 2b7ad270732..5e1feff3086 100644 --- a/src/vs/platform/terminal/node/ptyService.ts +++ b/src/vs/platform/terminal/node/ptyService.ts @@ -411,7 +411,11 @@ export class PtyService extends Disposable implements IPtyService { fixedDimensions: persistentProcess.fixedDimensions, environmentVariableCollections: persistentProcess.processLaunchOptions.options.environmentVariableCollections, reconnectionOwner: persistentProcess.shellLaunchConfig.reconnectionOwner, - task: persistentProcess.shellLaunchConfig.task + task: persistentProcess.shellLaunchConfig.task, + waitOnExit: persistentProcess.shellLaunchConfig.waitOnExit, + hideFromUser: persistentProcess.shellLaunchConfig.hideFromUser, + isFeatureTerminal: persistentProcess.shellLaunchConfig.isFeatureTerminal, + type: persistentProcess.shellLaunchConfig.type }; } diff --git a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts index 22c53792466..abcde9212e7 100644 --- a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts @@ -30,14 +30,14 @@ import { URI } from 'vs/base/common/uri'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ILogService } from 'vs/platform/log/common/log'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { IShellLaunchConfig, TerminalLocation, TerminalSettingId } from 'vs/platform/terminal/common/terminal'; +import { IShellLaunchConfig, TerminalLocation, TerminalSettingId, WaitOnExitValue } from 'vs/platform/terminal/common/terminal'; import { formatMessageForTerminal } from 'vs/platform/terminal/common/terminalStrings'; import { ThemeIcon } from 'vs/platform/theme/common/themeService'; import { IViewDescriptorService, IViewsService, ViewContainerLocation } from 'vs/workbench/common/views'; import { TaskTerminalStatus } from 'vs/workbench/contrib/tasks/browser/taskTerminalStatus'; import { ProblemCollectorEventKind, ProblemHandlingStrategy, StartStopProblemCollector, WatchingProblemCollector } from 'vs/workbench/contrib/tasks/common/problemCollectors'; import { GroupKind } from 'vs/workbench/contrib/tasks/common/taskConfiguration'; -import { CommandOptions, CommandString, ContributedTask, CustomTask, DependsOrder, ICommandConfiguration, IExtensionTaskSource, InMemoryTask, IShellConfiguration, IShellQuotingOptions, ITaskEvent, PanelKind, RevealKind, RevealProblemKind, RuntimeType, ShellQuoting, Task, TaskEvent, TaskEventKind, TaskScope, TaskSettingId, TaskSourceKind } from 'vs/workbench/contrib/tasks/common/tasks'; +import { CommandOptions, CommandString, ContributedTask, CustomTask, DependsOrder, ICommandConfiguration, IConfigurationProperties, IExtensionTaskSource, InMemoryTask, IPresentationOptions, IShellConfiguration, IShellQuotingOptions, ITaskEvent, PanelKind, RevealKind, RevealProblemKind, RuntimeType, ShellQuoting, Task, TaskEvent, TaskEventKind, TaskScope, TaskSettingId, TaskSourceKind } from 'vs/workbench/contrib/tasks/common/tasks'; import { ITaskService } from 'vs/workbench/contrib/tasks/common/taskService'; import { IResolvedVariables, IResolveSet, ITaskExecuteResult, ITaskResolver, ITaskSummary, ITaskSystem, ITaskSystemInfo, ITaskSystemInfoResolver, ITaskTerminateResponse, TaskError, TaskErrors, TaskExecuteKind, Triggers } from 'vs/workbench/contrib/tasks/common/taskSystem'; import { ITerminalGroupService, ITerminalInstance, ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal'; @@ -284,6 +284,11 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { } if (this._tasksToReconnect.includes(task._id)) { this._terminalForTask = terminals.find(t => t.shellLaunchConfig.attachPersistentProcess?.task?.id === task._id); + // Restore the waitOnExit value of the terminal because it may have been a function + // that cannot be persisted in the pty host + if ('command' in task && task.command.presentation && this._terminalForTask) { + this._terminalForTask.waitOnExit = getWaitOnExitValue(task.command.presentation, task.configurationProperties); + } this.run(task, resolver, trigger); } return undefined; @@ -541,35 +546,38 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { alreadyResolved = alreadyResolved ?? new Map(); const promises: Promise[] = []; if (task.configurationProperties.dependsOn) { - for (const dependency of task.configurationProperties.dependsOn) { - const dependencyTask = await resolver.resolve(dependency.uri, dependency.task!); - if (dependencyTask) { - this._adoptConfigurationForDependencyTask(dependencyTask, task); - const key = dependencyTask.getMapKey(); - let promise = this._activeTasks[key] ? this._getDependencyPromise(this._activeTasks[key]) : undefined; - if (!promise) { - this._fireTaskEvent(TaskEvent.create(TaskEventKind.DependsOnStarted, task)); - encounteredDependencies.add(task.getCommonTaskId()); - promise = this._executeDependencyTask(dependencyTask, resolver, trigger, encounteredDependencies, alreadyResolved); - } - promises.push(promise); - if (task.configurationProperties.dependsOrder === DependsOrder.sequence) { - const promiseResult = await promise; - if (promiseResult.exitCode === 0) { - promise = Promise.resolve(promiseResult); - } else { - promise = Promise.reject(promiseResult); - break; + if (!this._terminalForTask) { + // we already handle dependent tasks when reconnecting, don't create extras + for (const dependency of task.configurationProperties.dependsOn) { + const dependencyTask = await resolver.resolve(dependency.uri, dependency.task!); + if (dependencyTask) { + this._adoptConfigurationForDependencyTask(dependencyTask, task); + const key = dependencyTask.getMapKey(); + let promise = this._activeTasks[key] ? this._getDependencyPromise(this._activeTasks[key]) : undefined; + if (!promise) { + this._fireTaskEvent(TaskEvent.create(TaskEventKind.DependsOnStarted, task)); + encounteredDependencies.add(task.getCommonTaskId()); + promise = this._executeDependencyTask(dependencyTask, resolver, trigger, encounteredDependencies, alreadyResolved); } + promises.push(promise); + if (task.configurationProperties.dependsOrder === DependsOrder.sequence) { + const promiseResult = await promise; + if (promiseResult.exitCode === 0) { + promise = Promise.resolve(promiseResult); + } else { + promise = Promise.reject(promiseResult); + break; + } + } + promises.push(promise); + } else { + this._log(nls.localize('dependencyFailed', + 'Couldn\'t resolve dependent task \'{0}\' in workspace folder \'{1}\'', + Types.isString(dependency.task) ? dependency.task : JSON.stringify(dependency.task, undefined, 0), + dependency.uri.toString() + )); + this._showOutput(); } - promises.push(promise); - } else { - this._log(nls.localize('dependencyFailed', - 'Couldn\'t resolve dependent task \'{0}\' in workspace folder \'{1}\'', - Types.isString(dependency.task) ? dependency.task : JSON.stringify(dependency.task, undefined, 0), - dependency.uri.toString() - )); - this._showOutput(); } } } @@ -1065,7 +1073,7 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { return needsFolderQualification ? task.getQualifiedLabel() : (task.configurationProperties.name || ''); } - private async _createShellLaunchConfig(task: CustomTask | ContributedTask, workspaceFolder: IWorkspaceFolder | undefined, variableResolver: VariableResolver, platform: Platform.Platform, options: CommandOptions, command: CommandString, args: CommandString[], waitOnExit: boolean | string | ((exitCode: number) => string)): Promise { + private async _createShellLaunchConfig(task: CustomTask | ContributedTask, workspaceFolder: IWorkspaceFolder | undefined, variableResolver: VariableResolver, platform: Platform.Platform, options: CommandOptions, command: CommandString, args: CommandString[], waitOnExit: WaitOnExitValue): Promise { let shellLaunchConfig: IShellLaunchConfig; const isShellCommand = task.command.runtime === RuntimeType.Shell; const needsFolderQualification = this._contextService.getWorkbenchState() === WorkbenchState.WORKSPACE; @@ -1338,24 +1346,10 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { const options = await this._resolveOptions(resolver, task.command.options); const presentationOptions = task.command.presentation; - let waitOnExit: boolean | string | ((exitCode: number) => string) = false; if (!presentationOptions) { throw new Error('Task presentation options should not be undefined here.'); } - - if ((presentationOptions.close === undefined) || (presentationOptions.close === false)) { - if ((presentationOptions.reveal !== RevealKind.Never) || !task.configurationProperties.isBackground || (presentationOptions.close === false)) { - if (presentationOptions.panel === PanelKind.New) { - waitOnExit = taskShellIntegrationWaitOnExitSequence(nls.localize('closeTerminal', 'Press any key to close the terminal.')); - } else if (presentationOptions.showReuseMessage) { - waitOnExit = taskShellIntegrationWaitOnExitSequence(nls.localize('reuseTerminal', 'Terminal will be reused by tasks, press any key to close it.')); - } else { - waitOnExit = true; - } - } - } else { - waitOnExit = !presentationOptions.close; - } + const waitOnExit = getWaitOnExitValue(presentationOptions, task.configurationProperties); let command: CommandString | undefined; let args: CommandString[] | undefined; @@ -1384,7 +1378,6 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { return [undefined, new TaskError(Severity.Error, nls.localize('TerminalTaskSystem', 'Can\'t execute a shell command on an UNC drive using cmd.exe.'), TaskErrors.UnknownError)]; } } - const prefersSameTerminal = presentationOptions.panel === PanelKind.Dedicated; const allowsSharedTerminal = presentationOptions.panel === PanelKind.Shared; const group = presentationOptions.group; @@ -1787,6 +1780,21 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { } } +function getWaitOnExitValue(presentationOptions: IPresentationOptions, configurationProperties: IConfigurationProperties) { + if ((presentationOptions.close === undefined) || (presentationOptions.close === false)) { + if ((presentationOptions.reveal !== RevealKind.Never) || !configurationProperties.isBackground || (presentationOptions.close === false)) { + if (presentationOptions.panel === PanelKind.New) { + return taskShellIntegrationWaitOnExitSequence(nls.localize('closeTerminal', 'Press any key to close the terminal.')); + } else if (presentationOptions.showReuseMessage) { + return taskShellIntegrationWaitOnExitSequence(nls.localize('reuseTerminal', 'Terminal will be reused by tasks, press any key to close it.')); + } else { + return true; + } + } + } + return !presentationOptions.close; +} + function taskShellIntegrationWaitOnExitSequence(message: string): (exitCode: number) => string { return (exitCode) => { return `${VSCodeSequence(VSCodeOscPt.CommandFinished, exitCode.toString())}${message}`; diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index 45871689f60..ed6ba54d0eb 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -11,7 +11,7 @@ import { FindReplaceState } from 'vs/editor/contrib/find/browser/findState'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IKeyMods } from 'vs/platform/quickinput/common/quickInput'; import { ITerminalCapabilityStore, ITerminalCommand } from 'vs/platform/terminal/common/capabilities/capabilities'; -import { IExtensionTerminalProfile, IProcessPropertyMap, IShellIntegration, IShellLaunchConfig, ITerminalDimensions, ITerminalLaunchError, ITerminalProfile, ITerminalTabLayoutInfoById, ProcessPropertyType, TerminalExitReason, TerminalIcon, TerminalLocation, TerminalShellType, TitleEventSource } from 'vs/platform/terminal/common/terminal'; +import { IExtensionTerminalProfile, IProcessPropertyMap, IShellIntegration, IShellLaunchConfig, ITerminalDimensions, ITerminalLaunchError, ITerminalProfile, ITerminalTabLayoutInfoById, ProcessPropertyType, TerminalExitReason, TerminalIcon, TerminalLocation, TerminalShellType, TerminalType, TitleEventSource, WaitOnExitValue } from 'vs/platform/terminal/common/terminal'; import { IGenericMarkProperties } from 'vs/platform/terminal/common/terminalProcess'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; @@ -257,6 +257,11 @@ interface ITerminalEditorInputObject { readonly icon: TerminalIcon | undefined; readonly color: string | undefined; readonly hasChildProcesses?: boolean; + readonly task?: { label: string; id: string; lastTask: string; group?: string; waitOnExit?: WaitOnExitValue }; + readonly type?: TerminalType; + readonly isFeatureTerminal?: boolean; + readonly hideFromUser?: boolean; + readonly reconnectionOwner?: string; } export interface ISerializedTerminalEditorInput extends ITerminalEditorInputObject { @@ -513,6 +518,12 @@ export interface ITerminalInstance { */ readonly hasFocus: boolean; + /** + * Get or set the behavior of the terminal when it closes. This was indented only to be called + * after reconnecting to a terminal. + */ + waitOnExit: WaitOnExitValue | undefined; + /** * An event that fires when the terminal instance's title changes. */ diff --git a/src/vs/workbench/contrib/terminal/browser/terminalEditorSerializer.ts b/src/vs/workbench/contrib/terminal/browser/terminalEditorSerializer.ts index 2a8abde35cb..853b4eb98e7 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalEditorSerializer.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalEditorSerializer.ts @@ -43,7 +43,11 @@ export class TerminalInputSerializer implements IEditorSerializer { icon: instance.icon, color: instance.color, resource: instance.resource.toString(), - hasChildProcesses: instance.hasChildProcesses + hasChildProcesses: instance.hasChildProcesses, + task: instance.shellLaunchConfig.task, + type: instance.shellLaunchConfig.type, + isFeatureTerminal: instance.shellLaunchConfig.isFeatureTerminal, + hideFromUser: instance.shellLaunchConfig.hideFromUser, }; } } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index a2993cbc0fa..f4c2df2b842 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -226,6 +226,11 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { xterm?: XtermTerminal; disableLayout: boolean = false; + get waitOnExit(): ITerminalInstance['waitOnExit'] { return this._shellLaunchConfig.attachPersistentProcess?.waitOnExit || this._shellLaunchConfig.waitOnExit; } + set waitOnExit(value: ITerminalInstance['waitOnExit']) { + this._shellLaunchConfig.waitOnExit = value; + } + get target(): TerminalLocation | undefined { return this._target; } set target(value: TerminalLocation | undefined) { if (this.xterm) { @@ -303,12 +308,13 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { get description(): string | undefined { if (this._description) { return this._description; - } else if (this._shellLaunchConfig.type) { - if (this._shellLaunchConfig.type === 'Task') { + } + const type = this.shellLaunchConfig.attachPersistentProcess?.type || this.shellLaunchConfig.type; + if (type) { + if (type === 'Task') { return nls.localize('terminalTypeTask', "Task"); - } else { - return nls.localize('terminalTypeLocal', "Local"); } + return nls.localize('terminalTypeLocal', "Local"); } return undefined; } @@ -407,6 +413,18 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { // the resource is already set when it's been moved from another window this._resource = resource || getTerminalUri(this._workspaceContextService.getWorkspace().id, this.instanceId, this.title); + if (this._shellLaunchConfig.attachPersistentProcess?.hideFromUser) { + this._shellLaunchConfig.hideFromUser = this._shellLaunchConfig.attachPersistentProcess.hideFromUser; + } + + if (this._shellLaunchConfig.attachPersistentProcess?.isFeatureTerminal) { + this._shellLaunchConfig.isFeatureTerminal = this._shellLaunchConfig.attachPersistentProcess.isFeatureTerminal; + } + + if (this._shellLaunchConfig.attachPersistentProcess?.type) { + this._shellLaunchConfig.type = this._shellLaunchConfig.attachPersistentProcess.type; + } + if (this.shellLaunchConfig.cwd) { const cwdUri = typeof this._shellLaunchConfig.cwd === 'string' ? URI.from({ scheme: Schemas.file, @@ -1764,18 +1782,19 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { // Only trigger wait on exit when the exit was *not* triggered by the // user (via the `workbench.action.terminal.kill` command). - if (this._shellLaunchConfig.waitOnExit && this._processManager.processState !== ProcessState.KilledByUser) { + const waitOnExit = this.waitOnExit; + if (waitOnExit && this._processManager.processState !== ProcessState.KilledByUser) { this._xtermReadyPromise.then(xterm => { if (exitMessage) { xterm.raw.write(formatMessageForTerminal(exitMessage)); } - switch (typeof this._shellLaunchConfig.waitOnExit) { + switch (typeof waitOnExit) { case 'string': - xterm.raw.write(formatMessageForTerminal(this._shellLaunchConfig.waitOnExit, { excludeLeadingNewLine: true })); + xterm.raw.write(formatMessageForTerminal(waitOnExit, { excludeLeadingNewLine: true })); break; case 'function': if (this.exitCode !== undefined) { - xterm.raw.write(formatMessageForTerminal(this._shellLaunchConfig.waitOnExit(this.exitCode), { excludeLeadingNewLine: true })); + xterm.raw.write(formatMessageForTerminal(waitOnExit(this.exitCode), { excludeLeadingNewLine: true })); } break; } @@ -2732,14 +2751,15 @@ export class TerminalLabelComputer extends Disposable { labelType: TerminalLabelType, reset?: boolean ) { + const type = this._instance.shellLaunchConfig.attachPersistentProcess?.type || this._instance.shellLaunchConfig.type; const templateProperties: ITerminalLabelTemplateProperties = { cwd: this._instance.cwd || this._instance.initialCwd || '', cwdFolder: '', workspaceFolder: this._instance.workspaceFolder ? path.basename(this._instance.workspaceFolder.uri.fsPath) : undefined, - local: this._instance.shellLaunchConfig.type === 'Local' ? this._instance.shellLaunchConfig.type : undefined, + local: type === 'Local' ? type : undefined, process: this._instance.processName, sequence: this._instance.sequence, - task: this._instance.shellLaunchConfig.type === 'Task' ? this._instance.shellLaunchConfig.type : undefined, + task: type === 'Task' ? type : undefined, fixedDimensions: this._instance.fixedCols ? (this._instance.fixedRows ? `\u2194${this._instance.fixedCols} \u2195${this._instance.fixedRows}` : `\u2194${this._instance.fixedCols}`) : (this._instance.fixedRows ? `\u2195${this._instance.fixedRows}` : ''), diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index 901505cb26a..a869232b29f 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -441,7 +441,6 @@ export class TerminalProcessManager extends Disposable implements ITerminalProce remoteAuthority: undefined, os: OS }); - const activeWorkspaceRootUri = this._historyService.getLastActiveWorkspaceRoot(Schemas.file); const initialCwd = await terminalEnvironment.getCwd(