1
1
'use strict' ;
2
2
3
- import { CommonSpawnOptions , spawn , spawnSync } from 'child_process' ;
3
+ import { ChildProcess , CommonSpawnOptions , spawn , spawnSync , SpawnSyncReturns } from 'child_process' ;
4
4
import { platform } from 'os' ;
5
5
import { window } from 'vscode' ;
6
6
import { GaugeCommands , GRADLE_COMMAND , MAVEN_COMMAND } from './constants' ;
@@ -10,11 +10,11 @@ export class CLI {
10
10
private readonly _gaugeVersion : string ;
11
11
private readonly _gaugeCommitHash : string ;
12
12
private readonly _gaugePlugins : Array < any > ;
13
- private readonly _gaugeCommand : string ;
14
- private readonly _mvnCommand : string ;
15
- private readonly _gradleCommand : string ;
13
+ private readonly _gaugeCommand : Command ;
14
+ private readonly _mvnCommand : Command ;
15
+ private readonly _gradleCommand : Command ;
16
16
17
- public constructor ( cmd : string , manifest : any , mvnCommand : string , gradleCommand : string ) {
17
+ public constructor ( cmd : Command , manifest : any , mvnCommand : Command , gradleCommand : Command ) {
18
18
this . _gaugeCommand = cmd ;
19
19
this . _mvnCommand = mvnCommand ;
20
20
this . _gradleCommand = gradleCommand ;
@@ -23,18 +23,12 @@ export class CLI {
23
23
this . _gaugePlugins = manifest . plugins ;
24
24
}
25
25
26
- public static getDefaultSpawnOptions ( ) : CommonSpawnOptions {
27
- // should only deal with platform specific options
28
- return platform ( ) === "win32" ? { shell : true } : { } ;
29
- }
30
-
31
26
public static instance ( ) : CLI {
32
27
const gaugeCommand = this . getCommand ( GaugeCommands . Gauge ) ;
33
28
const mvnCommand = this . getCommand ( MAVEN_COMMAND ) ;
34
- let gradleCommand = this . getGradleCommand ( ) ;
35
- if ( ! gaugeCommand || gaugeCommand === '' ) return new CLI ( gaugeCommand , { } , mvnCommand , gradleCommand ) ;
36
- let options = this . getDefaultSpawnOptions ( ) ;
37
- let gv = spawnSync ( gaugeCommand , [ GaugeCommands . Version , GaugeCommands . MachineReadable ] , options ) ;
29
+ const gradleCommand = this . getGradleCommand ( ) ;
30
+ if ( ! gaugeCommand ) return new CLI ( undefined , { } , mvnCommand , gradleCommand ) ;
31
+ let gv = gaugeCommand . spawnSync ( [ GaugeCommands . Version , GaugeCommands . MachineReadable ] ) ;
38
32
let gaugeVersionInfo ;
39
33
try {
40
34
gaugeVersionInfo = JSON . parse ( gv . stdout . toString ( ) ) ;
@@ -49,12 +43,12 @@ export class CLI {
49
43
return this . _gaugePlugins . some ( ( p : any ) => p . name === pluginName ) ;
50
44
}
51
45
52
- public gaugeCommand ( ) : string {
46
+ public gaugeCommand ( ) : Command {
53
47
return this . _gaugeCommand ;
54
48
}
55
49
56
50
public isGaugeInstalled ( ) : boolean {
57
- return ! ! this . _gaugeCommand && this . _gaugeCommand !== '' ;
51
+ return ! ! this . _gaugeCommand ;
58
52
}
59
53
60
54
public isGaugeVersionGreaterOrEqual ( version : string ) : boolean {
@@ -65,31 +59,21 @@ export class CLI {
65
59
return this . _gaugePlugins . find ( ( p ) => p . name === language ) . version ;
66
60
}
67
61
68
- public getGaugeVersion ( ) : string {
69
- return this . _gaugeVersion ;
70
- }
71
-
72
62
public async installGaugeRunner ( language : string ) : Promise < any > {
73
63
let oc = window . createOutputChannel ( "Gauge Install" ) ;
74
64
let chan = new OutputChannel ( oc , `Installing gauge ${ language } plugin ...\n` , "" ) ;
75
65
return new Promise ( ( resolve , reject ) => {
76
- let options = CLI . getDefaultSpawnOptions ( ) ;
77
- let childProcess = spawn ( this . _gaugeCommand , [ GaugeCommands . Install , language ] , options ) ;
66
+ let childProcess = this . _gaugeCommand . spawn ( [ GaugeCommands . Install , language ] ) ;
78
67
childProcess . stdout . on ( 'data' , ( chunk ) => chan . appendOutBuf ( chunk . toString ( ) ) ) ;
79
68
childProcess . stderr . on ( 'data' , ( chunk ) => chan . appendErrBuf ( chunk . toString ( ) ) ) ;
80
69
childProcess . on ( 'exit' , ( code ) => {
81
- let postFailureMessage = '\nRefer https://docs.gauge.org/plugin.html' +
82
- ' to install manually' ;
70
+ let postFailureMessage = '\nRefer to https://docs.gauge.org/plugin.html to install manually' ;
83
71
chan . onFinish ( resolve , code , "" , postFailureMessage , false ) ;
84
72
} ) ;
85
73
} ) ;
86
74
}
87
75
88
- public isMavenInstalled ( ) : boolean {
89
- return ! ! this . _mvnCommand && this . _mvnCommand !== '' ;
90
- }
91
-
92
- public mavenCommand ( ) : string {
76
+ public mavenCommand ( ) : Command {
93
77
return this . _mvnCommand ;
94
78
}
95
79
@@ -107,23 +91,54 @@ export class CLI {
107
91
return `${ v } \n${ cm } \n\n${ plugins } ` ;
108
92
}
109
93
110
- public static getCommandCandidates ( command : string ) : string [ ] {
111
- return ( platform ( ) === 'win32' ? [ ".exe" , ".bat" , ".cmd" ] : [ "" ] )
112
- . map ( ( ext ) => `${ command } ${ ext } ` ) ;
94
+ public static getCommandCandidates ( command : string ) : Command [ ] {
95
+ return platform ( ) === 'win32' ? [
96
+ new Command ( command , ".exe" ) ,
97
+ new Command ( command , ".bat" , true ) ,
98
+ new Command ( command , ".cmd" , true ) ,
99
+ ] : [
100
+ new Command ( command )
101
+ ]
113
102
}
114
103
115
- public static checkSpawnable ( command : string ) : boolean {
116
- const result = spawnSync ( command , [ ] , CLI . getDefaultSpawnOptions ( ) ) ;
104
+ public static isSpawnable ( command : Command ) : boolean {
105
+ const result = command . spawnSync ( ) ;
117
106
return result . status === 0 && ! result . error ;
118
107
}
119
108
120
- private static getCommand ( command : string ) : string {
109
+ private static getCommand ( command : string ) : Command | undefined {
121
110
for ( const candidate of this . getCommandCandidates ( command ) ) {
122
- if ( this . checkSpawnable ( candidate ) ) return candidate ;
111
+ if ( this . isSpawnable ( candidate ) ) return candidate ;
123
112
}
124
113
}
125
114
126
115
private static getGradleCommand ( ) {
127
- return platform ( ) === 'win32' ? `${ GRADLE_COMMAND } .bat` : `./${ GRADLE_COMMAND } ` ;
116
+ return platform ( ) === 'win32' ? new Command ( GRADLE_COMMAND , ".bat" , true ) : new Command ( `./${ GRADLE_COMMAND } ` ) ;
117
+ }
118
+ }
119
+
120
+ export type PlatformDependentSpawnOptions = {
121
+ shell ?: boolean
122
+ }
123
+
124
+ export class Command {
125
+ public readonly command : string
126
+ public readonly defaultSpawnOptions : PlatformDependentSpawnOptions
127
+
128
+ constructor ( public readonly cmdPrefix : string , public readonly cmdSuffix : string = "" , public readonly shellMode : boolean = false ) {
129
+ this . command = this . cmdPrefix + this . cmdSuffix ;
130
+ this . defaultSpawnOptions = this . shellMode ? { shell : true } : { } ;
131
+ }
132
+
133
+ spawn ( args : string [ ] = [ ] , options : CommonSpawnOptions = { } ) : ChildProcess {
134
+ return spawn ( this . command , this . argsForSpawnType ( args ) , { ...options , ...this . defaultSpawnOptions } ) ;
135
+ }
136
+
137
+ spawnSync ( args : string [ ] = [ ] , options : CommonSpawnOptions = { } ) : SpawnSyncReturns < Buffer > {
138
+ return spawnSync ( this . command , this . argsForSpawnType ( args ) , { ...options , ...this . defaultSpawnOptions } ) ;
139
+ }
140
+
141
+ argsForSpawnType ( args : string [ ] ) : string [ ] {
142
+ return this . shellMode ? args . map ( arg => `"${ arg } "` ) : args ;
128
143
}
129
144
}
0 commit comments