@@ -288,13 +288,24 @@ export class QueryHistoryManager extends DisposableObject {
288
288
queryHistoryScrubber : Disposable | undefined ;
289
289
private queryMetadataStorageLocation ;
290
290
291
+ private readonly _onDidAddQueryItem = super . push ( new EventEmitter < QueryHistoryInfo > ( ) ) ;
292
+ readonly onDidAddQueryItem : Event < QueryHistoryInfo > = this
293
+ . _onDidAddQueryItem . event ;
294
+
295
+ private readonly _onDidRemoveQueryItem = super . push ( new EventEmitter < QueryHistoryInfo > ( ) ) ;
296
+ readonly onDidRemoveQueryItem : Event < QueryHistoryInfo > = this
297
+ . _onDidRemoveQueryItem . event ;
298
+
299
+ private readonly _onWillOpenQueryItem = super . push ( new EventEmitter < QueryHistoryInfo > ( ) ) ;
300
+ readonly onWillOpenQueryItem : Event < QueryHistoryInfo > = this
301
+ . _onWillOpenQueryItem . event ;
302
+
291
303
constructor (
292
304
private qs : QueryServerClient ,
293
305
private dbm : DatabaseManager ,
294
306
private queryStorageDir : string ,
295
307
ctx : ExtensionContext ,
296
308
private queryHistoryConfigListener : QueryHistoryConfig ,
297
- private selectedCallback : ( item : CompletedLocalQueryInfo ) => Promise < void > ,
298
309
private doCompareCallback : (
299
310
from : CompletedLocalQueryInfo ,
300
311
to : CompletedLocalQueryInfo
@@ -484,53 +495,54 @@ export class QueryHistoryManager extends DisposableObject {
484
495
void logger . log ( `Reading cached query history from '${ this . queryMetadataStorageLocation } '.` ) ;
485
496
const history = await slurpQueryHistory ( this . queryMetadataStorageLocation , this . queryHistoryConfigListener ) ;
486
497
this . treeDataProvider . allHistory = history ;
498
+ this . treeDataProvider . allHistory . forEach ( ( item ) => {
499
+ this . _onDidAddQueryItem . fire ( item ) ;
500
+ } ) ;
487
501
}
488
502
489
503
async writeQueryHistory ( ) : Promise < void > {
490
- const toSave = this . treeDataProvider . allHistory . filter ( q => q . isCompleted ( ) ) ;
491
- await splatQueryHistory ( toSave , this . queryMetadataStorageLocation ) ;
492
- }
493
-
494
- async invokeCallbackOn ( queryHistoryItem : QueryHistoryInfo ) {
495
- if ( this . selectedCallback && queryHistoryItem . isCompleted ( ) ) {
496
- const sc = this . selectedCallback ;
497
- await sc ( queryHistoryItem as CompletedLocalQueryInfo ) ;
498
- }
504
+ await splatQueryHistory ( this . treeDataProvider . allHistory , this . queryMetadataStorageLocation ) ;
499
505
}
500
506
501
507
async handleOpenQuery (
502
508
singleItem : QueryHistoryInfo ,
503
509
multiSelect : QueryHistoryInfo [ ]
504
510
) : Promise < void > {
505
- // TODO will support remote queries
506
511
const { finalSingleItem, finalMultiSelect } = this . determineSelection ( singleItem , multiSelect ) ;
507
- if ( ! this . assertSingleQuery ( finalMultiSelect ) || finalSingleItem ?. t !== 'local' ) {
512
+ if ( ! this . assertSingleQuery ( finalMultiSelect ) || ! finalSingleItem ) {
508
513
return ;
509
514
}
510
515
516
+ const queryPath = finalSingleItem . t === 'local'
517
+ ? finalSingleItem . initialInfo . queryPath
518
+ : finalSingleItem . remoteQuery . queryFilePath ;
519
+
511
520
const textDocument = await workspace . openTextDocument (
512
- Uri . file ( finalSingleItem . initialInfo . queryPath )
521
+ Uri . file ( queryPath )
513
522
) ;
514
523
const editor = await window . showTextDocument (
515
524
textDocument ,
516
525
ViewColumn . One
517
526
) ;
518
- const queryText = finalSingleItem . initialInfo . queryText ;
519
- if ( queryText !== undefined && finalSingleItem . initialInfo . isQuickQuery ) {
520
- await editor . edit ( ( edit ) =>
521
- edit . replace (
522
- textDocument . validateRange (
523
- new Range ( 0 , 0 , textDocument . lineCount , 0 )
524
- ) ,
525
- queryText
526
- )
527
- ) ;
527
+
528
+ if ( finalSingleItem . t === 'local' ) {
529
+ const queryText = finalSingleItem . initialInfo . queryText ;
530
+ if ( queryText !== undefined && finalSingleItem . initialInfo . isQuickQuery ) {
531
+ await editor . edit ( ( edit ) =>
532
+ edit . replace (
533
+ textDocument . validateRange (
534
+ new Range ( 0 , 0 , textDocument . lineCount , 0 )
535
+ ) ,
536
+ queryText
537
+ )
538
+ ) ;
539
+ }
528
540
}
529
541
}
530
542
531
543
async handleRemoveHistoryItem (
532
544
singleItem : QueryHistoryInfo ,
533
- multiSelect : QueryHistoryInfo [ ]
545
+ multiSelect : QueryHistoryInfo [ ] = [ ]
534
546
) {
535
547
const { finalSingleItem, finalMultiSelect } = this . determineSelection ( singleItem , multiSelect ) ;
536
548
const toDelete = ( finalMultiSelect || [ finalSingleItem ] ) ;
@@ -548,23 +560,21 @@ export class QueryHistoryManager extends DisposableObject {
548
560
} else {
549
561
// Remote queries can be removed locally, but not remotely.
550
562
// The user must cancel the query on GitHub Actions explicitly.
551
-
552
563
this . treeDataProvider . remove ( item ) ;
553
- await item . deleteQuery ( ) ;
554
564
void logger . log ( `Deleted ${ item . label } .` ) ;
555
565
if ( item . status === QueryStatus . InProgress ) {
556
- void showAndLogInformationMessage (
557
- 'The remote query is still running on GitHub Actions. To cancel there, you must go to the query run in your browser.'
558
- ) ;
566
+ void logger . log ( 'The remote query is still running on GitHub Actions. To cancel there, you must go to the query run in your browser.' ) ;
559
567
}
568
+
569
+ this . _onDidRemoveQueryItem . fire ( item ) ;
560
570
}
561
571
562
572
} ) ) ;
563
573
await this . writeQueryHistory ( ) ;
564
574
const current = this . treeDataProvider . getCurrent ( ) ;
565
575
if ( current !== undefined ) {
566
576
await this . treeView . reveal ( current , { select : true } ) ;
567
- await this . invokeCallbackOn ( current ) ;
577
+ await this . _onWillOpenQueryItem . fire ( current ) ;
568
578
}
569
579
}
570
580
@@ -635,7 +645,7 @@ export class QueryHistoryManager extends DisposableObject {
635
645
const from = this . compareWithItem || singleItem ;
636
646
const to = await this . findOtherQueryToCompare ( from , finalMultiSelect ) ;
637
647
638
- if ( from . isCompleted ( ) && to ?. isCompleted ( ) ) {
648
+ if ( from . completed && to ?. completed ) {
639
649
await this . doCompareCallback ( from as CompletedLocalQueryInfo , to as CompletedLocalQueryInfo ) ;
640
650
}
641
651
} catch ( e ) {
@@ -647,9 +657,8 @@ export class QueryHistoryManager extends DisposableObject {
647
657
singleItem : QueryHistoryInfo ,
648
658
multiSelect : QueryHistoryInfo [ ]
649
659
) {
650
- // TODO will support remote queries
651
660
const { finalSingleItem, finalMultiSelect } = this . determineSelection ( singleItem , multiSelect ) ;
652
- if ( ! this . assertSingleQuery ( finalMultiSelect ) || finalSingleItem ?. t !== 'local' ) {
661
+ if ( ! this . assertSingleQuery ( finalMultiSelect ) ) {
653
662
return ;
654
663
}
655
664
@@ -668,7 +677,7 @@ export class QueryHistoryManager extends DisposableObject {
668
677
await this . handleOpenQuery ( finalSingleItem , [ finalSingleItem ] ) ;
669
678
} else {
670
679
// show results on single click
671
- await this . invokeCallbackOn ( finalSingleItem ) ;
680
+ await this . _onWillOpenQueryItem . fire ( finalSingleItem ) ;
672
681
}
673
682
}
674
683
@@ -713,17 +722,20 @@ export class QueryHistoryManager extends DisposableObject {
713
722
) {
714
723
const { finalSingleItem, finalMultiSelect } = this . determineSelection ( singleItem , multiSelect ) ;
715
724
716
- // TODO will support remote queries
717
- if ( ! this . assertSingleQuery ( finalMultiSelect ) || finalSingleItem ?. t !== 'local' ) {
725
+ if ( ! this . assertSingleQuery ( finalMultiSelect ) || ! finalSingleItem ) {
718
726
return ;
719
727
}
720
728
721
729
const params = new URLSearchParams ( {
722
- isQuickEval : String ( ! ! finalSingleItem . initialInfo . quickEvalPosition ) ,
730
+ isQuickEval : String ( ! ! ( finalSingleItem . t === 'local' && finalSingleItem . initialInfo . quickEvalPosition ) ) ,
723
731
queryText : encodeURIComponent ( await this . getQueryText ( finalSingleItem ) ) ,
724
732
} ) ;
733
+ const queryId = finalSingleItem . t === 'local'
734
+ ? finalSingleItem . initialInfo . id
735
+ : finalSingleItem . queryId ;
736
+
725
737
const uri = Uri . parse (
726
- `codeql:${ finalSingleItem . initialInfo . id } ?${ params . toString ( ) } ` , true
738
+ `codeql:${ queryId } ?${ params . toString ( ) } ` , true
727
739
) ;
728
740
const doc = await workspace . openTextDocument ( uri ) ;
729
741
await window . showTextDocument ( doc , { preview : false } ) ;
@@ -809,13 +821,15 @@ export class QueryHistoryManager extends DisposableObject {
809
821
}
810
822
811
823
async getQueryText ( item : QueryHistoryInfo ) : Promise < string > {
812
- // TODO the query text for remote queries is not yet available
813
- return item . t === 'local' ? item . initialInfo . queryText : '' ;
824
+ return item . t === 'local'
825
+ ? item . initialInfo . queryText
826
+ : item . remoteQuery . queryText ;
814
827
}
815
828
816
829
addQuery ( item : QueryHistoryInfo ) {
817
830
this . treeDataProvider . pushQuery ( item ) ;
818
831
this . updateTreeViewSelectionIfVisible ( ) ;
832
+ this . _onDidAddQueryItem . fire ( item ) ;
819
833
}
820
834
821
835
/**
@@ -1011,7 +1025,8 @@ the file in the file explorer and dragging it into the workspace.`
1011
1025
} ;
1012
1026
}
1013
1027
1014
- refreshTreeView ( ) : void {
1028
+ async refreshTreeView ( ) : Promise < void > {
1015
1029
this . treeDataProvider . refresh ( ) ;
1030
+ await this . writeQueryHistory ( ) ;
1016
1031
}
1017
1032
}
0 commit comments