From daa8cce0b8f17c1cff4c44a03370710579685912 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 11 Jan 2017 15:21:52 +0100 Subject: [PATCH] git: react to fs events --- extensions/git/src/main.ts | 38 ++++++++++++++++++++++++++++++- extensions/git/src/model.ts | 23 ++++--------------- extensions/git/src/scmProvider.ts | 2 +- 3 files changed, 43 insertions(+), 20 deletions(-) diff --git a/extensions/git/src/main.ts b/extensions/git/src/main.ts index 3ec286a7658..97a4e237a39 100644 --- a/extensions/git/src/main.ts +++ b/extensions/git/src/main.ts @@ -11,7 +11,9 @@ import { findGit, Git } from './git'; import { Model } from './model'; import { GitSCMProvider } from './scmProvider'; import { registerCommands } from './commands'; +import { anyEvent, throttle } from './util'; import * as nls from 'vscode-nls'; +import { decorate, debounce } from 'core-decorators'; nls.config(); @@ -36,6 +38,37 @@ class TextDocumentContentProvider { } } +class Watcher { + + private disposables: Disposable[]; + + constructor(private model: Model) { + const fsWatcher = workspace.createFileSystemWatcher('**'); + const onFSChange = anyEvent(fsWatcher.onDidChange, fsWatcher.onDidCreate, fsWatcher.onDidDelete); + + this.disposables = [ + fsWatcher, + onFSChange(this.eventuallyUpdateModel, this) + ]; + } + + @debounce(1000) + private eventuallyUpdateModel(): void { + this.updateModelAndWait(); + } + + @decorate(throttle) + private async updateModelAndWait(): Promise { + console.log('UPDATE'); + await this.model.update(); + await new Promise(c => setTimeout(c, 8000)); + } + + dispose(): void { + this.disposables.forEach(d => d.dispose()); + } +} + async function init(disposables: Disposable[]): Promise { const rootPath = workspace.rootPath; @@ -55,11 +88,14 @@ async function init(disposables: Disposable[]): Promise { outputChannel.appendLine(`Using git ${info.version} from ${info.path}`); git.onOutput(str => outputChannel.append(str), null, disposables); + const watcher = new Watcher(model); + disposables.push( registerCommands(model), scm.registerSCMProvider('git', provider), workspace.registerTextDocumentContentProvider('git-index', new TextDocumentContentProvider(git, rootPath)), - outputChannel + outputChannel, + watcher ); } diff --git a/extensions/git/src/model.ts b/extensions/git/src/model.ts index 167314813e1..1a2767c7733 100644 --- a/extensions/git/src/model.ts +++ b/extensions/git/src/model.ts @@ -203,21 +203,8 @@ export class Model { return this._remotes; } - update(now = false): void { - if (now) { - this.updateNow(); - } else { - this.eventuallyUpdate(); - } - } - - @debounce(500) - private eventuallyUpdate(): void { - this.updateNow(); - } - @decorate(throttle) - private async updateNow(): Promise { + async update(): Promise { const status = await this.repository.getStatus(); let HEAD: IRef | undefined; @@ -286,13 +273,13 @@ export class Model { async stage(...resources: Resource[]): Promise { const paths = resources.map(r => r.uri.fsPath); await this.repository.add(paths); - await this.updateNow(); + await this.update(); } async unstage(...resources: Resource[]): Promise { const paths = resources.map(r => r.uri.fsPath); await this.repository.revertFiles('HEAD', paths); - await this.updateNow(); + await this.update(); } async commit(message: string, opts: { all?: boolean, amend?: boolean, signoff?: boolean } = Object.create(null)): Promise { @@ -301,7 +288,7 @@ export class Model { } await this.repository.commit(message, opts); - await this.updateNow(); + await this.update(); } async clean(...resources: Resource[]): Promise { @@ -332,6 +319,6 @@ export class Model { } await Promise.all(promises); - await this.updateNow(); + await this.update(); } } \ No newline at end of file diff --git a/extensions/git/src/scmProvider.ts b/extensions/git/src/scmProvider.ts index cf665062abb..67d89c8a189 100644 --- a/extensions/git/src/scmProvider.ts +++ b/extensions/git/src/scmProvider.ts @@ -18,7 +18,7 @@ export class GitSCMProvider implements SCMProvider { get label(): string { return 'Git'; } constructor(private model: Model) { - model.update(true); + model.update(); } commit(message: string): Thenable { -- GitLab