@@ -1098,7 +1098,45 @@ export class ToolRunner extends events.EventEmitter {
10981098 this . _debug ( message ) ;
10991099 } ) ;
11001100
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+
11021140 this . childProcess = cp ;
11031141 // it is possible for the child process to end its last line without a new line.
11041142 // 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 {
11091147 }
11101148 } ) ;
11111149
1112- var stdbuffer : string = '' ;
11131150 cp . stdout ?. on ( 'data' , ( data : Buffer ) => {
11141151 this . emit ( 'stdout' , data ) ;
11151152
@@ -1122,8 +1159,6 @@ export class ToolRunner extends events.EventEmitter {
11221159 } ) ;
11231160 } ) ;
11241161
1125-
1126- var errbuffer : string = '' ;
11271162 cp . stderr ?. on ( 'data' , ( data : Buffer ) => {
11281163 state . processStderr = true ;
11291164 this . emit ( 'stderr' , data ) ;
@@ -1160,26 +1195,7 @@ export class ToolRunner extends events.EventEmitter {
11601195 state . CheckComplete ( ) ;
11611196 } ) ;
11621197
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 ) ;
11831199 }
11841200
11851201 /**
@@ -1215,7 +1231,43 @@ export class ToolRunner extends events.EventEmitter {
12151231 this . _debug ( message ) ;
12161232 } ) ;
12171233
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+
12191271 this . childProcess = cp ;
12201272 // it is possible for the child process to end its last line without a new line.
12211273 // 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 {
12261278 }
12271279 } ) ;
12281280
1229- var stdbuffer : string = '' ;
12301281 cp . stdout ?. on ( 'data' , ( data : Buffer ) => {
12311282 this . emit ( 'stdout' , data ) ;
12321283
@@ -1240,7 +1291,6 @@ export class ToolRunner extends events.EventEmitter {
12401291 } ) ;
12411292
12421293
1243- var errbuffer : string = '' ;
12441294 cp . stderr ?. on ( 'data' , ( data : Buffer ) => {
12451295 state . processStderr = true ;
12461296 this . emit ( 'stderr' , data ) ;
@@ -1277,25 +1327,6 @@ export class ToolRunner extends events.EventEmitter {
12771327 state . CheckComplete ( ) ;
12781328 } ) ;
12791329
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-
12991330 return defer . promise ;
13001331 }
13011332
0 commit comments