@@ -7,6 +7,7 @@ import * as path from "path";
77import { Repository } from "./svnRepository" ;
88import { parseInfoXml } from "./infoParser" ;
99import { SpawnOptions } from "child_process" ;
10+ import { IDisposable , toDisposable , dispose } from "./util" ;
1011
1112// List: https://github.com/apache/subversion/blob/1.6.x/subversion/svn/schema/status.rnc#L33
1213export enum Status {
@@ -180,25 +181,47 @@ export class Svn {
180181
181182 let process = cp . spawn ( this . svnPath , args , options ) ;
182183
184+ const disposables : IDisposable [ ] = [ ] ;
185+
186+ const once = (
187+ ee : NodeJS . EventEmitter ,
188+ name : string ,
189+ fn : ( ...args : any [ ] ) => void
190+ ) => {
191+ ee . once ( name , fn ) ;
192+ disposables . push ( toDisposable ( ( ) => ee . removeListener ( name , fn ) ) ) ;
193+ } ;
194+
195+ const on = (
196+ ee : NodeJS . EventEmitter ,
197+ name : string ,
198+ fn : ( ...args : any [ ] ) => void
199+ ) => {
200+ ee . on ( name , fn ) ;
201+ disposables . push ( toDisposable ( ( ) => ee . removeListener ( name , fn ) ) ) ;
202+ } ;
203+
183204 let [ exitCode , stdout , stderr ] = await Promise . all < any > ( [
184205 new Promise < number > ( ( resolve , reject ) => {
185- process . once ( "error" , reject ) ;
186- process . once ( "exit" , resolve ) ;
206+ once ( process , "error" , reject ) ;
207+ once ( process , "exit" , resolve ) ;
187208 } ) ,
188209 new Promise < Buffer > ( resolve => {
189210 const buffers : Buffer [ ] = [ ] ;
190- process . stdout . on ( "data" , ( b : Buffer ) => buffers . push ( b ) ) ;
191- process . stdout . once ( "close" , ( ) => resolve ( Buffer . concat ( buffers ) ) ) ;
211+ on ( process . stdout , "data" , ( b : Buffer ) => buffers . push ( b ) ) ;
212+ once ( process . stdout , "close" , ( ) => resolve ( Buffer . concat ( buffers ) ) ) ;
192213 } ) ,
193214 new Promise < string > ( resolve => {
194215 const buffers : Buffer [ ] = [ ] ;
195- process . stderr . on ( "data" , ( b : Buffer ) => buffers . push ( b ) ) ;
196- process . stderr . once ( "close" , ( ) =>
216+ on ( process . stderr , "data" , ( b : Buffer ) => buffers . push ( b ) ) ;
217+ once ( process . stderr , "close" , ( ) =>
197218 resolve ( Buffer . concat ( buffers ) . toString ( ) )
198219 ) ;
199220 } )
200221 ] ) ;
201222
223+ dispose ( disposables ) ;
224+
202225 let encoding = "utf8" ;
203226
204227 // SVN with '--xml' always return 'UTF-8', and jschardet detects this encoding: 'TIS-620'
0 commit comments