@@ -5,11 +5,13 @@ import type { ContextKeys } from '../../constants.context';
55import type { WebviewTelemetryContext } from '../../constants.telemetry' ;
66import type { Container } from '../../container' ;
77import type { BranchContributorOverview } from '../../git/gitProvider' ;
8+ import type { GitBranch } from '../../git/models/branch' ;
89import { sortBranches } from '../../git/models/branch' ;
910import type { PullRequest } from '../../git/models/pullRequest' ;
1011import type { Repository } from '../../git/models/repository' ;
1112import { RepositoryChange , RepositoryChangeComparisonMode } from '../../git/models/repository' ;
1213import type { GitStatus } from '../../git/models/status' ;
14+ import type { GitWorktree } from '../../git/models/worktree' ;
1315import { getOpenedWorktreesByBranch , groupWorktreesByBranch } from '../../git/models/worktree' ;
1416import type { Subscription } from '../../plus/gk/account/subscription' ;
1517import type { SubscriptionChangeEvent } from '../../plus/gk/account/subscriptionService' ;
@@ -269,7 +271,23 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
269271 const repo = this . getSelectedRepository ( ) ;
270272 if ( repo == null ) return undefined ;
271273
272- return getBranchOverview ( repo , this . container ) ;
274+ const branchesAndWorktrees = await this . getBranchesAndWorktrees ( repo ) ;
275+ const overviewBranches = await getOverviewBranches (
276+ branchesAndWorktrees ?. branches ,
277+ branchesAndWorktrees ?. worktrees ,
278+ this . container ,
279+ // TODO: add filters
280+ ) ;
281+ if ( overviewBranches == null ) return undefined ;
282+
283+ const result : GetOverviewResponse = {
284+ repository : {
285+ name : repo . name ,
286+ branches : overviewBranches ,
287+ } ,
288+ } ;
289+
290+ return result ;
273291 }
274292
275293 private _repositorySubscription : RepositorySubscription | undefined ;
@@ -322,6 +340,22 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
322340 return this . _repositorySubscription ?. repo ;
323341 }
324342
343+ private _repositoryBranches : Map < string , { branches : GitBranch [ ] ; worktrees : GitWorktree [ ] } > = new Map ( ) ;
344+ private async getBranchesAndWorktrees ( repo : Repository , force = false ) {
345+ if ( force || ! this . _repositoryBranches . has ( repo . path ) ) {
346+ const [ branchesResult , worktreesResult ] = await Promise . allSettled ( [
347+ repo . git . getBranches ( { filter : b => ! b . remote } ) ,
348+ repo . git . getWorktrees ( ) ,
349+ ] ) ;
350+
351+ const branches = getSettledValue ( branchesResult ) ?. values ?? [ ] ;
352+ const worktrees = getSettledValue ( worktreesResult ) ?? [ ] ;
353+ this . _repositoryBranches . set ( repo . path , { branches : branches , worktrees : worktrees } ) ;
354+ }
355+
356+ return this . _repositoryBranches . get ( repo . path ) ! ;
357+ }
358+
325359 private _hostedIntegrationConnected : boolean | undefined ;
326360 private isAnyIntegrationConnected ( force = false ) {
327361 if ( this . _hostedIntegrationConnected == null || force === true ) {
@@ -403,22 +437,19 @@ interface BranchOverviewOptions {
403437 threshold : number ;
404438 } ;
405439 stale ?: {
406- threshold : number ;
440+ show ?: boolean ;
441+ threshold ?: number ;
407442 } ;
408443}
409444
410- async function getBranchOverview (
411- repo : Repository ,
445+ async function getOverviewBranches (
446+ branches : GitBranch [ ] ,
447+ worktrees : GitWorktree [ ] ,
412448 container : Container ,
413449 options ?: BranchOverviewOptions ,
414- ) : Promise < GetOverviewResponse | undefined > {
415- const [ branchesResult , worktreesResult ] = await Promise . allSettled ( [
416- repo . git . getBranches ( { filter : b => ! b . remote } ) ,
417- repo . git . getWorktrees ( ) ,
418- ] ) ;
450+ ) : Promise < GetOverviewBranches | undefined > {
451+ if ( branches . length === 0 ) return undefined ;
419452
420- const branches = getSettledValue ( branchesResult ) ?. values ?? [ ] ;
421- const worktrees = getSettledValue ( worktreesResult ) ?? [ ] ;
422453 const worktreesByBranch = groupWorktreesByBranch ( worktrees ) ;
423454
424455 sortBranches ( branches , {
@@ -439,7 +470,6 @@ async function getBranchOverview(
439470
440471 const now = Date . now ( ) ;
441472 const recentThreshold = now - ( options ?. recent ?. threshold ?? branchOverviewDefaults . recent . threshold ) ;
442- const staleThreshold = now - ( options ?. stale ?. threshold ?? branchOverviewDefaults . stale . threshold ) ;
443473
444474 for ( const branch of branches ) {
445475 const wt = worktreesByBranch . get ( branch . id ) ;
@@ -489,45 +519,53 @@ async function getBranchOverview(
489519 }
490520 }
491521
492- sortBranches ( branches , {
493- missingUpstream : true ,
494- orderBy : 'date:asc' ,
495- } ) ;
496- for ( const branch of branches ) {
497- if ( overviewBranches . stale . length > 9 ) break ;
498-
499- if (
500- overviewBranches . active . some ( b => b . id === branch . id ) ||
501- overviewBranches . recent . some ( b => b . id === branch . id )
502- ) {
503- continue ;
504- }
505-
506- const timestamp = branch . date ?. getTime ( ) ;
507- if ( branch . upstream ?. missing || ( timestamp != null && timestamp < staleThreshold ) ) {
508- const wt = worktreesByBranch . get ( branch . id ) ;
509- const worktree : GetOverviewBranch [ 'worktree' ] = wt ? { name : wt . name , uri : wt . uri . toString ( ) } : undefined ;
510-
511- if ( ! branch . upstream ?. missing ) {
512- prPromises . set ( branch . id , branch . getAssociatedPullRequest ( ) ) ;
513- }
514- if ( wt != null ) {
515- statusPromises . set ( branch . id , wt . getStatus ( ) ) ;
522+ if ( options ?. stale ?. show === true ) {
523+ const staleThreshold = now - ( options ?. stale ?. threshold ?? branchOverviewDefaults . stale . threshold ) ;
524+ sortBranches ( branches , {
525+ missingUpstream : true ,
526+ orderBy : 'date:asc' ,
527+ } ) ;
528+ for ( const branch of branches ) {
529+ if ( overviewBranches . stale . length > 9 ) break ;
530+
531+ if (
532+ overviewBranches . active . some ( b => b . id === branch . id ) ||
533+ overviewBranches . recent . some ( b => b . id === branch . id )
534+ ) {
535+ continue ;
516536 }
517- contributorPromises . set ( branch . id , container . git . getBranchContributorOverview ( branch . repoPath , branch . ref ) ) ;
518537
519- overviewBranches . stale . push ( {
520- id : branch . id ,
521- name : branch . name ,
522- opened : false ,
523- timestamp : timestamp ,
524- state : branch . state ,
525- status : branch . status ,
526- upstream : branch . upstream ,
527- worktree : worktree ,
528- } ) ;
538+ const timestamp = branch . date ?. getTime ( ) ;
539+ if ( branch . upstream ?. missing || ( timestamp != null && timestamp < staleThreshold ) ) {
540+ const wt = worktreesByBranch . get ( branch . id ) ;
541+ const worktree : GetOverviewBranch [ 'worktree' ] = wt
542+ ? { name : wt . name , uri : wt . uri . toString ( ) }
543+ : undefined ;
529544
530- continue ;
545+ if ( ! branch . upstream ?. missing ) {
546+ prPromises . set ( branch . id , branch . getAssociatedPullRequest ( ) ) ;
547+ }
548+ if ( wt != null ) {
549+ statusPromises . set ( branch . id , wt . getStatus ( ) ) ;
550+ }
551+ contributorPromises . set (
552+ branch . id ,
553+ container . git . getBranchContributorOverview ( branch . repoPath , branch . ref ) ,
554+ ) ;
555+
556+ overviewBranches . stale . push ( {
557+ id : branch . id ,
558+ name : branch . name ,
559+ opened : false ,
560+ timestamp : timestamp ,
561+ state : branch . state ,
562+ status : branch . status ,
563+ upstream : branch . upstream ,
564+ worktree : worktree ,
565+ } ) ;
566+
567+ continue ;
568+ }
531569 }
532570 }
533571
@@ -611,12 +649,5 @@ async function getBranchOverview(
611649 }
612650 }
613651
614- const result : GetOverviewResponse = {
615- repository : {
616- name : repo . name ,
617- branches : overviewBranches ,
618- } ,
619- } ;
620-
621- return result ;
652+ return overviewBranches ;
622653}
0 commit comments