@@ -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