11import type { SimpleGitApi } from '../simple-git-api' ;
22import type { SimpleGit } from '../../../typings' ;
3- import { asNumber , ExitCodes } from '../utils' ;
3+ import { asNumber , ExitCodes , LineParser , parseStringResponse } from '../utils' ;
44
55export interface VersionResult {
66 major : number ;
77 minor : number ;
8- patch : number ;
8+ patch : number | string ;
99 agent : string ;
1010 installed : boolean ;
1111}
@@ -15,7 +15,7 @@ const NOT_INSTALLED = 'installed=false';
1515function versionResponse (
1616 major = 0 ,
1717 minor = 0 ,
18- patch = 0 ,
18+ patch : string | number = 0 ,
1919 agent = '' ,
2020 installed = true
2121) : VersionResult {
@@ -30,7 +30,7 @@ function versionResponse(
3030 'toString' ,
3131 {
3232 value ( ) {
33- return `${ major } .${ minor } .${ patch } ` ;
33+ return `${ this . major } .${ this . minor } .${ this . patch } ` ;
3434 } ,
3535 configurable : false ,
3636 enumerable : false ,
@@ -48,24 +48,7 @@ export default function (): Pick<SimpleGit, 'version'> {
4848 return this . _runTask ( {
4949 commands : [ '--version' ] ,
5050 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 ,
6952 onError ( result , error , done , fail ) {
7053 if ( result . exitCode === ExitCodes . NOT_FOUND ) {
7154 return done ( Buffer . from ( NOT_INSTALLED ) ) ;
@@ -77,3 +60,29 @@ export default function (): Pick<SimpleGit, 'version'> {
7760 } ,
7861 } ;
7962}
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