@@ -2,11 +2,16 @@ import { Event, Uri, workspace, EventEmitter } from "vscode";
2
2
import { watch } from "fs" ;
3
3
import { exists } from "../fs" ;
4
4
import { join } from "path" ;
5
+ import { debounce } from "../decorators" ;
5
6
import { anyEvent , filterEvent , IDisposable , isDescendant } from "../util" ;
6
7
7
8
export class RepositoryFilesWatcher implements IDisposable {
8
9
private disposables : IDisposable [ ] = [ ] ;
9
10
11
+ private _onRepoChange : EventEmitter < Uri > ;
12
+ private _onRepoCreate : EventEmitter < Uri > ;
13
+ private _onRepoDelete : EventEmitter < Uri > ;
14
+
10
15
public onDidChange : Event < Uri > ;
11
16
public onDidCreate : Event < Uri > ;
12
17
public onDidDelete : Event < Uri > ;
@@ -24,9 +29,9 @@ export class RepositoryFilesWatcher implements IDisposable {
24
29
25
30
constructor ( readonly root : string ) {
26
31
const fsWatcher = workspace . createFileSystemWatcher ( "**" ) ;
27
- const _onRepoChange = new EventEmitter < Uri > ( ) ;
28
- const _onRepoCreate = new EventEmitter < Uri > ( ) ;
29
- const _onRepoDelete = new EventEmitter < Uri > ( ) ;
32
+ this . _onRepoChange = new EventEmitter < Uri > ( ) ;
33
+ this . _onRepoCreate = new EventEmitter < Uri > ( ) ;
34
+ this . _onRepoDelete = new EventEmitter < Uri > ( ) ;
30
35
let onRepoChange : Event < Uri > | undefined ;
31
36
let onRepoCreate : Event < Uri > | undefined ;
32
37
let onRepoDelete : Event < Uri > | undefined ;
@@ -36,27 +41,15 @@ export class RepositoryFilesWatcher implements IDisposable {
36
41
! workspace . workspaceFolders . filter ( w => isDescendant ( w . uri . fsPath , root ) )
37
42
. length
38
43
) {
39
- const repoWatcher = watch ( join ( root , ".svn" ) , ( event , filename ) => {
40
- if ( event === "change" ) {
41
- _onRepoChange . fire ( Uri . parse ( filename ) ) ;
42
- } else if ( event === "rename" ) {
43
- exists ( filename ) . then ( doesExist => {
44
- if ( doesExist ) {
45
- _onRepoCreate . fire ( Uri . parse ( filename ) ) ;
46
- } else {
47
- _onRepoDelete . fire ( Uri . parse ( filename ) ) ;
48
- }
49
- } ) ;
50
- }
51
- } ) ;
44
+ const repoWatcher = watch ( join ( root , ".svn" ) , this . repoWatch ) ;
52
45
53
46
repoWatcher . on ( "error" , error => {
54
47
throw error ;
55
48
} ) ;
56
49
57
- onRepoChange = _onRepoChange . event ;
58
- onRepoCreate = _onRepoCreate . event ;
59
- onRepoDelete = _onRepoDelete . event ;
50
+ onRepoChange = this . _onRepoChange . event ;
51
+ onRepoCreate = this . _onRepoCreate . event ;
52
+ onRepoDelete = this . _onRepoDelete . event ;
60
53
}
61
54
62
55
this . disposables . push ( fsWatcher ) ;
@@ -108,6 +101,21 @@ export class RepositoryFilesWatcher implements IDisposable {
108
101
) ;
109
102
}
110
103
104
+ @debounce ( 1000 )
105
+ private repoWatch ( event : string , filename : string ) : void {
106
+ if ( event === "change" ) {
107
+ this . _onRepoChange . fire ( Uri . parse ( filename ) ) ;
108
+ } else if ( event === "rename" ) {
109
+ exists ( filename ) . then ( doesExist => {
110
+ if ( doesExist ) {
111
+ this . _onRepoCreate . fire ( Uri . parse ( filename ) ) ;
112
+ } else {
113
+ this . _onRepoDelete . fire ( Uri . parse ( filename ) ) ;
114
+ }
115
+ } ) ;
116
+ }
117
+ }
118
+
111
119
public dispose ( ) : void {
112
120
this . disposables . forEach ( d => d . dispose ( ) ) ;
113
121
}
0 commit comments