@@ -1098,7 +1098,45 @@ export class ToolRunner extends events.EventEmitter {
1098
1098
this . _debug ( message ) ;
1099
1099
} ) ;
1100
1100
1101
- let cp = child . spawn ( this . _getSpawnFileName ( options ) , this . _getSpawnArgs ( optionsNonNull ) , this . _getSpawnOptions ( options ) ) ;
1101
+ var stdbuffer : string = '' ;
1102
+ var errbuffer : string = '' ;
1103
+ const emitDoneEvent = function ( resolve , reject ) {
1104
+ state . on ( 'done' , ( error : Error , exitCode : number ) => {
1105
+ if ( stdbuffer . length > 0 ) {
1106
+ this . emit ( 'stdline' , stdbuffer ) ;
1107
+ }
1108
+
1109
+ if ( errbuffer . length > 0 ) {
1110
+ this . emit ( 'errline' , errbuffer ) ;
1111
+ }
1112
+
1113
+ if ( cp ) {
1114
+ cp . removeAllListeners ( ) ;
1115
+ }
1116
+
1117
+ if ( error ) {
1118
+ reject ( error ) ;
1119
+ }
1120
+ else {
1121
+ resolve ( exitCode ) ;
1122
+ }
1123
+ } ) ;
1124
+ }
1125
+
1126
+ // Edge case when the node itself cant's spawn and emit event
1127
+ let cp ;
1128
+ try {
1129
+ cp = child . spawn ( this . _getSpawnFileName ( options ) , this . _getSpawnArgs ( optionsNonNull ) , this . _getSpawnOptions ( options ) ) ;
1130
+ } catch ( error ) {
1131
+ return new Promise ( ( resolve , reject ) => {
1132
+ emitDoneEvent ( resolve , reject ) ;
1133
+ state . processError = error . message ;
1134
+ state . processExited = true ;
1135
+ state . processClosed = true ;
1136
+ state . CheckComplete ( ) ;
1137
+ } ) ;
1138
+ }
1139
+
1102
1140
this . childProcess = cp ;
1103
1141
// it is possible for the child process to end its last line without a new line.
1104
1142
// because stdout is buffered, this causes the last line to not get sent to the parent
@@ -1109,7 +1147,6 @@ export class ToolRunner extends events.EventEmitter {
1109
1147
}
1110
1148
} ) ;
1111
1149
1112
- var stdbuffer : string = '' ;
1113
1150
cp . stdout ?. on ( 'data' , ( data : Buffer ) => {
1114
1151
this . emit ( 'stdout' , data ) ;
1115
1152
@@ -1122,8 +1159,6 @@ export class ToolRunner extends events.EventEmitter {
1122
1159
} ) ;
1123
1160
} ) ;
1124
1161
1125
-
1126
- var errbuffer : string = '' ;
1127
1162
cp . stderr ?. on ( 'data' , ( data : Buffer ) => {
1128
1163
state . processStderr = true ;
1129
1164
this . emit ( 'stderr' , data ) ;
@@ -1160,26 +1195,7 @@ export class ToolRunner extends events.EventEmitter {
1160
1195
state . CheckComplete ( ) ;
1161
1196
} ) ;
1162
1197
1163
- return new Promise ( ( resolve , reject ) => {
1164
- state . on ( 'done' , ( error : Error , exitCode : number ) => {
1165
- if ( stdbuffer . length > 0 ) {
1166
- this . emit ( 'stdline' , stdbuffer ) ;
1167
- }
1168
-
1169
- if ( errbuffer . length > 0 ) {
1170
- this . emit ( 'errline' , errbuffer ) ;
1171
- }
1172
-
1173
- cp . removeAllListeners ( ) ;
1174
-
1175
- if ( error ) {
1176
- reject ( error ) ;
1177
- }
1178
- else {
1179
- resolve ( exitCode ) ;
1180
- }
1181
- } ) ;
1182
- } ) ;
1198
+ return new Promise ( emitDoneEvent ) ;
1183
1199
}
1184
1200
1185
1201
/**
@@ -1215,7 +1231,43 @@ export class ToolRunner extends events.EventEmitter {
1215
1231
this . _debug ( message ) ;
1216
1232
} ) ;
1217
1233
1218
- let cp = child . spawn ( this . _getSpawnFileName ( options ) , this . _getSpawnArgs ( optionsNonNull ) , this . _getSpawnOptions ( options ) ) ;
1234
+ var stdbuffer : string = '' ;
1235
+ var errbuffer : string = '' ;
1236
+ state . on ( 'done' , ( error : Error , exitCode : number ) => {
1237
+ if ( stdbuffer . length > 0 ) {
1238
+ this . emit ( 'stdline' , stdbuffer ) ;
1239
+ }
1240
+
1241
+ if ( errbuffer . length > 0 ) {
1242
+ this . emit ( 'errline' , errbuffer ) ;
1243
+ }
1244
+
1245
+ if ( cp ) {
1246
+ cp . removeAllListeners ( ) ;
1247
+ }
1248
+
1249
+ if ( error ) {
1250
+ defer . reject ( error ) ;
1251
+ }
1252
+ else {
1253
+ defer . resolve ( exitCode ) ;
1254
+ }
1255
+ } ) ;
1256
+
1257
+
1258
+ // Edge case when the node itself cant's spawn and emit event
1259
+ let cp ;
1260
+ try {
1261
+ cp = child . spawn ( this . _getSpawnFileName ( options ) , this . _getSpawnArgs ( optionsNonNull ) , this . _getSpawnOptions ( options ) ) ;
1262
+ } catch ( error ) {
1263
+ state . processError = error . message ;
1264
+ state . processExited = true ;
1265
+ state . processClosed = true ;
1266
+ state . CheckComplete ( ) ;
1267
+
1268
+ return defer . promise ;
1269
+ }
1270
+
1219
1271
this . childProcess = cp ;
1220
1272
// it is possible for the child process to end its last line without a new line.
1221
1273
// because stdout is buffered, this causes the last line to not get sent to the parent
@@ -1226,7 +1278,6 @@ export class ToolRunner extends events.EventEmitter {
1226
1278
}
1227
1279
} ) ;
1228
1280
1229
- var stdbuffer : string = '' ;
1230
1281
cp . stdout ?. on ( 'data' , ( data : Buffer ) => {
1231
1282
this . emit ( 'stdout' , data ) ;
1232
1283
@@ -1240,7 +1291,6 @@ export class ToolRunner extends events.EventEmitter {
1240
1291
} ) ;
1241
1292
1242
1293
1243
- var errbuffer : string = '' ;
1244
1294
cp . stderr ?. on ( 'data' , ( data : Buffer ) => {
1245
1295
state . processStderr = true ;
1246
1296
this . emit ( 'stderr' , data ) ;
@@ -1277,25 +1327,6 @@ export class ToolRunner extends events.EventEmitter {
1277
1327
state . CheckComplete ( ) ;
1278
1328
} ) ;
1279
1329
1280
- state . on ( 'done' , ( error : Error , exitCode : number ) => {
1281
- if ( stdbuffer . length > 0 ) {
1282
- this . emit ( 'stdline' , stdbuffer ) ;
1283
- }
1284
-
1285
- if ( errbuffer . length > 0 ) {
1286
- this . emit ( 'errline' , errbuffer ) ;
1287
- }
1288
-
1289
- cp . removeAllListeners ( ) ;
1290
-
1291
- if ( error ) {
1292
- defer . reject ( error ) ;
1293
- }
1294
- else {
1295
- defer . resolve ( exitCode ) ;
1296
- }
1297
- } ) ;
1298
-
1299
1330
return defer . promise ;
1300
1331
}
1301
1332
0 commit comments