@@ -6,6 +6,7 @@ import * as path from 'path';
66import { AnalysisSummary } from './shared/remote-query-result' ;
77import { AnalysisResults , QueryResult } from './shared/analysis-result' ;
88import { UserCancellationException } from '../commandRunner' ;
9+ import * as os from 'os' ;
910import { sarifParser } from '../sarif-parser' ;
1011
1112export class AnalysesResultsManager {
@@ -32,8 +33,7 @@ export class AnalysesResultsManager {
3233
3334 void this . logger . log ( `Downloading and processing results for ${ analysisSummary . nwo } ` ) ;
3435
35- await this . downloadSingleAnalysisResults ( analysisSummary , credentials ) ;
36- await publishResults ( this . analysesResults ) ;
36+ await this . downloadSingleAnalysisResults ( analysisSummary , credentials , publishResults ) ;
3737 }
3838
3939 public async downloadAnalysesResults (
@@ -47,21 +47,30 @@ export class AnalysesResultsManager {
4747
4848 const batchSize = 3 ;
4949 const numOfBatches = Math . ceil ( analysesToDownload . length / batchSize ) ;
50+ const allFailures = [ ] ;
5051
5152 for ( let i = 0 ; i < analysesToDownload . length ; i += batchSize ) {
5253 if ( token ?. isCancellationRequested ) {
5354 throw new UserCancellationException ( 'Downloading of analyses results has been cancelled' , true ) ;
5455 }
5556
5657 const batch = analysesToDownload . slice ( i , i + batchSize ) ;
57- const batchTasks = batch . map ( analysis => this . downloadSingleAnalysisResults ( analysis , credentials ) ) ;
58+ const batchTasks = batch . map ( analysis => this . downloadSingleAnalysisResults ( analysis , credentials , publishResults ) ) ;
5859
5960 const nwos = batch . map ( a => a . nwo ) . join ( ', ' ) ;
6061 void this . logger . log ( `Downloading batch ${ Math . floor ( i / batchSize ) + 1 } of ${ numOfBatches } (${ nwos } )` ) ;
6162
62- await Promise . all ( batchTasks ) ;
63+ const taskResults = await Promise . allSettled ( batchTasks ) ;
64+ const failedTasks = taskResults . filter ( x => x . status === 'rejected' ) as Array < PromiseRejectedResult > ;
65+ if ( failedTasks . length > 0 ) {
66+ const failures = failedTasks . map ( t => t . reason . message ) ;
67+ failures . forEach ( f => void this . logger . log ( f ) ) ;
68+ allFailures . push ( ...failures ) ;
69+ }
70+ }
6371
64- await publishResults ( this . analysesResults ) ;
72+ if ( allFailures . length > 0 ) {
73+ throw Error ( allFailures . join ( os . EOL ) ) ;
6574 }
6675 }
6776
@@ -71,21 +80,36 @@ export class AnalysesResultsManager {
7180
7281 private async downloadSingleAnalysisResults (
7382 analysis : AnalysisSummary ,
74- credentials : Credentials
83+ credentials : Credentials ,
84+ publishResults : ( analysesResults : AnalysisResults [ ] ) => Promise < void >
7585 ) : Promise < void > {
76- const artifactPath = await downloadArtifactFromLink ( credentials , analysis . downloadLink ) ;
86+ const analysisResults : AnalysisResults = {
87+ nwo : analysis . nwo ,
88+ status : 'InProgress' ,
89+ results : [ ]
90+ } ;
91+
92+ this . analysesResults . push ( analysisResults ) ;
93+ void publishResults ( this . analysesResults ) ;
7794
78- let analysisResults : AnalysisResults ;
95+ let artifactPath ;
96+ try {
97+ artifactPath = await downloadArtifactFromLink ( credentials , analysis . downloadLink ) ;
98+ }
99+ catch ( e ) {
100+ throw new Error ( `Could not download the analysis results for ${ analysis . nwo } : ${ e . message } ` ) ;
101+ }
79102
80103 if ( path . extname ( artifactPath ) === '.sarif' ) {
81104 const queryResults = await this . readResults ( artifactPath ) ;
82- analysisResults = { nwo : analysis . nwo , results : queryResults } ;
105+ analysisResults . results = queryResults ;
106+ analysisResults . status = 'Completed' ;
83107 } else {
84108 void this . logger . log ( 'Cannot download results. Only alert and path queries are fully supported.' ) ;
85- analysisResults = { nwo : analysis . nwo , results : [ ] } ;
109+ analysisResults . status = 'Failed' ;
86110 }
87111
88- this . analysesResults . push ( analysisResults ) ;
112+ void publishResults ( this . analysesResults ) ;
89113 }
90114
91115 private async readResults ( filePath : string ) : Promise < QueryResult [ ] > {
0 commit comments