@@ -355,12 +355,28 @@ class BatchRunner {
355
355
356
356
for ( const context of executedContexts ) {
357
357
const { file, player, duration } = context ;
358
- // A file is successful only if:
359
- // 1. Player status is not 'error', AND
360
- // 2. No individual tasks have failed status
358
+ // Determine result type based on player and task statuses
361
359
const hasFailedTasks =
362
360
player . taskStatusList ?. some ( ( task ) => task . status === 'error' ) ?? false ;
363
- const success = player . status !== 'error' && ! hasFailedTasks ;
361
+ const hasPlayerError = player . status === 'error' ;
362
+
363
+ let success : boolean ;
364
+ let resultType : 'success' | 'failed' | 'partialFailed' ;
365
+
366
+ if ( hasPlayerError ) {
367
+ // Complete failure - player itself failed
368
+ success = false ;
369
+ resultType = 'failed' ;
370
+ } else if ( hasFailedTasks ) {
371
+ // Partial failure - some tasks failed but execution continued (continueOnError)
372
+ success = false ;
373
+ resultType = 'partialFailed' ;
374
+ } else {
375
+ // Success - all tasks completed successfully
376
+ success = true ;
377
+ resultType = 'success' ;
378
+ }
379
+
364
380
let reportFile : string | undefined ;
365
381
366
382
if ( player . reportFile ) {
@@ -380,9 +396,10 @@ class BatchRunner {
380
396
output : outputPath ,
381
397
report : reportFile ,
382
398
duration,
399
+ resultType,
383
400
error :
384
401
player . errorInSetup ?. message ||
385
- ( player . status === 'error' ? 'Execution failed' : undefined ) ||
402
+ ( hasPlayerError ? 'Execution failed' : undefined ) ||
386
403
( hasFailedTasks ? 'Some tasks failed' : undefined ) ,
387
404
} ) ;
388
405
}
@@ -395,6 +412,7 @@ class BatchRunner {
395
412
output : undefined ,
396
413
report : undefined ,
397
414
duration : 0 ,
415
+ resultType : 'notExecuted' ,
398
416
error : 'Not executed (previous task failed)' ,
399
417
} ) ;
400
418
}
@@ -441,8 +459,15 @@ class BatchRunner {
441
459
const indexData = {
442
460
summary : {
443
461
total : this . results . length ,
444
- successful : this . results . filter ( ( r ) => r . success ) . length ,
445
- failed : this . results . filter ( ( r ) => ! r . success ) . length ,
462
+ successful : this . results . filter ( ( r ) => r . resultType === 'success' )
463
+ . length ,
464
+ failed : this . results . filter ( ( r ) => r . resultType === 'failed' ) . length ,
465
+ partialFailed : this . results . filter (
466
+ ( r ) => r . resultType === 'partialFailed' ,
467
+ ) . length ,
468
+ notExecuted : this . results . filter (
469
+ ( r ) => r . resultType === 'notExecuted' ,
470
+ ) . length ,
446
471
totalDuration : this . results . reduce (
447
472
( sum , r ) => sum + ( r . duration || 0 ) ,
448
473
0 ,
@@ -452,6 +477,7 @@ class BatchRunner {
452
477
results : this . results . map ( ( result ) => ( {
453
478
script : relative ( outputDir , result . file ) ,
454
479
success : result . success ,
480
+ resultType : result . resultType ,
455
481
output : result . output
456
482
? ( ( ) => {
457
483
const relativePath = relative ( outputDir , result . output ) ;
@@ -479,17 +505,26 @@ class BatchRunner {
479
505
total : number ;
480
506
successful : number ;
481
507
failed : number ;
508
+ partialFailed : number ;
482
509
notExecuted : number ;
483
510
totalDuration : number ;
484
511
} {
485
- const successful = this . results . filter ( ( r ) => r . success ) . length ;
486
- const notExecuted = this . results . filter ( ( r ) => ! r . executed ) . length ;
487
- const failed = this . results . filter ( ( r ) => r . executed && ! r . success ) . length ;
512
+ const successful = this . results . filter (
513
+ ( r ) => r . resultType === 'success' ,
514
+ ) . length ;
515
+ const failed = this . results . filter ( ( r ) => r . resultType === 'failed' ) . length ;
516
+ const partialFailed = this . results . filter (
517
+ ( r ) => r . resultType === 'partialFailed' ,
518
+ ) . length ;
519
+ const notExecuted = this . results . filter (
520
+ ( r ) => r . resultType === 'notExecuted' ,
521
+ ) . length ;
488
522
489
523
return {
490
524
total : this . results . length ,
491
525
successful,
492
526
failed,
527
+ partialFailed,
493
528
notExecuted,
494
529
totalDuration : this . results . reduce (
495
530
( sum , r ) => sum + ( r . duration || 0 ) ,
@@ -500,16 +535,26 @@ class BatchRunner {
500
535
501
536
getFailedFiles ( ) : string [ ] {
502
537
return this . results
503
- . filter ( ( r ) => r . executed && ! r . success )
538
+ . filter ( ( r ) => r . resultType === 'failed' )
539
+ . map ( ( r ) => r . file ) ;
540
+ }
541
+
542
+ getPartialFailedFiles ( ) : string [ ] {
543
+ return this . results
544
+ . filter ( ( r ) => r . resultType === 'partialFailed' )
504
545
. map ( ( r ) => r . file ) ;
505
546
}
506
547
507
548
getNotExecutedFiles ( ) : string [ ] {
508
- return this . results . filter ( ( r ) => ! r . executed ) . map ( ( r ) => r . file ) ;
549
+ return this . results
550
+ . filter ( ( r ) => r . resultType === 'notExecuted' )
551
+ . map ( ( r ) => r . file ) ;
509
552
}
510
553
511
554
getSuccessfulFiles ( ) : string [ ] {
512
- return this . results . filter ( ( r ) => r . success ) . map ( ( r ) => r . file ) ;
555
+ return this . results
556
+ . filter ( ( r ) => r . resultType === 'success' )
557
+ . map ( ( r ) => r . file ) ;
513
558
}
514
559
515
560
getResults ( ) : MidsceneYamlConfigResult [ ] {
@@ -518,12 +563,16 @@ class BatchRunner {
518
563
519
564
printExecutionSummary ( ) : boolean {
520
565
const summary = this . getExecutionSummary ( ) ;
521
- const success = summary . failed === 0 && summary . notExecuted === 0 ;
566
+ const success =
567
+ summary . failed === 0 &&
568
+ summary . partialFailed === 0 &&
569
+ summary . notExecuted === 0 ;
522
570
523
571
console . log ( '\n📊 Execution Summary:' ) ;
524
572
console . log ( ` Total files: ${ summary . total } ` ) ;
525
573
console . log ( ` Successful: ${ summary . successful } ` ) ;
526
574
console . log ( ` Failed: ${ summary . failed } ` ) ;
575
+ console . log ( ` Partial failed: ${ summary . partialFailed } ` ) ;
527
576
console . log ( ` Not executed: ${ summary . notExecuted } ` ) ;
528
577
console . log ( ` Duration: ${ ( summary . totalDuration / 1000 ) . toFixed ( 2 ) } s` ) ;
529
578
console . log ( ` Summary: ${ this . getSummaryAbsolutePath ( ) } ` ) ;
@@ -542,6 +591,15 @@ class BatchRunner {
542
591
} ) ;
543
592
}
544
593
594
+ if ( summary . partialFailed > 0 ) {
595
+ console . log (
596
+ '\n⚠️ Partial failed files (some tasks failed with continueOnError)' ,
597
+ ) ;
598
+ this . getPartialFailedFiles ( ) . forEach ( ( file ) => {
599
+ console . log ( ` ${ file } ` ) ;
600
+ } ) ;
601
+ }
602
+
545
603
if ( summary . notExecuted > 0 ) {
546
604
console . log ( '\n⏸️ Not executed files' ) ;
547
605
this . getNotExecutedFiles ( ) . forEach ( ( file ) => {
0 commit comments