@@ -25,7 +25,7 @@ import type { Issue } from '../../git/models/issue';
2525import type { GitPausedOperationStatus } from '../../git/models/pausedOperationStatus' ;
2626import type { PullRequest } from '../../git/models/pullRequest' ;
2727import { RemoteResourceType } from '../../git/models/remoteResource' ;
28- import type { Repository } from '../../git/models/repository' ;
28+ import type { Repository , RepositoryFileSystemChangeEvent } from '../../git/models/repository' ;
2929import { RepositoryChange , RepositoryChangeComparisonMode } from '../../git/models/repository' ;
3030import { uncommitted } from '../../git/models/revision' ;
3131import type { GitStatus } from '../../git/models/status' ;
@@ -141,6 +141,8 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
141141 private readonly _disposable : Disposable ;
142142 private _discovering : Promise < number | undefined > | undefined ;
143143 private _etag ?: number ;
144+ private _etagFileSystem ?: number ;
145+ private _etagRepository ?: number ;
144146 private _etagSubscription ?: number ;
145147 private _pendingFocusAccount = false ;
146148
@@ -396,6 +398,21 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
396398 }
397399 }
398400
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+
399416 onVisibilityChanged ( visible : boolean ) : void {
400417 if ( ! visible ) {
401418 this . stopRepositorySubscription ( ) ;
@@ -405,7 +422,10 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
405422
406423 this . resumeRepositorySubscription ( ) ;
407424
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+ ) {
409429 this . notifyDidChangeRepositories ( true ) ;
410430 }
411431 }
@@ -638,7 +658,7 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
638658 await this . notifyDidChangeSubscription ( e . current ) ;
639659
640660 if ( isSubscriptionStatePaidOrTrial ( e . current . state ) !== isSubscriptionStatePaidOrTrial ( e . previous . state ) ) {
641- this . onOverviewRepoChanged ( 'repo' ) ;
661+ this . onOverviewRepoChanged ( ) ;
642662 }
643663 }
644664
@@ -702,7 +722,7 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
702722 if ( repo == null ) return undefined ;
703723
704724 const forceRepo = this . _invalidateOverview === 'repo' ;
705- const forceWip = this . _invalidateOverview !== undefined ;
725+ const forceWip = this . _invalidateOverview === 'wip' ;
706726 const branchesAndWorktrees = await this . getBranchesData ( repo , forceRepo ) ;
707727
708728 const { branches, worktreesByBranch } = branchesAndWorktrees ;
@@ -718,15 +738,16 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
718738 this . container ,
719739 {
720740 isActive : true ,
721- forceStatus : forceWip ? true : undefined ,
741+ forceStatus : forceRepo || forceWip ? true : undefined ,
722742 } ,
723743 ) ;
724744
725- // TODO: revisit invalidation
726- if ( ! forceRepo && forceWip ) {
745+ if ( forceWip ) {
727746 this . _invalidateOverview = undefined ;
728747 }
729748
749+ this . _etagFileSystem = repo . etagFileSystem ;
750+
730751 return {
731752 repository : await this . formatRepository ( repo ) ,
732753 active : activeOverviewBranch ,
@@ -881,7 +902,7 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
881902 return Disposable . from (
882903 // TODO: advanced configuration for the watchFileSystem timing
883904 repo . watchFileSystem ( 1000 ) ,
884- repo . onDidChangeFileSystem ( ( ) => this . onOverviewRepoChanged ( 'wip' ) ) ,
905+ repo . onDidChangeFileSystem ( e => this . onOverviewWipChanged ( e , repo ) ) ,
885906 repo . onDidChange ( e => {
886907 if (
887908 e . changed (
@@ -895,26 +916,42 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
895916 RepositoryChangeComparisonMode . Any ,
896917 )
897918 ) {
898- this . onOverviewRepoChanged ( ' repo' ) ;
919+ this . onOverviewRepoChanged ( repo ) ;
899920 }
900921 } ) ,
901922 ) ;
902923 }
903924
904925 @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 ;
907929
930+ // if the repo is already marked invalid, we already need to recompute the whole overview
908931 if ( this . _invalidateOverview !== 'repo' ) {
909- this . _invalidateOverview = scope ;
932+ this . _invalidateOverview = 'wip' ;
910933 }
934+
911935 if ( ! this . host . visible ) return ;
912936
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 ;
917948 }
949+
950+ this . _invalidateOverview = 'repo' ;
951+
952+ if ( ! this . host . visible ) return ;
953+
954+ this . notifyDidChangeRepositories ( ) ;
918955 }
919956
920957 private getSelectedRepository ( ) {
@@ -928,7 +965,7 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
928965 private _invalidateOverview : 'repo' | 'wip' | undefined ;
929966 private readonly _repositoryBranches : Map < string , RepositoryBranchData > = new Map ( ) ;
930967 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 ) {
932969 const worktrees = ( await repo . git . worktrees ( ) ?. getWorktrees ( ) ) ?? [ ] ;
933970 const worktreesByBranch = groupWorktreesByBranch ( worktrees , { includeDefault : true } ) ;
934971 const [ branchesResult ] = await Promise . allSettled ( [
@@ -939,6 +976,7 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
939976 ] ) ;
940977
941978 const branches = getSettledValue ( branchesResult ) ?. values ?? [ ] ;
979+ this . _etagRepository = repo . etag ;
942980
943981 this . _repositoryBranches . set ( repo . path , {
944982 repo : repo ,
0 commit comments