Skip to content

Commit 18d958e

Browse files
author
Akos Kitta
committed
fix: restore #1445
Signed-off-by: Akos Kitta <[email protected]>
1 parent 4cc8a3f commit 18d958e

File tree

1 file changed

+25
-10
lines changed

1 file changed

+25
-10
lines changed

Diff for: arduino-ide-extension/src/node/config-service-impl.ts

+25-10
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,19 @@ export class ConfigServiceImpl
143143
try {
144144
const cliConfig = await this.loadCliConfig();
145145
this.cliConfig = cliConfig;
146-
const config = await this.mapCliConfigToAppConfig(this.cliConfig);
146+
const [config] = await Promise.all([
147+
this.mapCliConfigToAppConfig(this.cliConfig),
148+
this.ensureUserDirExists(this.cliConfig).catch((reason) => {
149+
if (reason instanceof Error) {
150+
this.logger.warn(
151+
`Could not ensure user directory existence: ${this.cliConfig?.directories.user}`,
152+
reason
153+
);
154+
}
155+
// NOOP. Try to create the folder if missing but swallow any errors.
156+
// The validation will take care of the missing location handling.
157+
}),
158+
]);
147159
this._configState.config = config;
148160
await this.validateCliConfig(this.cliConfig);
149161
delete this._configState.messages;
@@ -249,7 +261,6 @@ export class ConfigServiceImpl
249261
private async checkAccessible({
250262
directories,
251263
}: DefaultCliConfig): Promise<string[]> {
252-
// Both data and user folders must be read and writable
253264
const accessible = (folderPath: string) =>
254265
fs.access(folderPath, constants.R_OK | constants.W_OK);
255266
const toConfigErrors = (
@@ -268,14 +279,11 @@ export class ConfigServiceImpl
268279
),
269280
]
270281
: [];
271-
const { user, data } = directories;
272-
const [userAccessible, dataAccessible] = await Promise.allSettled([
273-
accessible(user),
274-
accessible(data),
275-
]);
276-
return ([] as string[])
277-
.concat(toConfigErrors('user', user, userAccessible))
278-
.concat(toConfigErrors('data', data, dataAccessible));
282+
const { user } = directories;
283+
const [userAccessible] = await Promise.allSettled([accessible(user)]); // XXX: validate `directory.data` if required
284+
return ([] as string[]).concat(
285+
toConfigErrors('user', user, userAccessible)
286+
);
279287
}
280288

281289
private async updateDaemon(
@@ -335,6 +343,13 @@ export class ConfigServiceImpl
335343
grpc.credentials.createInsecure()
336344
) as SettingsServiceClient;
337345
}
346+
347+
// #1445
348+
private async ensureUserDirExists(
349+
cliConfig: DefaultCliConfig
350+
): Promise<void> {
351+
await fs.mkdir(cliConfig.directories.user, { recursive: true });
352+
}
338353
}
339354

340355
class InvalidConfigError extends Error {

0 commit comments

Comments
 (0)