Skip to content

Commit

Permalink
fixup! feat: use Arduino CLI 1.0.0
Browse files Browse the repository at this point in the history
  • Loading branch information
giacomocusinato committed Jul 22, 2024
1 parent aca5ece commit f881ce4
Showing 1 changed file with 23 additions and 29 deletions.
52 changes: 23 additions & 29 deletions arduino-ide-extension/src/node/config-service-impl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import {
} from '../common/protocol';
import { spawnCommand } from './exec-util';
import { ArduinoDaemonImpl } from './arduino-daemon-impl';
import { DefaultCliConfig, CLI_CONFIG } from './cli-config';
import { DefaultCliConfig, CLI_CONFIG, CliConfig } from './cli-config';
import { Deferred } from '@theia/core/lib/common/promise-util';
import { EnvVariablesServer } from '@theia/core/lib/common/env-variables';
import { deepClone, nls } from '@theia/core';
Expand Down Expand Up @@ -180,17 +180,13 @@ export class ConfigServiceImpl
const content = await fs.readFile(cliConfigPath, {
encoding: 'utf8',
});
const model = (yaml.safeLoad(content) || {}) as DefaultCliConfig;
const model = (yaml.safeLoad(content) || {}) as CliConfig;
this.logger.info(`Loaded CLI configuration: ${JSON.stringify(model)}`);
if (
model.directories &&
model.directories.data &&
model.directories.user
) {
if (model.directories?.data && model.directories?.user) {
this.logger.info(
"'directories.data' and 'directories.user' are set in the CLI configuration model."
);
return model;
return model as DefaultCliConfig;
}
// The CLI can run with partial (missing `port`, `directories`), the IDE2 cannot.
// We merge the default CLI config with the partial user's config.
Expand Down Expand Up @@ -221,17 +217,14 @@ export class ConfigServiceImpl

private async getFallbackCliConfig(): Promise<DefaultCliConfig> {
const cliPath = this.daemon.getExecPath();
const rawJson = await spawnCommand(cliPath, ['config', 'dump', '--json']);
const config = JSON.parse(rawJson);

// Since CLI 1.0, the command `config dump` only returns user-modified values and not default ones.
// directories.user and directories.data are required by IDE2 so we get the default value explicitly.
const directoriesRaw = await spawnCommand(cliPath, [
'config',
'get',
'directories',
'--json',
const [configRaw, directoriesRaw] = await Promise.all([
spawnCommand(cliPath, ['config', 'dump', '--json']),
// Since CLI 1.0, the command `config dump` only returns user-modified values and not default ones.
// directories.user and directories.data are required by IDE2 so we get the default value explicitly.
spawnCommand(cliPath, ['config', 'get', 'directories', '--json']),
]);

const config = JSON.parse(configRaw);
const { user, data } = JSON.parse(directoriesRaw);

return { ...config.config, directories: { user, data } };
Expand Down Expand Up @@ -317,25 +310,26 @@ export class ConfigServiceImpl
config.board_manager?.additional_urls || [],
};

const client = createArduinoCoreServiceClient({ port });

for (const [key, value] of Object.entries(updatableConfig)) {
const client = createArduinoCoreServiceClient({ port });
const req = new SettingsSetValueRequest();
req.setKey(key);
req.setEncodedValue(JSON.stringify(value));
await new Promise<void>((resolve, reject) => {
await new Promise<void>((resolve) => {
client.settingsSetValue(req, (error) => {
try {
if (error) {
reject(error);
return;
}
resolve();
} finally {
client.close();
if (error) {
this.logger.error(
`Could not update config with key: ${key} and value: ${value}`,
error
);
}
resolve();
});
});
}

client.close();
}

private async writeDaemonState(port: number): Promise<void> {
Expand All @@ -359,7 +353,7 @@ export class ConfigServiceImpl

const cliConfigUri = await this.getCliConfigFileUri();
const cliConfigPath = FileUri.fsPath(cliConfigUri);
fs.writeFile(cliConfigPath, configRaw, { encoding: 'utf-8' });
await fs.writeFile(cliConfigPath, configRaw, { encoding: 'utf-8' });
}

// #1445
Expand Down

0 comments on commit f881ce4

Please sign in to comment.