diff --git a/src/features/ExternalApi.ts b/src/features/ExternalApi.ts index 686ac643bf..8c2f0af25b 100644 --- a/src/features/ExternalApi.ts +++ b/src/features/ExternalApi.ts @@ -169,7 +169,9 @@ export class ExternalApiFeature extends LanguageClientConsumer implements IPower } public getStorageUri(): vscode.Uri { - return this.extensionContext.globalStorageUri; + // We have to override the scheme because it defaults to + // 'vscode-userdata' which breaks UNC paths. + return this.extensionContext.globalStorageUri.with({ scheme: "file"}); } public dispose() { diff --git a/src/logging.ts b/src/logging.ts index ef280cf8d8..fd33a303b2 100644 --- a/src/logging.ts +++ b/src/logging.ts @@ -35,12 +35,15 @@ export class Logger implements ILogger { private logChannel: vscode.OutputChannel; private logFilePath: vscode.Uri; private logDirectoryCreated = false; + private writingLog = false; constructor(logLevelName: string, globalStorageUri: vscode.Uri) { this.logLevel = Logger.logLevelNameToValue(logLevelName); this.logChannel = vscode.window.createOutputChannel("PowerShell Extension Logs"); + // We have to override the scheme because it defaults to + // 'vscode-userdata' which breaks UNC paths. this.logDirectoryPath = vscode.Uri.joinPath( - globalStorageUri, + globalStorageUri.with({ scheme: "file" }), "logs", `${Math.floor(Date.now() / 1000)}-${vscode.env.sessionId}`); this.logFilePath = this.getLogFilePath("vscode-powershell"); @@ -194,11 +197,16 @@ export class Logger implements ILogger { const timestampedMessage = Logger.timestampMessage(message, level); this.logChannel.appendLine(timestampedMessage); if (this.logLevel !== LogLevel.None) { + // A simple lock because this function isn't re-entrant. + while (this.writingLog) { + await utils.sleep(300); + } try { + this.writingLog = true; if (!this.logDirectoryCreated) { this.logChannel.appendLine(Logger.timestampMessage(`Creating log directory at: '${this.logDirectoryPath}'`, level)); await vscode.workspace.fs.createDirectory(this.logDirectoryPath); - this.logDirectoryCreated = await utils.checkIfDirectoryExists(this.logDirectoryPath); + this.logDirectoryCreated = true; } let log = new Uint8Array(); if (await utils.checkIfFileExists(this.logFilePath)) { @@ -209,6 +217,8 @@ export class Logger implements ILogger { Buffer.concat([log, Buffer.from(timestampedMessage)])); } catch (e) { console.log(`Error writing to vscode-powershell log file: ${e}`); + } finally { + this.writingLog = false; } } } diff --git a/src/session.ts b/src/session.ts index 97b8d05c6d..650a526c52 100644 --- a/src/session.ts +++ b/src/session.ts @@ -111,7 +111,9 @@ export class SessionManager implements Middleware { // Create the language status item this.languageStatusItem = this.createStatusBarItem(); - this.sessionsFolder = vscode.Uri.joinPath(extensionContext.globalStorageUri, "sessions"); + // We have to override the scheme because it defaults to + // 'vscode-userdata' which breaks UNC paths. + this.sessionsFolder = vscode.Uri.joinPath(extensionContext.globalStorageUri.with({ scheme: "file"}), "sessions"); this.platformDetails = getPlatformDetails(); this.HostName = hostName; this.HostVersion = hostVersion;