From 9ae721292dac675c7f7a59f62ecbe1798e2cda41 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Tue, 27 Aug 2019 18:27:12 +0200 Subject: [PATCH] Fixed the FS path issue on Windows. Signed-off-by: Akos Kitta --- .../browser/arduino-frontend-contribution.tsx | 9 ++---- .../src/browser/arduino-workspace-service.ts | 2 +- .../src/common/protocol/config-service.ts | 7 ++--- arduino-ide-extension/src/node/arduino-cli.ts | 31 +++++++++++++------ .../src/node/core-client-provider-impl.ts | 7 +++-- .../src/node/default-workspace-server-ext.ts | 3 +- 6 files changed, 35 insertions(+), 24 deletions(-) diff --git a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx index 87b953ca..9a778948 100644 --- a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx +++ b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx @@ -457,12 +457,9 @@ export class ArduinoFrontendContribution implements TabBarToolbarContribution, C let sketches: Sketch[] = []; const config = await this.configService.getConfiguration(); - const result = config.sketchDirPath; - if (!!result) { - const stat = await this.fileSystem.getFileStat(result); - if (!!stat) { - sketches = await this.sketches.getSketches(stat); - } + const stat = await this.fileSystem.getFileStat(config.sketchDirUri); + if (!!stat) { + sketches = await this.sketches.getSketches(stat); } return sketches; } diff --git a/arduino-ide-extension/src/browser/arduino-workspace-service.ts b/arduino-ide-extension/src/browser/arduino-workspace-service.ts index f40857ee..e47c6899 100644 --- a/arduino-ide-extension/src/browser/arduino-workspace-service.ts +++ b/arduino-ide-extension/src/browser/arduino-workspace-service.ts @@ -29,7 +29,7 @@ export class AWorkspaceService extends WorkspaceService { let result = await super.getDefaultWorkspacePath(); if (!result) { const config = await this.configService.getConfiguration(); - result = config.sketchDirPath; + result = config.sketchDirUri; } const stat = await this.fileSystem.getFileStat(result); diff --git a/arduino-ide-extension/src/common/protocol/config-service.ts b/arduino-ide-extension/src/common/protocol/config-service.ts index 6cc69d1a..fb8c90cd 100644 --- a/arduino-ide-extension/src/common/protocol/config-service.ts +++ b/arduino-ide-extension/src/common/protocol/config-service.ts @@ -1,4 +1,3 @@ - export const ConfigServicePath = '/services/config-service'; export const ConfigService = Symbol('ConfigService'); @@ -7,6 +6,6 @@ export interface ConfigService { } export interface Config { - sketchDirPath: string; - dataDirPath: string; -} \ No newline at end of file + sketchDirUri: string; + dataDirUri: string; +} diff --git a/arduino-ide-extension/src/node/arduino-cli.ts b/arduino-ide-extension/src/node/arduino-cli.ts index 007f9f7d..db559f3c 100644 --- a/arduino-ide-extension/src/node/arduino-cli.ts +++ b/arduino-ide-extension/src/node/arduino-cli.ts @@ -2,12 +2,17 @@ import * as os from 'os'; import * as which from 'which'; import * as cp from 'child_process'; import { join, delimiter } from 'path'; -import { injectable } from 'inversify'; +import { injectable, inject } from 'inversify'; +import { ILogger } from '@theia/core'; +import { FileUri } from '@theia/core/lib/node/file-uri'; import { Config } from '../common/protocol/config-service'; @injectable() export class ArduinoCli { + @inject(ILogger) + protected logger: ILogger; + async getExecPath(): Promise { const build = join(__dirname, '..', '..', 'build'); return new Promise((resolve, reject) => { @@ -47,25 +52,33 @@ export class ArduinoCli { for (const line of raw.split(/\r?\n/) || []) { // TODO: Named capture groups are avail from ES2018. // const pair = line.match(/(?[^:]+):(?[^,]+),?/); - const pair = line.split(':').map(entry => entry.trim()); - if (pair[0] === 'sketchbook_path') { - config.sketchDirPath = pair[1]; - } else if (pair[0] === 'arduino_data') { - config.dataDirPath = pair[1]; + const index = line.indexOf(':'); + if (index !== -1) { + const key = line.substr(0, index).trim(); + const value = line.substr(index + 1, line.length).trim(); + if (!!key && !!value) { + if (key === 'sketchbook_path') { + config.sketchDirUri = FileUri.create(value).toString(); + } else if (key === 'arduino_data') { + config.dataDirUri = FileUri.create(value).toString(); + } + } } } - if (!config.dataDirPath) { + if (!config.dataDirUri) { reject(new Error(`Could not parse config. 'arduino_data' was missing from: ${stdout}`)); return; } - if (!config.sketchDirPath) { + if (!config.sketchDirUri) { reject(new Error(`Could not parse config. 'sketchbook_path' was missing from: ${stdout}`)); return; } - resolve({ sketchDirPath: config.sketchDirPath, dataDirPath: config.dataDirPath }); + this.logger.info(`Retrieved the default configuration from the CLI: ${JSON.stringify(config)}`); + + resolve({ sketchDirUri: config.sketchDirUri, dataDirUri: config.dataDirUri }); }); }); } diff --git a/arduino-ide-extension/src/node/core-client-provider-impl.ts b/arduino-ide-extension/src/node/core-client-provider-impl.ts index 4c28df7e..a4dba8b9 100644 --- a/arduino-ide-extension/src/node/core-client-provider-impl.ts +++ b/arduino-ide-extension/src/node/core-client-provider-impl.ts @@ -20,6 +20,7 @@ import { import { ArduinoCli } from './arduino-cli'; import { Instance } from './cli-protocol/commands/common_pb'; import { CoreClientProvider, Client } from './core-client-provider'; +import { FileUri } from '@theia/core/lib/node'; @injectable() export class CoreClientProviderImpl implements CoreClientProvider { @@ -79,7 +80,9 @@ export class CoreClientProviderImpl implements CoreClientProvider { throw new Error(`Could not resolve filesystem path of URI: ${rootUri}.`); } - const { dataDirPath, sketchDirPath } = await this.cli.getDefaultConfig(); + const { dataDirUri, sketchDirUri } = await this.cli.getDefaultConfig(); + const dataDirPath = FileUri.fsPath(dataDirUri); + const sketchDirPath = FileUri.fsPath(sketchDirUri); if (!fs.existsSync(dataDirPath)) { fs.mkdirSync(dataDirPath); @@ -90,7 +93,7 @@ export class CoreClientProviderImpl implements CoreClientProvider { } const downloadDir = path.join(dataDirPath, 'staging'); - if (fs.existsSync(downloadDir)) { + if (!fs.existsSync(downloadDir)) { fs.mkdirSync(downloadDir); } diff --git a/arduino-ide-extension/src/node/default-workspace-server-ext.ts b/arduino-ide-extension/src/node/default-workspace-server-ext.ts index a5a17e1b..70a0a66b 100644 --- a/arduino-ide-extension/src/node/default-workspace-server-ext.ts +++ b/arduino-ide-extension/src/node/default-workspace-server-ext.ts @@ -1,5 +1,4 @@ import { injectable, inject } from 'inversify'; -import { FileUri } from '@theia/core/lib/node/file-uri'; import { DefaultWorkspaceServer } from '@theia/workspace/lib/node/default-workspace-server'; import { ConfigService } from '../common/protocol/config-service'; @@ -10,7 +9,7 @@ export class DefaultWorkspaceServerExt extends DefaultWorkspaceServer { protected async getWorkspaceURIFromCli(): Promise { const config = await this.configService.getConfiguration(); - return FileUri.create(config.sketchDirPath).toString(); + return config.sketchDirUri; } } \ No newline at end of file