1
1
import type { SimpleGitApi } from '../simple-git-api' ;
2
2
import type { SimpleGit } from '../../../typings' ;
3
- import { asNumber , ExitCodes } from '../utils' ;
3
+ import { asNumber , ExitCodes , LineParser , parseStringResponse } from '../utils' ;
4
4
5
5
export interface VersionResult {
6
6
major : number ;
7
7
minor : number ;
8
- patch : number ;
8
+ patch : number | string ;
9
9
agent : string ;
10
10
installed : boolean ;
11
11
}
@@ -15,7 +15,7 @@ const NOT_INSTALLED = 'installed=false';
15
15
function versionResponse (
16
16
major = 0 ,
17
17
minor = 0 ,
18
- patch = 0 ,
18
+ patch : string | number = 0 ,
19
19
agent = '' ,
20
20
installed = true
21
21
) : VersionResult {
@@ -30,7 +30,7 @@ function versionResponse(
30
30
'toString' ,
31
31
{
32
32
value ( ) {
33
- return `${ major } .${ minor } .${ patch } ` ;
33
+ return `${ this . major } .${ this . minor } .${ this . patch } ` ;
34
34
} ,
35
35
configurable : false ,
36
36
enumerable : false ,
@@ -48,24 +48,7 @@ export default function (): Pick<SimpleGit, 'version'> {
48
48
return this . _runTask ( {
49
49
commands : [ '--version' ] ,
50
50
format : 'utf-8' ,
51
- parser ( stdOut ) {
52
- if ( stdOut === NOT_INSTALLED ) {
53
- return notInstalledResponse ( ) ;
54
- }
55
-
56
- const version = / v e r s i o n ( \d + ) \. ( \d + ) \. ( \d + ) (?: \s * \( ( .+ ) \) ) ? / . exec ( stdOut ) ;
57
-
58
- if ( ! version ) {
59
- return versionResponse ( 0 , 0 , 0 , stdOut ) ;
60
- }
61
-
62
- return versionResponse (
63
- asNumber ( version [ 1 ] ) ,
64
- asNumber ( version [ 2 ] ) ,
65
- asNumber ( version [ 3 ] ) ,
66
- version [ 4 ] || ''
67
- ) ;
68
- } ,
51
+ parser : versionParser ,
69
52
onError ( result , error , done , fail ) {
70
53
if ( result . exitCode === ExitCodes . NOT_FOUND ) {
71
54
return done ( Buffer . from ( NOT_INSTALLED ) ) ;
@@ -77,3 +60,29 @@ export default function (): Pick<SimpleGit, 'version'> {
77
60
} ,
78
61
} ;
79
62
}
63
+
64
+ const parsers : LineParser < VersionResult > [ ] = [
65
+ new LineParser (
66
+ / v e r s i o n ( \d + ) \. ( \d + ) \. ( \d + ) (?: \s * \( ( .+ ) \) ) ? / ,
67
+ ( result , [ major , minor , patch , agent = '' ] ) => {
68
+ Object . assign (
69
+ result ,
70
+ versionResponse ( asNumber ( major ) , asNumber ( minor ) , asNumber ( patch ) , agent )
71
+ ) ;
72
+ }
73
+ ) ,
74
+ new LineParser (
75
+ / v e r s i o n ( \d + ) \. ( \d + ) \. ( \D + ) ( .+ ) ? $ / ,
76
+ ( result , [ major , minor , patch , agent = '' ] ) => {
77
+ Object . assign ( result , versionResponse ( asNumber ( major ) , asNumber ( minor ) , patch , agent ) ) ;
78
+ }
79
+ ) ,
80
+ ] ;
81
+
82
+ function versionParser ( stdOut : string ) {
83
+ if ( stdOut === NOT_INSTALLED ) {
84
+ return notInstalledResponse ( ) ;
85
+ }
86
+
87
+ return parseStringResponse ( versionResponse ( 0 , 0 , 0 , stdOut ) , parsers , stdOut ) ;
88
+ }
0 commit comments