Improve isWorkspaceStale detection

feature/ssh-config
Kelvin Schoofs 4 years ago
parent a50bef43b5
commit 327ae2b2c8

@ -1,21 +1,13 @@
import * as vscode from 'vscode';
import { Logging } from './logging';
import { Manager } from './manager';
import type { Manager } from './manager';
const FOLDERS = vscode.workspace.workspaceFolders!;
function isWorkspaceStale() {
const FOLDERS2 = vscode.workspace.workspaceFolders!;
if (!FOLDERS !== !FOLDERS2) return true;
// Both should exist here, but checking both for typechecking
if (!FOLDERS.length !== !FOLDERS2.length) return true;
const [folder1] = FOLDERS;
const [folder2] = FOLDERS2;
if (folder1 === folder2) return false;
const { name: name1, uri: uri1 } = folder1;
const { name: name2, uri: uri2 } = folder2;
if (name1 !== name2) return true;
if (uri1.toString() !== uri2.toString()) return true;
return false;
function isWorkspaceStale(uri: vscode.Uri) {
for (const folder of vscode.workspace.workspaceFolders || []) {
if (folder.uri.scheme !== 'ssh') continue;
if (folder.uri.authority === uri.authority) return false;
}
return true;
}
export class FileSystemRouter implements vscode.FileSystemProvider {
@ -27,19 +19,14 @@ export class FileSystemRouter implements vscode.FileSystemProvider {
public async assertFs(uri: vscode.Uri): Promise<vscode.FileSystemProvider> {
const fs = this.manager.getFs(uri);
if (fs) return fs;
// When adding one of our filesystems as the first workspace folder,
// it's possible (and even likely) that vscode will set
// vscode.workspace.workspaceFolders and prompt our filesystem
// for .vscode/settings.json, right before extensions get reloaded.
// This triggers a useless connection (and password prompting), so
// if we detect here the workspace is in a phase of change, resulting
// in extensions reload, just throw an error. vscode is fine with it.
if (isWorkspaceStale()) {
console.error('Stale workspace');
// There are some edge cases where vscode tries to access files of a WorkspaceFolder
// that's (being) removed, or it's being added but the window is supposed to reload.
// We only check the first case here
if (isWorkspaceStale(uri)) {
Logging.warning(`Stale workspace for '${uri}', returning empty file system`);
// Throwing an error gives the "${root} · Can not resolve workspace folder"
// throw vscode.FileSystemError.Unavailable('Stale workspace');
// So let's just act as if everything's fine, but there's only the void.
// The extensions (and FileSystemProviders) get reloaded soon anyway.
return (await import('./sshFileSystem')).EMPTY_FILE_SYSTEM;
}
return this.manager.createFileSystem(uri.authority);

Loading…
Cancel
Save