mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 10:58:30 -05:00
Merge from vscode 2c306f762bf9c3db82dc06c7afaa56ef46d72f79 (#14050)
* Merge from vscode 2c306f762bf9c3db82dc06c7afaa56ef46d72f79 * Fix breaks * Extension management fixes * Fix breaks in windows bundling * Fix/skip failing tests * Update distro * Add clear to nuget.config * Add hygiene task * Bump distro * Fix hygiene issue * Add build to hygiene exclusion * Update distro * Update hygiene * Hygiene exclusions * Update tsconfig * Bump distro for server breaks * Update build config * Update darwin path * Add done calls to notebook tests * Skip failing tests * Disable smoke tests
This commit is contained in:
@@ -19,8 +19,6 @@ import { ValidationStatus, ValidationState } from 'vs/base/common/parsers';
|
||||
import * as UUID from 'vs/base/common/uuid';
|
||||
import * as Platform from 'vs/base/common/platform';
|
||||
import { LRUCache, Touch } from 'vs/base/common/map';
|
||||
|
||||
import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle';
|
||||
import { IMarkerService } from 'vs/platform/markers/common/markers';
|
||||
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration';
|
||||
@@ -28,13 +26,13 @@ import { IFileService, IFileStat } from 'vs/platform/files/common/files';
|
||||
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
|
||||
import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands';
|
||||
import { ProblemMatcherRegistry, NamedProblemMatcher } from 'vs/workbench/contrib/tasks/common/problemMatcher';
|
||||
import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage';
|
||||
import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage';
|
||||
import { IProgressService, IProgressOptions, ProgressLocation } from 'vs/platform/progress/common/progress';
|
||||
|
||||
import { IOpenerService } from 'vs/platform/opener/common/opener';
|
||||
import { IHostService } from 'vs/workbench/services/host/browser/host';
|
||||
import { INotificationService } from 'vs/platform/notification/common/notification';
|
||||
import { IDialogService, IConfirmationResult } from 'vs/platform/dialogs/common/dialogs';
|
||||
import { IDialogService } from 'vs/platform/dialogs/common/dialogs';
|
||||
|
||||
import { IModelService } from 'vs/editor/common/services/modelService';
|
||||
|
||||
@@ -42,7 +40,7 @@ import { IPanelService } from 'vs/workbench/services/panel/common/panelService';
|
||||
import Constants from 'vs/workbench/contrib/markers/browser/constants';
|
||||
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
|
||||
import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver';
|
||||
import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder, IWorkspace } from 'vs/platform/workspace/common/workspace';
|
||||
import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder, IWorkspace, WorkspaceFolder } from 'vs/platform/workspace/common/workspace';
|
||||
|
||||
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
|
||||
import { IOutputService, IOutputChannel } from 'vs/workbench/contrib/output/common/output';
|
||||
@@ -78,9 +76,10 @@ import { ITextEditorSelection, TextEditorSelectionRevealType } from 'vs/platform
|
||||
import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences';
|
||||
import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation';
|
||||
import { IViewsService, IViewDescriptorService } from 'vs/workbench/common/views';
|
||||
import { isWorkspaceFolder, TaskQuickPickEntry, QUICKOPEN_DETAIL_CONFIG, TaskQuickPick, QUICKOPEN_SKIP_CONFIG } from 'vs/workbench/contrib/tasks/browser/taskQuickPick';
|
||||
import { isWorkspaceFolder, TaskQuickPickEntry, QUICKOPEN_DETAIL_CONFIG, TaskQuickPick, QUICKOPEN_SKIP_CONFIG, configureTaskIcon } from 'vs/workbench/contrib/tasks/browser/taskQuickPick';
|
||||
import { ILogService } from 'vs/platform/log/common/log';
|
||||
import { once } from 'vs/base/common/functional';
|
||||
import { ThemeIcon } from 'vs/platform/theme/common/themeService';
|
||||
|
||||
// {{ SQL CARBON EDIT }}
|
||||
// integration with tasks view panel
|
||||
@@ -219,7 +218,6 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
protected _taskSystemInfos: Map<string, TaskSystemInfo>;
|
||||
|
||||
protected _workspaceTasksPromise?: Promise<Map<string, WorkspaceFolderTaskResult>>;
|
||||
protected _areJsonTasksSupportedPromise: Promise<boolean> = Promise.resolve(false);
|
||||
|
||||
protected _taskSystem?: ITaskSystem;
|
||||
protected _taskSystemListener?: IDisposable;
|
||||
@@ -248,7 +246,6 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
@IWorkspaceContextService protected readonly contextService: IWorkspaceContextService,
|
||||
@ITelemetryService protected readonly telemetryService: ITelemetryService,
|
||||
@ITextFileService private readonly textFileService: ITextFileService,
|
||||
@ILifecycleService lifecycleService: ILifecycleService,
|
||||
@IModelService protected readonly modelService: IModelService,
|
||||
@IExtensionService private readonly extensionService: IExtensionService,
|
||||
@IQuickInputService private readonly quickInputService: IQuickInputService,
|
||||
@@ -258,7 +255,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
@IProgressService private readonly progressService: IProgressService,
|
||||
@IOpenerService private readonly openerService: IOpenerService,
|
||||
@IHostService private readonly _hostService: IHostService,
|
||||
@IDialogService private readonly dialogService: IDialogService,
|
||||
@IDialogService protected readonly dialogService: IDialogService,
|
||||
@INotificationService private readonly notificationService: INotificationService,
|
||||
@IContextKeyService protected readonly contextKeyService: IContextKeyService,
|
||||
@IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService,
|
||||
@@ -319,7 +316,6 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
this.updateWorkspaceTasks(TaskRunSource.ConfigurationChange);
|
||||
}));
|
||||
this._taskRunningState = TASK_RUNNING_STATE.bindTo(contextKeyService);
|
||||
this._register(lifecycleService.onBeforeShutdown(event => event.veto(this.beforeShutdown())));
|
||||
this._onDidStateChange = this._register(new Emitter());
|
||||
this.registerCommands();
|
||||
this.configurationResolverService.contributeVariable('defaultBuildTask', async (): Promise<string | undefined> => {
|
||||
@@ -529,7 +525,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
}
|
||||
}
|
||||
|
||||
private disposeTaskSystemListeners(): void {
|
||||
protected disposeTaskSystemListeners(): void {
|
||||
if (this._taskSystemListener) {
|
||||
this._taskSystemListener.dispose();
|
||||
}
|
||||
@@ -553,7 +549,16 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
}
|
||||
|
||||
public registerTaskSystem(key: string, info: TaskSystemInfo): void {
|
||||
this._taskSystemInfos.set(key, info);
|
||||
if (!this._taskSystemInfos.has(key) || info.platform !== Platform.Platform.Web) {
|
||||
this._taskSystemInfos.set(key, info);
|
||||
}
|
||||
}
|
||||
|
||||
private getTaskSystemInfo(key: string): TaskSystemInfo | undefined {
|
||||
if (this.environmentService.remoteAuthority) {
|
||||
return this._taskSystemInfos.get(key);
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
public extensionCallbackTaskComplete(task: Task, result: number): Promise<void> {
|
||||
@@ -582,7 +587,8 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
if (!values) {
|
||||
return undefined;
|
||||
}
|
||||
return values.find(task => task.matches(key, compareId));
|
||||
values = values.filter(task => task.matches(key, compareId)).sort(task => task._source.kind === TaskSourceKind.Extension ? 1 : -1);
|
||||
return values.length > 0 ? values[0] : undefined;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -803,6 +809,13 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
return tasks;
|
||||
}
|
||||
|
||||
public removeRecentlyUsedTask(taskRecentlyUsedKey: string) {
|
||||
if (this.getRecentlyUsedTasks().has(taskRecentlyUsedKey)) {
|
||||
this.getRecentlyUsedTasks().delete(taskRecentlyUsedKey);
|
||||
this.saveRecentlyUsedTasks();
|
||||
}
|
||||
}
|
||||
|
||||
private setTaskLRUCacheLimit() {
|
||||
const quickOpenHistoryLimit = this.configurationService.getValue<number>(QUICKOPEN_HISTORY_LIMIT_CONFIG);
|
||||
if (this._recentlyUsedTasks) {
|
||||
@@ -847,7 +860,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
for (const key of keys) {
|
||||
keyValues.push([key, this._recentlyUsedTasks.get(key, Touch.None)!]);
|
||||
}
|
||||
this.storageService.store(AbstractTaskService.RecentlyUsedTasks_KeyV2, JSON.stringify(keyValues), StorageScope.WORKSPACE);
|
||||
this.storageService.store(AbstractTaskService.RecentlyUsedTasks_KeyV2, JSON.stringify(keyValues), StorageScope.WORKSPACE, StorageTarget.USER);
|
||||
}
|
||||
|
||||
private openDocumentation(): void {
|
||||
@@ -982,7 +995,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
newValue = Object.create(null);
|
||||
}
|
||||
newValue[type] = true;
|
||||
return this.configurationService.updateValue(PROBLEM_MATCHER_NEVER_CONFIG, newValue, ConfigurationTarget.USER);
|
||||
return this.configurationService.updateValue(PROBLEM_MATCHER_NEVER_CONFIG, newValue);
|
||||
}
|
||||
|
||||
private attachProblemMatcher(task: ContributedTask | CustomTask): Promise<Task | undefined> {
|
||||
@@ -1625,12 +1638,15 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
this.modelService, this.configurationResolverService, this.telemetryService,
|
||||
this.contextService, this.environmentService,
|
||||
AbstractTaskService.OutputChannelId, this.fileService, this.terminalInstanceService,
|
||||
this.pathService, this.viewDescriptorService, this.logService,
|
||||
(workspaceFolder: IWorkspaceFolder) => {
|
||||
if (!workspaceFolder) {
|
||||
this.pathService, this.viewDescriptorService, this.logService, this.configurationService,
|
||||
(workspaceFolder: IWorkspaceFolder | undefined) => {
|
||||
if (workspaceFolder) {
|
||||
return this.getTaskSystemInfo(workspaceFolder.uri.scheme);
|
||||
} else if (this._taskSystemInfos.size > 0) {
|
||||
return this._taskSystemInfos.values().next().value;
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
return this._taskSystemInfos.get(workspaceFolder.uri.scheme);
|
||||
}
|
||||
);
|
||||
}
|
||||
@@ -1728,7 +1744,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
return;
|
||||
}
|
||||
|
||||
if (!contributed) {
|
||||
if (this.contextService.getWorkbenchState() === WorkbenchState.EMPTY) {
|
||||
result.add(key, ...folderTasks.set.tasks);
|
||||
} else {
|
||||
let configurations = folderTasks.configurations;
|
||||
@@ -1893,35 +1909,39 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
protected abstract updateWorkspaceTasks(runSource: TaskRunSource | void): void;
|
||||
|
||||
protected computeWorkspaceTasks(runSource: TaskRunSource = TaskRunSource.User): Promise<Map<string, WorkspaceFolderTaskResult>> {
|
||||
if (this.workspaceFolders.length === 0) {
|
||||
return Promise.resolve(new Map<string, WorkspaceFolderTaskResult>());
|
||||
} else {
|
||||
let promises: Promise<WorkspaceFolderTaskResult | undefined>[] = [];
|
||||
for (let folder of this.workspaceFolders) {
|
||||
promises.push(this.computeWorkspaceFolderTasks(folder, runSource).then((value) => value, () => undefined));
|
||||
let promises: Promise<WorkspaceFolderTaskResult | undefined>[] = [];
|
||||
for (let folder of this.workspaceFolders) {
|
||||
promises.push(this.computeWorkspaceFolderTasks(folder, runSource).then((value) => value, () => undefined));
|
||||
}
|
||||
return Promise.all(promises).then(async (values) => {
|
||||
let result = new Map<string, WorkspaceFolderTaskResult>();
|
||||
for (let value of values) {
|
||||
if (value) {
|
||||
result.set(value.workspaceFolder.uri.toString(), value);
|
||||
}
|
||||
}
|
||||
return Promise.all(promises).then(async (values) => {
|
||||
let result = new Map<string, WorkspaceFolderTaskResult>();
|
||||
for (let value of values) {
|
||||
if (value) {
|
||||
result.set(value.workspaceFolder.uri.toString(), value);
|
||||
}
|
||||
}
|
||||
const userTasks = await this.computeUserTasks(this.workspaceFolders[0], runSource).then((value) => value, () => undefined);
|
||||
if (userTasks) {
|
||||
result.set(USER_TASKS_GROUP_KEY, userTasks);
|
||||
}
|
||||
const workspaceFileTasks = await this.computeWorkspaceFileTasks(this.workspaceFolders[0], runSource).then((value) => value, () => undefined);
|
||||
let folder = this.workspaceFolders.length > 0 ? this.workspaceFolders[0] : undefined;
|
||||
if (!folder) {
|
||||
const userhome = await this.pathService.userHome();
|
||||
folder = new WorkspaceFolder({ uri: userhome, name: resources.basename(userhome), index: 0 });
|
||||
}
|
||||
const userTasks = await this.computeUserTasks(folder, runSource).then((value) => value, () => undefined);
|
||||
if (userTasks) {
|
||||
result.set(USER_TASKS_GROUP_KEY, userTasks);
|
||||
}
|
||||
|
||||
if (this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY) {
|
||||
const workspaceFileTasks = await this.computeWorkspaceFileTasks(folder, runSource).then((value) => value, () => undefined);
|
||||
if (workspaceFileTasks && this._workspace && this._workspace.configuration) {
|
||||
result.set(this._workspace.configuration.toString(), workspaceFileTasks);
|
||||
}
|
||||
return result;
|
||||
});
|
||||
}
|
||||
}
|
||||
return result;
|
||||
});
|
||||
}
|
||||
|
||||
public setJsonTasksSupported(areSupported: Promise<boolean>) {
|
||||
this._areJsonTasksSupportedPromise = areSupported;
|
||||
private get jsonTasksSupported(): boolean {
|
||||
return !!ShellExecutionSupportedContext.getValue(this.contextKeyService) && !!ProcessExecutionSupportedContext.getValue(this.contextKeyService);
|
||||
}
|
||||
|
||||
private computeWorkspaceFolderTasks(workspaceFolder: IWorkspaceFolder, runSource: TaskRunSource = TaskRunSource.User): Promise<WorkspaceFolderTaskResult> {
|
||||
@@ -1933,7 +1953,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
return Promise.resolve({ workspaceFolder, set: undefined, configurations: undefined, hasErrors: workspaceFolderConfiguration ? workspaceFolderConfiguration.hasErrors : false });
|
||||
}
|
||||
return ProblemMatcherRegistry.onReady().then(async (): Promise<WorkspaceFolderTaskResult> => {
|
||||
let taskSystemInfo: TaskSystemInfo | undefined = this._taskSystemInfos.get(workspaceFolder.uri.scheme);
|
||||
let taskSystemInfo: TaskSystemInfo | undefined = this.getTaskSystemInfo(workspaceFolder.uri.scheme);
|
||||
let problemReporter = new ProblemReporter(this._outputChannel);
|
||||
let parseResult = TaskConfig.parse(workspaceFolder, undefined, taskSystemInfo ? taskSystemInfo.platform : Platform.platform, workspaceFolderConfiguration.config!, problemReporter, TaskConfig.TaskConfigSource.TasksJson, this.contextKeyService);
|
||||
let hasErrors = false;
|
||||
@@ -1954,10 +1974,10 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
customizedTasks.byIdentifier[task.configures._key] = task;
|
||||
}
|
||||
}
|
||||
if (!(await this._areJsonTasksSupportedPromise) && (parseResult.custom.length > 0)) {
|
||||
if (!this.jsonTasksSupported && (parseResult.custom.length > 0)) {
|
||||
console.warn('Custom workspace tasks are not supported.');
|
||||
}
|
||||
return { workspaceFolder, set: { tasks: await this._areJsonTasksSupportedPromise ? parseResult.custom : [] }, configurations: customizedTasks, hasErrors };
|
||||
return { workspaceFolder, set: { tasks: this.jsonTasksSupported ? parseResult.custom : [] }, configurations: customizedTasks, hasErrors };
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -2030,7 +2050,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
if (!config) {
|
||||
return false;
|
||||
}
|
||||
let taskSystemInfo: TaskSystemInfo | undefined = workspaceFolder ? this._taskSystemInfos.get(workspaceFolder.uri.scheme) : undefined;
|
||||
let taskSystemInfo: TaskSystemInfo | undefined = workspaceFolder ? this.getTaskSystemInfo(workspaceFolder.uri.scheme) : undefined;
|
||||
let problemReporter = new ProblemReporter(this._outputChannel);
|
||||
let parseResult = TaskConfig.parse(workspaceFolder, this._workspace, taskSystemInfo ? taskSystemInfo.platform : Platform.platform, config, problemReporter, source, this.contextKeyService, isRecentTask);
|
||||
let hasErrors = false;
|
||||
@@ -2047,7 +2067,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
customized[task.configures._key] = task;
|
||||
}
|
||||
}
|
||||
if (!(await this._areJsonTasksSupportedPromise) && (parseResult.custom.length > 0)) {
|
||||
if (!this.jsonTasksSupported && (parseResult.custom.length > 0)) {
|
||||
console.warn('Custom workspace tasks are not supported.');
|
||||
} else {
|
||||
for (let task of parseResult.custom) {
|
||||
@@ -2158,64 +2178,6 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
};
|
||||
}
|
||||
|
||||
public beforeShutdown(): boolean | Promise<boolean> {
|
||||
if (!this._taskSystem) {
|
||||
return false;
|
||||
}
|
||||
if (!this._taskSystem.isActiveSync()) {
|
||||
return false;
|
||||
}
|
||||
// The terminal service kills all terminal on shutdown. So there
|
||||
// is nothing we can do to prevent this here.
|
||||
if (this._taskSystem instanceof TerminalTaskSystem) {
|
||||
return false;
|
||||
}
|
||||
|
||||
let terminatePromise: Promise<IConfirmationResult>;
|
||||
if (this._taskSystem.canAutoTerminate()) {
|
||||
terminatePromise = Promise.resolve({ confirmed: true });
|
||||
} else {
|
||||
terminatePromise = this.dialogService.confirm({
|
||||
message: nls.localize('TaskSystem.runningTask', 'There is a task running. Do you want to terminate it?'),
|
||||
primaryButton: nls.localize({ key: 'TaskSystem.terminateTask', comment: ['&& denotes a mnemonic'] }, "&&Terminate Task"),
|
||||
type: 'question'
|
||||
});
|
||||
}
|
||||
|
||||
return terminatePromise.then(res => {
|
||||
if (res.confirmed) {
|
||||
return this._taskSystem!.terminateAll().then((responses) => {
|
||||
let success = true;
|
||||
let code: number | undefined = undefined;
|
||||
for (let response of responses) {
|
||||
success = success && response.success;
|
||||
// We only have a code in the old output runner which only has one task
|
||||
// So we can use the first code.
|
||||
if (code === undefined && response.code !== undefined) {
|
||||
code = response.code;
|
||||
}
|
||||
}
|
||||
if (success) {
|
||||
this._taskSystem = undefined;
|
||||
this.disposeTaskSystemListeners();
|
||||
return false; // no veto
|
||||
} else if (code && code === TerminateResponseCode.ProcessNotFound) {
|
||||
return this.dialogService.confirm({
|
||||
message: nls.localize('TaskSystem.noProcess', 'The launched task doesn\'t exist anymore. If the task spawned background processes exiting VS Code might result in orphaned processes. To avoid this start the last background process with a wait flag.'),
|
||||
primaryButton: nls.localize({ key: 'TaskSystem.exitAnyways', comment: ['&& denotes a mnemonic'] }, "&&Exit Anyways"),
|
||||
type: 'info'
|
||||
}).then(res => !res.confirmed);
|
||||
}
|
||||
return true; // veto
|
||||
}, (err) => {
|
||||
return true; // veto
|
||||
});
|
||||
}
|
||||
|
||||
return true; // veto
|
||||
});
|
||||
}
|
||||
|
||||
private handleError(err: any): void {
|
||||
let showOutput = true;
|
||||
if (err instanceof TaskError) {
|
||||
@@ -2251,17 +2213,6 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
}
|
||||
|
||||
private canRunCommand(): boolean {
|
||||
if (this.contextService.getWorkbenchState() === WorkbenchState.EMPTY) {
|
||||
this.notificationService.prompt(
|
||||
Severity.Info,
|
||||
nls.localize('TaskService.noWorkspace', "Tasks are only available on a workspace folder."),
|
||||
[{
|
||||
label: nls.localize('TaskService.learnMore', "Learn More"),
|
||||
run: () => this.openerService.open(URI.parse('https://code.visualstudio.com/docs/editor/tasks'))
|
||||
}]
|
||||
);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -2291,7 +2242,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
}
|
||||
for (let task of tasks) {
|
||||
let entry: TaskQuickPickEntry = TaskQuickPickEntry(task);
|
||||
entry.buttons = [{ iconClass: 'codicon-gear', tooltip: nls.localize('configureTask', "Configure Task") }];
|
||||
entry.buttons = [{ iconClass: ThemeIcon.asClassName(configureTaskIcon), tooltip: nls.localize('configureTask', "Configure Task") }];
|
||||
if (selectedEntry && (task === selectedEntry.task)) {
|
||||
entries.unshift(selectedEntry);
|
||||
} else {
|
||||
@@ -2475,7 +2426,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
label: nls.localize('TaskService.notAgain', "Don't Show Again"),
|
||||
isSecondary: true,
|
||||
run: () => {
|
||||
this.storageService.store(AbstractTaskService.IgnoreTask010DonotShowAgain_key, true, StorageScope.WORKSPACE);
|
||||
this.storageService.store(AbstractTaskService.IgnoreTask010DonotShowAgain_key, true, StorageScope.WORKSPACE, StorageTarget.USER);
|
||||
this._showIgnoreMessage = false;
|
||||
}
|
||||
}]
|
||||
@@ -2570,7 +2521,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
}
|
||||
this.showQuickPick(tasks ? tasks : taskResult!.tasks, placeholder,
|
||||
{
|
||||
label: nls.localize('TaskService.noEntryToRunSlow', 'No task to run found. Configure Tasks...'),
|
||||
label: nls.localize('TaskService.noEntryToRunSlow', '$(plus) Configure a Task'),
|
||||
task: null
|
||||
},
|
||||
true).
|
||||
@@ -2580,7 +2531,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
} else {
|
||||
this.showTwoLevelQuickPick(placeholder,
|
||||
{
|
||||
label: nls.localize('TaskService.noEntryToRun', 'No configured tasks. Configure Tasks...'),
|
||||
label: nls.localize('TaskService.noEntryToRun', '$(plus) Configure a Task'),
|
||||
task: null
|
||||
}).
|
||||
then(pickThen);
|
||||
@@ -2962,8 +2913,13 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
}
|
||||
if (this.isTaskEntry(selection)) {
|
||||
this.configureTask(selection.task);
|
||||
} else {
|
||||
} else if (this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY) {
|
||||
this.openTaskFile(selection.folder.toResource('.vscode/tasks.json'), TaskSourceKind.Workspace);
|
||||
} else {
|
||||
const resource = this.getResourceForKind(TaskSourceKind.User);
|
||||
if (resource) {
|
||||
this.openTaskFile(resource, TaskSourceKind.User);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3005,46 +2961,22 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
return taskPromise.then((taskMap) => {
|
||||
let entries: QuickPickInput<TaskQuickPickEntryType>[] = [];
|
||||
let needsCreateOrOpen: boolean = true;
|
||||
if (this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY) {
|
||||
let tasks = taskMap.all();
|
||||
if (tasks.length > 0) {
|
||||
tasks = tasks.sort((a, b) => a._label.localeCompare(b._label));
|
||||
for (let task of tasks) {
|
||||
entries.push({ label: task._label, task, description: this.getTaskDescription(task), detail: this.showDetail() ? task.configurationProperties.detail : undefined });
|
||||
if (!ContributedTask.is(task)) {
|
||||
needsCreateOrOpen = false;
|
||||
}
|
||||
let tasks = taskMap.all();
|
||||
if (tasks.length > 0) {
|
||||
tasks = tasks.sort((a, b) => a._label.localeCompare(b._label));
|
||||
for (let task of tasks) {
|
||||
entries.push({ label: task._label, task, description: this.getTaskDescription(task), detail: this.showDetail() ? task.configurationProperties.detail : undefined });
|
||||
if (!ContributedTask.is(task)) {
|
||||
needsCreateOrOpen = false;
|
||||
}
|
||||
}
|
||||
if (needsCreateOrOpen) {
|
||||
let label = stats[0] !== undefined ? openLabel : createLabel;
|
||||
if (entries.length) {
|
||||
entries.push({ type: 'separator' });
|
||||
}
|
||||
entries.push({ label, folder: this.contextService.getWorkspace().folders[0] });
|
||||
}
|
||||
} else {
|
||||
let folders = this.contextService.getWorkspace().folders;
|
||||
let index = 0;
|
||||
for (let folder of folders) {
|
||||
let tasks = taskMap.get(folder);
|
||||
if (tasks.length > 0) {
|
||||
tasks = tasks.slice().sort((a, b) => a._label.localeCompare(b._label));
|
||||
for (let i = 0; i < tasks.length; i++) {
|
||||
let entry: TaskQuickPickEntryType = { label: tasks[i]._label, task: tasks[i], description: this.getTaskDescription(tasks[i]) };
|
||||
if (i === 0) {
|
||||
entries.push({ type: 'separator', label: folder.name });
|
||||
}
|
||||
entries.push(entry);
|
||||
}
|
||||
} else {
|
||||
let label = stats[index] !== undefined ? openLabel : createLabel;
|
||||
let entry: TaskQuickPickEntryType = { label, folder: folder };
|
||||
entries.push({ type: 'separator', label: folder.name });
|
||||
entries.push(entry);
|
||||
}
|
||||
index++;
|
||||
}
|
||||
if (needsCreateOrOpen) {
|
||||
let label = stats[0] !== undefined ? openLabel : createLabel;
|
||||
if (entries.length) {
|
||||
entries.push({ type: 'separator' });
|
||||
}
|
||||
entries.push({ label, folder: this.contextService.getWorkspace().folders[0] });
|
||||
}
|
||||
if ((entries.length === 1) && !needsCreateOrOpen) {
|
||||
tokenSource.cancel();
|
||||
|
||||
Reference in New Issue
Block a user