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