diff --git a/src/watchers/repositoryFilesWatcher.ts b/src/watchers/repositoryFilesWatcher.ts index 4fc46d24..4b465e0c 100644 --- a/src/watchers/repositoryFilesWatcher.ts +++ b/src/watchers/repositoryFilesWatcher.ts @@ -2,11 +2,16 @@ import { Event, Uri, workspace, EventEmitter } from "vscode"; import { watch } from "fs"; import { exists } from "../fs"; import { join } from "path"; +import { debounce } from "../decorators"; import { anyEvent, filterEvent, IDisposable, isDescendant } from "../util"; export class RepositoryFilesWatcher implements IDisposable { private disposables: IDisposable[] = []; + private _onRepoChange: EventEmitter; + private _onRepoCreate: EventEmitter; + private _onRepoDelete: EventEmitter; + public onDidChange: Event; public onDidCreate: Event; public onDidDelete: Event; @@ -24,9 +29,9 @@ export class RepositoryFilesWatcher implements IDisposable { constructor(readonly root: string) { const fsWatcher = workspace.createFileSystemWatcher("**"); - const _onRepoChange = new EventEmitter(); - const _onRepoCreate = new EventEmitter(); - const _onRepoDelete = new EventEmitter(); + this._onRepoChange = new EventEmitter(); + this._onRepoCreate = new EventEmitter(); + this._onRepoDelete = new EventEmitter(); let onRepoChange: Event | undefined; let onRepoCreate: Event | undefined; let onRepoDelete: Event | undefined; @@ -36,27 +41,15 @@ export class RepositoryFilesWatcher implements IDisposable { !workspace.workspaceFolders.filter(w => isDescendant(w.uri.fsPath, root)) .length ) { - const repoWatcher = watch(join(root, ".svn"), (event, filename) => { - if (event === "change") { - _onRepoChange.fire(Uri.parse(filename)); - } else if (event === "rename") { - exists(filename).then(doesExist => { - if (doesExist) { - _onRepoCreate.fire(Uri.parse(filename)); - } else { - _onRepoDelete.fire(Uri.parse(filename)); - } - }); - } - }); + const repoWatcher = watch(join(root, ".svn"), this.repoWatch); repoWatcher.on("error", error => { throw error; }); - onRepoChange = _onRepoChange.event; - onRepoCreate = _onRepoCreate.event; - onRepoDelete = _onRepoDelete.event; + onRepoChange = this._onRepoChange.event; + onRepoCreate = this._onRepoCreate.event; + onRepoDelete = this._onRepoDelete.event; } this.disposables.push(fsWatcher); @@ -108,6 +101,21 @@ export class RepositoryFilesWatcher implements IDisposable { ); } + @debounce(1000) + private repoWatch(event: string, filename: string): void { + if (event === "change") { + this._onRepoChange.fire(Uri.parse(filename)); + } else if (event === "rename") { + exists(filename).then(doesExist => { + if (doesExist) { + this._onRepoCreate.fire(Uri.parse(filename)); + } else { + this._onRepoDelete.fire(Uri.parse(filename)); + } + }); + } + } + public dispose(): void { this.disposables.forEach(d => d.dispose()); }