1
1
import * as cp from "child_process" ;
2
2
import * as path from "path" ;
3
+ import * as semver from "semver" ;
3
4
import { cpErrorHandler } from "./svn" ;
4
5
5
6
export interface ISvn {
6
7
path : string ;
7
8
version : string ;
8
9
}
9
10
10
- export function parseVersion ( raw : string ) : string {
11
- const match = raw . match ( / ( \d + \. \d + \. \d + \( r \d + \) ) / ) ;
12
-
13
- if ( match && match [ 0 ] ) {
14
- return match [ 0 ] ;
15
- }
16
- return raw . split ( / [ \r \n ] + / ) [ 0 ] ;
17
- }
18
-
19
11
export class SvnFinder {
20
12
public findSvn ( hint ?: string ) : Promise < ISvn > {
21
13
const first = hint
@@ -33,7 +25,7 @@ export class SvnFinder {
33
25
return this . findSpecificSvn ( "svn" ) ;
34
26
}
35
27
} )
36
- . then ( svn => this . checkSvnCommand ( svn ) )
28
+ . then ( svn => this . checkSvnVersion ( svn ) )
37
29
. then ( null , ( ) =>
38
30
Promise . reject ( new Error ( "Svn installation not found." ) )
39
31
) ;
@@ -69,12 +61,12 @@ export class SvnFinder {
69
61
70
62
function getVersion ( path : string ) {
71
63
// make sure svn executes
72
- cp . exec ( "svn --version" , ( err , stdout ) => {
64
+ cp . exec ( "svn --version --quiet " , ( err , stdout ) => {
73
65
if ( err ) {
74
66
return e ( "svn not found" ) ;
75
67
}
76
68
77
- return c ( { path, version : parseVersion ( stdout . trim ( ) ) } ) ;
69
+ return c ( { path, version : stdout . trim ( ) } ) ;
78
70
} ) ;
79
71
}
80
72
@@ -100,7 +92,7 @@ export class SvnFinder {
100
92
public findSpecificSvn ( path : string ) : Promise < ISvn > {
101
93
return new Promise < ISvn > ( ( c , e ) => {
102
94
const buffers : Buffer [ ] = [ ] ;
103
- const child = cp . spawn ( path , [ "--version" ] ) ;
95
+ const child = cp . spawn ( path , [ "--version" , "--quiet" ] ) ;
104
96
child . stdout . on ( "data" , ( b : Buffer ) => buffers . push ( b ) ) ;
105
97
child . on ( "error" , cpErrorHandler ( e ) ) ;
106
98
child . on (
@@ -110,29 +102,23 @@ export class SvnFinder {
110
102
? e ( new Error ( "Not found" ) )
111
103
: c ( {
112
104
path,
113
- version : parseVersion (
114
- Buffer . concat ( buffers )
115
- . toString ( "utf8" )
116
- . trim ( )
117
- )
105
+ version : Buffer . concat ( buffers )
106
+ . toString ( "utf8" )
107
+ . trim ( )
118
108
} )
119
109
) ;
120
110
} ) ;
121
111
}
122
112
123
- public checkSvnCommand ( svn : ISvn ) : Promise < ISvn > {
113
+ public checkSvnVersion ( svn : ISvn ) : Promise < ISvn > {
124
114
return new Promise < ISvn > ( ( c , e ) => {
125
- const buffers : Buffer [ ] = [ ] ;
126
- const child = cp . spawn ( svn . path , [ "help" , "checkout" ] ) ;
127
- child . stdout . on ( "data" , ( b : Buffer ) => buffers . push ( b ) ) ;
128
- child . on ( "error" , cpErrorHandler ( e ) ) ;
129
- child . on (
130
- "close" ,
131
- code =>
132
- code || Buffer . concat ( buffers ) . toString ( "utf8" ) . length < 100
133
- ? e ( new Error ( "Not found" ) )
134
- : c ( svn )
135
- ) ;
115
+ if ( ! semver . valid ( svn . version ) ) {
116
+ e ( new Error ( "Invalid svn version" ) ) ;
117
+ } else if ( ! semver . gte ( svn . version , "1.6.0" ) ) {
118
+ e ( new Error ( "Required svn version must be >= 1.6" ) ) ;
119
+ } else {
120
+ c ( svn ) ;
121
+ }
136
122
} ) ;
137
123
}
138
124
}
0 commit comments