From b310506310ef6e0e2f65b51edb327c841fef3cfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=A4der?= Date: Mon, 25 May 2020 20:42:39 +0000 Subject: [PATCH] Replicate tasks to user settings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Thomas Mäder --- .../src/export/export-configs-manager.ts | 18 ++++------------ .../src/export/launch-configs-exporter.ts | 16 ++++++++++++-- .../src/export/task-configs-exporter.ts | 21 +++++++++---------- 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/plugins/task-plugin/src/export/export-configs-manager.ts b/plugins/task-plugin/src/export/export-configs-manager.ts index b1075d48e1..77b379fda5 100644 --- a/plugins/task-plugin/src/export/export-configs-manager.ts +++ b/plugins/task-plugin/src/export/export-configs-manager.ts @@ -10,7 +10,6 @@ import { injectable, inject, multiInject } from 'inversify'; import { CheWorkspaceClient } from '../che-workspace-client'; -import * as theia from '@theia/plugin'; import { che as cheApi } from '@eclipse-che/api'; export const ConfigurationsExporter = Symbol('ConfigurationsExporter'); @@ -23,7 +22,7 @@ export interface ConfigurationsExporter { * @param workspaceFolder workspace folder for exporting configs in the config file * @param commands commands with configurations for export */ - export(workspaceFolder: theia.WorkspaceFolder, commands: cheApi.workspace.Command[]): Promise; + export(commands: cheApi.workspace.Command[]): Promise; } /** Contains configurations as array of object and as raw content and is used at getting configurations from config file for example */ export interface Configurations { @@ -46,25 +45,16 @@ export class ExportConfigurationsManager { protected readonly exporters: ConfigurationsExporter[]; async export(): Promise { - const workspaceFolders = theia.workspace.workspaceFolders; - if (!workspaceFolders || workspaceFolders.length < 1) { - return; - } - const exportPromises = []; const cheCommands = await this.cheWorkspaceClient.getCommands(); for (const exporter of this.exporters) { - exportPromises.push(this.doExport(workspaceFolders, cheCommands, exporter)); + exportPromises.push(this.doExport(cheCommands, exporter)); } await Promise.all(exportPromises); } - private async doExport(workspaceFolders: theia.WorkspaceFolder[], cheCommands: cheApi.workspace.Command[], exporter: ConfigurationsExporter): Promise { - const exportConfigsPromises = []; - for (const workspaceFolder of workspaceFolders) { - exportConfigsPromises.push(exporter.export(workspaceFolder, cheCommands)); - } - await Promise.all(exportConfigsPromises); + private async doExport(cheCommands: cheApi.workspace.Command[], exporter: ConfigurationsExporter): Promise { + return exporter.export(cheCommands); } } diff --git a/plugins/task-plugin/src/export/launch-configs-exporter.ts b/plugins/task-plugin/src/export/launch-configs-exporter.ts index b2757e91f9..bacf4825e3 100644 --- a/plugins/task-plugin/src/export/launch-configs-exporter.ts +++ b/plugins/task-plugin/src/export/launch-configs-exporter.ts @@ -31,7 +31,20 @@ export class LaunchConfigurationsExporter implements ConfigurationsExporter { @inject(VsCodeLaunchConfigsExtractor) protected readonly vsCodeLaunchConfigsExtractor: VsCodeLaunchConfigsExtractor; - async export(workspaceFolder: theia.WorkspaceFolder, commands: cheApi.workspace.Command[]): Promise { + async export(commands: cheApi.workspace.Command[]): Promise { + if (!theia.workspace.workspaceFolders) { + return; + } + + const exportConfigsPromises: Promise[] = []; + + for (const workspaceFolder of theia.workspace.workspaceFolders) { + exportConfigsPromises.push(this.doExport(workspaceFolder, commands)); + } + await Promise.all(exportConfigsPromises); + } + + async doExport(workspaceFolder: theia.WorkspaceFolder, commands: cheApi.workspace.Command[]): Promise { const launchConfigFileUri = this.getConfigFileUri(workspaceFolder.uri.path); const configFileConfigs = this.configFileLaunchConfigsExtractor.extract(launchConfigFileUri); const vsCodeConfigs = this.vsCodeLaunchConfigsExtractor.extract(commands); @@ -67,7 +80,6 @@ export class LaunchConfigurationsExporter implements ConfigurationsExporter { conflictHandler(conflict, config2); } - return result; } diff --git a/plugins/task-plugin/src/export/task-configs-exporter.ts b/plugins/task-plugin/src/export/task-configs-exporter.ts index 46420267ca..0b88fb8bee 100644 --- a/plugins/task-plugin/src/export/task-configs-exporter.ts +++ b/plugins/task-plugin/src/export/task-configs-exporter.ts @@ -9,7 +9,6 @@ **********************************************************************/ import { injectable, inject } from 'inversify'; -import * as theia from '@theia/plugin'; import * as startPoint from '../task-plugin-backend'; import { che as cheApi } from '@eclipse-che/api'; import { TaskConfiguration } from '@eclipse-che/plugin'; @@ -20,6 +19,7 @@ import { VsCodeTaskConfigsExtractor } from '../extract/vscode-task-configs-extra import { ConfigurationsExporter } from './export-configs-manager'; import { ConfigFileTasksExtractor } from '../extract/config-file-task-configs-extractor'; import { BackwardCompatibilityResolver } from '../task/backward-compatibility'; +import { homedir } from 'os'; const CONFIG_DIR = '.theia'; const TASK_CONFIG_FILE = 'tasks.json'; @@ -27,6 +27,10 @@ const formattingOptions = { tabSize: 4, insertSpaces: true, eol: '' }; export const VSCODE_TASK_TYPE = 'vscode-task'; +// this really should be handled through some theia API, but there is none available in plugins +// it only works on linux and only if this plugin runs in the theia container +export const THEIA_USER_TASKS_PATH = resolve(homedir(), CONFIG_DIR, TASK_CONFIG_FILE); + /** Exports configurations of tasks in the config file. */ @injectable() export class TaskConfigurationsExporter implements ConfigurationsExporter { @@ -43,9 +47,8 @@ export class TaskConfigurationsExporter implements ConfigurationsExporter { @inject(BackwardCompatibilityResolver) protected readonly backwardCompatibilityResolver: BackwardCompatibilityResolver; - async export(workspaceFolder: theia.WorkspaceFolder, commands: cheApi.workspace.Command[]): Promise { - const tasksConfigFileUri = this.getConfigFileUri(workspaceFolder.uri.path); - const configFileTasks = this.configFileTasksExtractor.extract(tasksConfigFileUri); + async export(commands: cheApi.workspace.Command[]): Promise { + const configFileTasks = this.configFileTasksExtractor.extract(THEIA_USER_TASKS_PATH); const cheTasks = this.cheTaskConfigsExtractor.extract(commands); const vsCodeTasks = this.vsCodeTaskConfigsExtractor.extract(commands); @@ -54,18 +57,18 @@ export class TaskConfigurationsExporter implements ConfigurationsExporter { const configFileContent = configFileTasks.content; if (configFileContent) { - this.saveConfigs(tasksConfigFileUri, configFileContent, this.merge(configFileConfigs, devfileConfigs, this.getConsoleConflictLogger())); + this.saveConfigs(THEIA_USER_TASKS_PATH, configFileContent, this.merge(configFileConfigs, devfileConfigs, this.getConsoleConflictLogger())); return; } const vsCodeTasksContent = vsCodeTasks.content; if (vsCodeTasksContent) { - this.saveConfigs(tasksConfigFileUri, vsCodeTasksContent, devfileConfigs); + this.saveConfigs(THEIA_USER_TASKS_PATH, vsCodeTasksContent, devfileConfigs); return; } if (cheTasks) { - this.saveConfigs(tasksConfigFileUri, '', cheTasks); + this.saveConfigs(THEIA_USER_TASKS_PATH, '', cheTasks); } } @@ -103,10 +106,6 @@ export class TaskConfigurationsExporter implements ConfigurationsExporter { return JSON.stringify(properties1) === JSON.stringify(properties2); } - private getConfigFileUri(rootDir: string): string { - return resolve(rootDir.toString(), CONFIG_DIR, TASK_CONFIG_FILE); - } - private saveConfigs(tasksConfigFileUri: string, content: string, configurations: TaskConfiguration[]): void { const result = modify(content, ['tasks'], configurations.map(config => Object.assign(config, { _scope: undefined })), formattingOptions); writeFileSync(tasksConfigFileUri, result);