@@ -25,6 +25,8 @@ import type { Subscription } from '../../plus/gk/account/subscription';
2525import type { SubscriptionChangeEvent } from '../../plus/gk/account/subscriptionService' ;
2626import { getLaunchpadSummary } from '../../plus/launchpad/utils' ;
2727import { showRepositoryPicker } from '../../quickpicks/repositoryPicker' ;
28+ import type { Deferrable } from '../../system/function' ;
29+ import { debounce } from '../../system/function' ;
2830import { map } from '../../system/iterable' ;
2931import { getSettledValue } from '../../system/promise' ;
3032import { executeActionCommand , executeCommand , registerCommand } from '../../system/vscode/command' ;
@@ -73,7 +75,7 @@ const emptyDisposable = Object.freeze({
7375 } ,
7476} ) ;
7577
76- type RepositorySubscription = { repo : Repository ; subscription : Disposable } ;
78+ type RepositorySubscription = { repo : Repository ; subscription ? : Disposable } ;
7779type RepositoryBranchData = {
7880 repo : Repository ;
7981 branches : GitBranch [ ] ;
@@ -94,7 +96,7 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
9496 this . _disposable = Disposable . from (
9597 this . container . git . onDidChangeRepositories ( this . onRepositoriesChanged , this ) ,
9698 ! workspace . isTrusted
97- ? workspace . onDidGrantWorkspaceTrust ( this . notifyDidChangeRepositories , this )
99+ ? workspace . onDidGrantWorkspaceTrust ( ( ) => this . notifyDidChangeRepositories ( ) , this )
98100 : emptyDisposable ,
99101 this . container . subscription . onDidChange ( this . onSubscriptionChanged , this ) ,
100102 onDidChangeContext ( this . onContextChanged , this ) ,
@@ -308,8 +310,13 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
308310 return this . getState ( ) ;
309311 }
310312
311- onReloaded ( ) {
313+ onRefresh ( ) {
314+ this . resetBranchOverview ( ) ;
312315 this . notifyDidChangeRepositories ( ) ;
316+ }
317+
318+ onReloaded ( ) {
319+ this . onRefresh ( ) ;
313320 this . notifyDidChangeProgress ( ) ;
314321 }
315322
@@ -321,6 +328,17 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
321328 }
322329 }
323330
331+ onVisibilityChanged ( visible : boolean ) {
332+ if ( ! visible ) {
333+ this . stopRepositorySubscription ( ) ;
334+
335+ return ;
336+ }
337+
338+ this . resumeRepositorySubscription ( ) ;
339+ this . notifyDidChangeRepositories ( true ) ;
340+ }
341+
324342 private onTogglePreviewEnabled ( isEnabled ?: boolean ) {
325343 if ( isEnabled === undefined ) {
326344 isEnabled = ! this . getPreviewEnabled ( ) ;
@@ -444,12 +462,16 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
444462 const repo = this . getSelectedRepository ( ) ;
445463 if ( repo == null ) return undefined ;
446464
447- const branchesAndWorktrees = await this . getBranchesData ( repo ) ;
465+ const forceRepo = this . _invalidateOverview === 'repo' ;
466+ const forceWip = this . _invalidateOverview !== undefined ;
467+ const branchesAndWorktrees = await this . getBranchesData ( repo , forceRepo ) ;
448468 const overviewBranches = await getOverviewBranches (
449469 branchesAndWorktrees ,
450470 this . container ,
451471 this . _overviewBranchFilter ,
472+ forceWip ? { forceActive : true } : undefined ,
452473 ) ;
474+ this . _invalidateOverview = undefined ;
453475 if ( overviewBranches == null ) return undefined ;
454476
455477 const result : GetOverviewResponse = {
@@ -476,7 +498,7 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
476498 }
477499
478500 if ( this . _repositorySubscription != null ) {
479- this . _repositorySubscription . subscription . dispose ( ) ;
501+ this . _repositorySubscription . subscription ? .dispose ( ) ;
480502 this . _repositorySubscription = undefined ;
481503 }
482504 if ( repo != null ) {
@@ -489,10 +511,41 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
489511 return repo ;
490512 }
491513
514+ private stopRepositorySubscription ( ) {
515+ if ( this . _repositorySubscription != null ) {
516+ this . _repositorySubscription . subscription ?. dispose ( ) ;
517+ this . _repositorySubscription . subscription = undefined ;
518+ }
519+ }
520+
521+ private resumeRepositorySubscription ( force = false ) {
522+ if ( this . _repositorySubscription == null ) {
523+ return ;
524+ }
525+
526+ if ( force || this . _repositorySubscription . subscription == null ) {
527+ this . _repositorySubscription . subscription ?. dispose ( ) ;
528+ this . _repositorySubscription . subscription = undefined ;
529+ this . _repositorySubscription . subscription = this . subscribeToRepository ( this . _repositorySubscription . repo ) ;
530+ }
531+ }
532+
533+ private resetBranchOverview ( ) {
534+ this . _repositoryBranches . clear ( ) ;
535+
536+ if ( ! this . host . visible ) {
537+ this . stopRepositorySubscription ( ) ;
538+ return ;
539+ }
540+
541+ this . resumeRepositorySubscription ( true ) ;
542+ }
543+
492544 private subscribeToRepository ( repo : Repository ) : Disposable {
493545 return Disposable . from (
546+ // TODO: advanced confiugration for the watchFileSystem timing
494547 repo . watchFileSystem ( 1000 ) ,
495- repo . onDidChangeFileSystem ( ( ) => this . onWipChanged ( repo ) ) ,
548+ repo . onDidChangeFileSystem ( ( ) => this . onOverviewRepoChanged ( 'wip' ) ) ,
496549 repo . onDidChange ( e => {
497550 if (
498551 e . changed (
@@ -505,15 +558,23 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
505558 RepositoryChangeComparisonMode . Any ,
506559 )
507560 ) {
508- this . onWipChanged ( repo ) ;
561+ this . onOverviewRepoChanged ( ' repo' ) ;
509562 }
510563 } ) ,
511564 ) ;
512565 }
513566
514- private onWipChanged ( _repo : Repository ) {
515- this . _invalidateRepositoryBranches = true ;
516- void this . host . notify ( DidChangeRepositoryWip , undefined ) ;
567+ private onOverviewRepoChanged ( scope : 'repo' | 'wip' ) {
568+ if ( this . _invalidateOverview !== 'repo' ) {
569+ this . _invalidateOverview = scope ;
570+ }
571+ if ( ! this . host . visible ) return ;
572+
573+ if ( scope === 'wip' ) {
574+ void this . host . notify ( DidChangeRepositoryWip , undefined ) ;
575+ } else {
576+ this . notifyDidChangeRepositories ( ) ;
577+ }
517578 }
518579
519580 private getSelectedRepository ( ) {
@@ -524,9 +585,9 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
524585 return this . _repositorySubscription ?. repo ;
525586 }
526587
527- private _invalidateRepositoryBranches = true ;
588+ private _invalidateOverview : 'repo' | 'wip' | undefined ;
528589 private readonly _repositoryBranches : Map < string , RepositoryBranchData > = new Map ( ) ;
529- private async getBranchesData ( repo : Repository , force = this . _invalidateRepositoryBranches ) {
590+ private async getBranchesData ( repo : Repository , force = false ) {
530591 if ( force || ! this . _repositoryBranches . has ( repo . path ) ) {
531592 const worktrees = ( await repo . git . getWorktrees ( ) ) ?? [ ] ;
532593 const worktreesByBranch = groupWorktreesByBranch ( worktrees ) ;
@@ -539,7 +600,6 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
539600
540601 const branches = getSettledValue ( branchesResult ) ?. values ?? [ ] ;
541602
542- this . _invalidateRepositoryBranches = false ;
543603 this . _repositoryBranches . set ( repo . path , {
544604 repo : repo ,
545605 branches : branches ,
@@ -587,9 +647,22 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
587647 } ) ;
588648 }
589649
590- private notifyDidChangeRepositories ( ) {
650+ private notifyDidChangeRepositoriesCore ( ) {
591651 void this . host . notify ( DidChangeRepositories , this . getRepositoriesState ( ) ) ;
592652 }
653+ private _notifyDidChangeRepositoriesDebounced : Deferrable < ( ) => void > | undefined = undefined ;
654+ private notifyDidChangeRepositories ( immediate = false ) {
655+ if ( immediate ) {
656+ this . notifyDidChangeRepositoriesCore ( ) ;
657+ return ;
658+ }
659+
660+ if ( this . _notifyDidChangeRepositoriesDebounced == null ) {
661+ this . _notifyDidChangeRepositoriesDebounced = debounce ( this . notifyDidChangeRepositoriesCore . bind ( this ) , 500 ) ;
662+ }
663+
664+ this . _notifyDidChangeRepositoriesDebounced ( ) ;
665+ }
593666
594667 private notifyDidChangeProgress ( ) {
595668 void this . host . notify ( DidChangeWalkthroughProgress , {
@@ -745,7 +818,8 @@ const thresholdValues: Record<OverviewStaleThreshold | OverviewRecentThreshold,
745818async function getOverviewBranches (
746819 branchesData : RepositoryBranchData ,
747820 container : Container ,
748- options : OverviewFilters ,
821+ filters : OverviewFilters ,
822+ options ?: { forceActive ?: boolean } ,
749823) : Promise < GetOverviewBranches | undefined > {
750824 const { branches, worktreesByBranch } = branchesData ;
751825 if ( branches . length === 0 ) return undefined ;
@@ -756,22 +830,29 @@ async function getOverviewBranches(
756830 stale : [ ] ,
757831 } ;
758832
833+ let repoStatusPromise : Promise < GitStatus | undefined > | undefined ;
759834 const prPromises = new Map < string , Promise < PullRequest | undefined > > ( ) ;
760835 const statusPromises = new Map < string , Promise < GitStatus | undefined > > ( ) ;
761836 const contributorPromises = new Map < string , Promise < BranchContributorOverview | undefined > > ( ) ;
762837
763838 const now = Date . now ( ) ;
764- const recentThreshold = now - thresholdValues [ options . recent . threshold ] ;
839+ const recentThreshold = now - thresholdValues [ filters . recent . threshold ] ;
765840
766841 for ( const branch of branches ) {
767842 const wt = worktreesByBranch . get ( branch . id ) ;
768843 const worktree : GetOverviewBranch [ 'worktree' ] = wt ? { name : wt . name , uri : wt . uri . toString ( ) } : undefined ;
769844
770845 const timestamp = branch . date ?. getTime ( ) ;
771846 if ( branch . current || wt ?. opened ) {
847+ const forceOptions = options ?. forceActive ? { force : true } : undefined ;
772848 prPromises . set ( branch . id , branch . getAssociatedPullRequest ( { avatarSize : 16 } ) ) ;
773849 if ( wt != null ) {
774- statusPromises . set ( branch . id , wt . getStatus ( ) ) ;
850+ statusPromises . set ( branch . id , wt . getStatus ( forceOptions ) ) ;
851+ } else {
852+ if ( repoStatusPromise === undefined ) {
853+ repoStatusPromise = container . git . getStatus ( branch . repoPath ) ;
854+ }
855+ statusPromises . set ( branch . id , repoStatusPromise ) ;
775856 }
776857 contributorPromises . set ( branch . id , container . git . getBranchContributorOverview ( branch . repoPath , branch . ref ) ) ;
777858
@@ -811,8 +892,8 @@ async function getOverviewBranches(
811892 }
812893 }
813894
814- if ( options ?. stale ?. show === true ) {
815- const staleThreshold = now - thresholdValues [ options . stale . threshold ] ;
895+ if ( filters ?. stale ?. show === true ) {
896+ const staleThreshold = now - thresholdValues [ filters . stale . threshold ] ;
816897 sortBranches ( branches , {
817898 missingUpstream : true ,
818899 orderBy : 'date:asc' ,
@@ -861,6 +942,18 @@ async function getOverviewBranches(
861942 }
862943 }
863944
945+ await enrichOverviewBranches ( overviewBranches , prPromises , statusPromises , contributorPromises ) ;
946+
947+ return overviewBranches ;
948+ }
949+
950+ // FIXME: support partial enrichment
951+ async function enrichOverviewBranches (
952+ overviewBranches : GetOverviewBranches ,
953+ prPromises : Map < string , Promise < PullRequest | undefined > > ,
954+ statusPromises : Map < string , Promise < GitStatus | undefined > > ,
955+ contributorPromises : Map < string , Promise < BranchContributorOverview | undefined > > ,
956+ ) {
864957 const [ prResults , statusResults , contributorResults ] = await Promise . allSettled ( [
865958 Promise . allSettled ( map ( prPromises , ( [ id , pr ] ) => pr . then < [ string , PullRequest | undefined ] > ( pr => [ id , pr ] ) ) ) ,
866959 Promise . allSettled (
@@ -941,6 +1034,4 @@ async function getOverviewBranches(
9411034 branch . contributors = contributors ;
9421035 }
9431036 }
944-
945- return overviewBranches ;
9461037}
0 commit comments