From 697a3228274203f12ef7212eb2de821c080c4a19 Mon Sep 17 00:00:00 2001 From: Jan Dolejsi Date: Thu, 18 Jul 2019 15:25:19 +0200 Subject: [PATCH] source control life-cycle --- .gitignore | 1 + source-control-sample/src/extension.ts | 55 ++++++++++++++----- .../src/fiddleDocumentContentProvider.ts | 2 +- 3 files changed, 42 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index 0d1e97d1..61475638 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ npm-debug.log Thumbs.db */node_modules/ */out/ +*/.vs/ diff --git a/source-control-sample/src/extension.ts b/source-control-sample/src/extension.ts index 9e1753e8..e6f2572e 100644 --- a/source-control-sample/src/extension.ts +++ b/source-control-sample/src/extension.ts @@ -55,6 +55,19 @@ export function activate(context: vscode.ExtensionContext) { let sourceControl = await pickSourceControl(sourceControlPane); if (sourceControl) { sourceControl.openInBrowser(); } })); + + + context.subscriptions.push(vscode.workspace.onDidChangeWorkspaceFolders(e => { + // dispose source control for removed workspace folders + e.removed.forEach(wf => { + unregisterFiddleSourceControl(wf.uri); + }); + + // initialize new source control for manually added workspace folders + e.added.forEach(wf => { + initializeFolderFromConfigurationFile(wf, context); + }); + })); } async function pickSourceControl(sourceControlPane: vscode.SourceControl): Promise { @@ -143,6 +156,15 @@ function registerFiddleSourceControl(fiddleSourceControl: FiddleSourceControl, c context.subscriptions.push(fiddleSourceControl); } +function unregisterFiddleSourceControl(folderUri: vscode.Uri): void { + if (fiddleSourceControlRegister.has(folderUri)) { + const previousSourceControl = fiddleSourceControlRegister.get(folderUri)!; + previousSourceControl.dispose(); + + fiddleSourceControlRegister.delete(folderUri); + } +} + /** * When the extension starts up, it must visit all workspace folders to see if any of them are fiddles. * @param context extension context @@ -150,22 +172,25 @@ function registerFiddleSourceControl(fiddleSourceControl: FiddleSourceControl, c function initializeFromConfigurationFile(context: vscode.ExtensionContext): void { if (!vscode.workspace.workspaceFolders) { return; } - vscode.workspace.workspaceFolders.forEach(folder => { - const configurationPath = path.join(folder.uri.fsPath, CONFIGURATION_FILE); - exists(configurationPath, configFileExists => { - if (configFileExists) { - readFile(configurationPath, { flag: 'r' }, async (err, data) => { - if (err) { vscode.window.showErrorMessage(err.message); } - try { - let fiddleSourceControl = await FiddleSourceControl.fromConfiguration(JSON.parse(data.toString("utf-8")), folder, context, false); - registerFiddleSourceControl(fiddleSourceControl, context); - } catch (ex) { - vscode.window.showErrorMessage(ex); - } - }); - } - }); + vscode.workspace.workspaceFolders.forEach(folder => initializeFolderFromConfigurationFile(folder, context)); +} + +function initializeFolderFromConfigurationFile(folder: vscode.WorkspaceFolder, context: vscode.ExtensionContext): void { + const configurationPath = path.join(folder.uri.fsPath, CONFIGURATION_FILE); + exists(configurationPath, configFileExists => { + if (configFileExists) { + readFile(configurationPath, { flag: 'r' }, async (err, data) => { + if (err) { vscode.window.showErrorMessage(err.message); } + try { + let fiddleSourceControl = await FiddleSourceControl.fromConfiguration(JSON.parse(data.toString("utf-8")), folder, context, false); + registerFiddleSourceControl(fiddleSourceControl, context); + } catch (ex) { + vscode.window.showErrorMessage(ex); + } + }); + } }); + } async function selectWorkspaceFolder(context: vscode.ExtensionContext, fiddleId: string): Promise { diff --git a/source-control-sample/src/fiddleDocumentContentProvider.ts b/source-control-sample/src/fiddleDocumentContentProvider.ts index bb0d6e05..1752d8a1 100644 --- a/source-control-sample/src/fiddleDocumentContentProvider.ts +++ b/source-control-sample/src/fiddleDocumentContentProvider.ts @@ -8,7 +8,7 @@ import { basename } from "path"; */ export class JSFiddleDocumentContentProvider implements TextDocumentContentProvider, Disposable { private _onDidChange = new EventEmitter(); - private fiddles = new Map(); + private fiddles = new Map(); // this assumes each fiddle is only open once per workspace get onDidChange(): Event { return this._onDidChange.event;