@@ -25,7 +25,7 @@ import type { Issue } from '../../git/models/issue';
25
25
import type { GitPausedOperationStatus } from '../../git/models/pausedOperationStatus' ;
26
26
import type { PullRequest } from '../../git/models/pullRequest' ;
27
27
import { RemoteResourceType } from '../../git/models/remoteResource' ;
28
- import type { Repository } from '../../git/models/repository' ;
28
+ import type { Repository , RepositoryFileSystemChangeEvent } from '../../git/models/repository' ;
29
29
import { RepositoryChange , RepositoryChangeComparisonMode } from '../../git/models/repository' ;
30
30
import { uncommitted } from '../../git/models/revision' ;
31
31
import type { GitStatus } from '../../git/models/status' ;
@@ -141,6 +141,8 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
141
141
private readonly _disposable : Disposable ;
142
142
private _discovering : Promise < number | undefined > | undefined ;
143
143
private _etag ?: number ;
144
+ private _etagFileSystem ?: number ;
145
+ private _etagRepository ?: number ;
144
146
private _etagSubscription ?: number ;
145
147
private _pendingFocusAccount = false ;
146
148
@@ -396,6 +398,21 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
396
398
}
397
399
}
398
400
401
+ private hasRepositoryChanged ( ) : boolean {
402
+ if ( this . _repositorySubscription ?. repo != null ) {
403
+ if (
404
+ this . _repositorySubscription . repo . etag !== this . _etagRepository ||
405
+ this . _repositorySubscription . repo . etagFileSystem !== this . _etagFileSystem
406
+ ) {
407
+ return true ;
408
+ }
409
+ } else if ( this . _etag !== this . container . git . etag ) {
410
+ return true ;
411
+ }
412
+
413
+ return false ;
414
+ }
415
+
399
416
onVisibilityChanged ( visible : boolean ) : void {
400
417
if ( ! visible ) {
401
418
this . stopRepositorySubscription ( ) ;
@@ -405,7 +422,10 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
405
422
406
423
this . resumeRepositorySubscription ( ) ;
407
424
408
- if ( this . _discovering == null && this . _etag !== this . container . git . etag ) {
425
+ if (
426
+ this . _discovering == null &&
427
+ ( this . container . subscription . etag !== this . _etagSubscription || this . hasRepositoryChanged ( ) )
428
+ ) {
409
429
this . notifyDidChangeRepositories ( true ) ;
410
430
}
411
431
}
@@ -638,7 +658,7 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
638
658
await this . notifyDidChangeSubscription ( e . current ) ;
639
659
640
660
if ( isSubscriptionStatePaidOrTrial ( e . current . state ) !== isSubscriptionStatePaidOrTrial ( e . previous . state ) ) {
641
- this . onOverviewRepoChanged ( 'repo' ) ;
661
+ this . onOverviewRepoChanged ( ) ;
642
662
}
643
663
}
644
664
@@ -702,7 +722,7 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
702
722
if ( repo == null ) return undefined ;
703
723
704
724
const forceRepo = this . _invalidateOverview === 'repo' ;
705
- const forceWip = this . _invalidateOverview !== undefined ;
725
+ const forceWip = this . _invalidateOverview === 'wip' ;
706
726
const branchesAndWorktrees = await this . getBranchesData ( repo , forceRepo ) ;
707
727
708
728
const { branches, worktreesByBranch } = branchesAndWorktrees ;
@@ -718,15 +738,16 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
718
738
this . container ,
719
739
{
720
740
isActive : true ,
721
- forceStatus : forceWip ? true : undefined ,
741
+ forceStatus : forceRepo || forceWip ? true : undefined ,
722
742
} ,
723
743
) ;
724
744
725
- // TODO: revisit invalidation
726
- if ( ! forceRepo && forceWip ) {
745
+ if ( forceWip ) {
727
746
this . _invalidateOverview = undefined ;
728
747
}
729
748
749
+ this . _etagFileSystem = repo . etagFileSystem ;
750
+
730
751
return {
731
752
repository : await this . formatRepository ( repo ) ,
732
753
active : activeOverviewBranch ,
@@ -881,7 +902,7 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
881
902
return Disposable . from (
882
903
// TODO: advanced configuration for the watchFileSystem timing
883
904
repo . watchFileSystem ( 1000 ) ,
884
- repo . onDidChangeFileSystem ( ( ) => this . onOverviewRepoChanged ( 'wip' ) ) ,
905
+ repo . onDidChangeFileSystem ( e => this . onOverviewWipChanged ( e , repo ) ) ,
885
906
repo . onDidChange ( e => {
886
907
if (
887
908
e . changed (
@@ -895,26 +916,42 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
895
916
RepositoryChangeComparisonMode . Any ,
896
917
)
897
918
) {
898
- this . onOverviewRepoChanged ( ' repo' ) ;
919
+ this . onOverviewRepoChanged ( repo ) ;
899
920
}
900
921
} ) ,
901
922
) ;
902
923
}
903
924
904
925
@debug ( )
905
- private onOverviewRepoChanged ( scope : 'repo' | 'wip' ) {
906
- if ( this . _etag === this . container . git . etag ) return ;
926
+ private onOverviewWipChanged ( e : RepositoryFileSystemChangeEvent , repository : Repository ) {
927
+ if ( e . repository ?. path !== repository . path ) return ;
928
+ if ( this . _etagFileSystem === repository . etagFileSystem ) return ;
907
929
930
+ // if the repo is already marked invalid, we already need to recompute the whole overview
908
931
if ( this . _invalidateOverview !== 'repo' ) {
909
- this . _invalidateOverview = scope ;
932
+ this . _invalidateOverview = 'wip' ;
910
933
}
934
+
911
935
if ( ! this . host . visible ) return ;
912
936
913
- if ( scope === 'wip' ) {
914
- void this . host . notify ( DidChangeRepositoryWip , undefined ) ;
915
- } else {
916
- this . notifyDidChangeRepositories ( ) ;
937
+ void this . host . notify ( DidChangeRepositoryWip , undefined ) ;
938
+ }
939
+
940
+ @debug ( )
941
+ private onOverviewRepoChanged ( repo ?: Repository ) {
942
+ if ( repo != null ) {
943
+ if ( this . _etagRepository === repo . etag ) {
944
+ return ;
945
+ }
946
+ } else if ( this . _etag === this . container . git . etag ) {
947
+ return ;
917
948
}
949
+
950
+ this . _invalidateOverview = 'repo' ;
951
+
952
+ if ( ! this . host . visible ) return ;
953
+
954
+ this . notifyDidChangeRepositories ( ) ;
918
955
}
919
956
920
957
private getSelectedRepository ( ) {
@@ -928,7 +965,7 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
928
965
private _invalidateOverview : 'repo' | 'wip' | undefined ;
929
966
private readonly _repositoryBranches : Map < string , RepositoryBranchData > = new Map ( ) ;
930
967
private async getBranchesData ( repo : Repository , force = false ) {
931
- if ( force || ! this . _repositoryBranches . has ( repo . path ) ) {
968
+ if ( force || ! this . _repositoryBranches . has ( repo . path ) || repo . etag !== this . _etagRepository ) {
932
969
const worktrees = ( await repo . git . worktrees ( ) ?. getWorktrees ( ) ) ?? [ ] ;
933
970
const worktreesByBranch = groupWorktreesByBranch ( worktrees , { includeDefault : true } ) ;
934
971
const [ branchesResult ] = await Promise . allSettled ( [
@@ -939,6 +976,7 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
939
976
] ) ;
940
977
941
978
const branches = getSettledValue ( branchesResult ) ?. values ?? [ ] ;
979
+ this . _etagRepository = repo . etag ;
942
980
943
981
this . _repositoryBranches . set ( repo . path , {
944
982
repo : repo ,
0 commit comments