@@ -53,10 +53,12 @@ import type {
5353 GitStashSubProvider ,
5454 GitStatusSubProvider ,
5555 GitSubProviderForRepo ,
56+ GitSubProviderProps ,
5657 GitTagsSubProvider ,
5758 GitWorktreesSubProvider ,
5859 LeftRightCommitCountResult ,
5960 NextComparisonUrisResult ,
61+ NonNullableGitSubProviderProps ,
6062 PreviousComparisonUrisResult ,
6163 PreviousLineComparisonUrisResult ,
6264 RepositoryVisibility ,
@@ -2474,60 +2476,79 @@ export class GitProviderService implements Disposable {
24742476 return provider . validateReference ( path , ref ) ;
24752477 }
24762478
2479+ private readonly _subProviderProxies = new Map < GitProvider , Map < string , GitSubProviderForRepo < any > > > ( ) ;
2480+
2481+ private getSubProviderProxy < T extends NonNullableGitSubProviderProps > (
2482+ repoPath : string | Uri ,
2483+ prop : T ,
2484+ ) : GitSubProviderForRepo < GitProvider [ T ] > ;
2485+ private getSubProviderProxy < T extends GitSubProviderProps > (
2486+ repoPath : string | Uri ,
2487+ prop : T ,
2488+ ) : GitSubProviderForRepo < NonNullable < GitProvider [ T ] > > | undefined ;
2489+ private getSubProviderProxy < T extends GitSubProviderProps > (
2490+ repoPath : string | Uri ,
2491+ prop : T ,
2492+ ) : GitSubProviderForRepo < NonNullable < GitProvider [ T ] > > | undefined {
2493+ const { provider, path } = this . getProvider ( repoPath ) ;
2494+
2495+ let proxies = this . _subProviderProxies . get ( provider ) ;
2496+ if ( proxies == null ) {
2497+ proxies = new Map ( ) ;
2498+ this . _subProviderProxies . set ( provider , proxies ) ;
2499+ }
2500+
2501+ const key = `${ prop } |${ path } ` ;
2502+ let proxy = proxies . get ( key ) ;
2503+ if ( proxy == null ) {
2504+ const subProvider = provider [ prop ] ;
2505+ if ( subProvider == null ) return undefined ;
2506+
2507+ proxy = createSubProviderProxyForRepo ( subProvider , path ) ;
2508+ proxies . set ( key , proxy ) ;
2509+ }
2510+
2511+ return proxy ;
2512+ }
2513+
24772514 @log ( )
24782515 branches ( repoPath : string | Uri ) : GitSubProviderForRepo < GitBranchesSubProvider > {
2479- const { provider, path : rp } = this . getProvider ( repoPath ) ;
2480- return createSubProviderProxyForRepo ( provider . branches , rp ) ;
2516+ return this . getSubProviderProxy ( repoPath , 'branches' ) ;
24812517 }
24822518
24832519 @log ( )
24842520 patch ( repoPath : string | Uri ) : GitSubProviderForRepo < GitPatchSubProvider > | undefined {
2485- const { provider, path : rp } = this . getProvider ( repoPath ) ;
2486-
2487- const { patch } = provider ;
2488- return patch != null ? createSubProviderProxyForRepo ( patch , rp ) : undefined ;
2521+ return this . getSubProviderProxy ( repoPath , 'patch' ) ;
24892522 }
24902523
24912524 @log ( )
24922525 remotes ( repoPath : string | Uri ) : GitSubProviderForRepo < GitRemotesSubProvider > {
2493- const { provider, path : rp } = this . getProvider ( repoPath ) ;
2494- return createSubProviderProxyForRepo ( provider . remotes , rp ) ;
2526+ return this . getSubProviderProxy ( repoPath , 'remotes' ) ;
24952527 }
24962528
24972529 @log ( )
24982530 staging ( repoPath : string | Uri ) : GitSubProviderForRepo < GitStagingSubProvider > | undefined {
2499- const { provider, path : rp } = this . getProvider ( repoPath ) ;
2500-
2501- const { staging } = provider ;
2502- return staging != null ? createSubProviderProxyForRepo ( staging , rp ) : undefined ;
2531+ return this . getSubProviderProxy ( repoPath , 'staging' ) ;
25032532 }
25042533
25052534 @log ( )
25062535 stash ( repoPath : string | Uri ) : GitSubProviderForRepo < GitStashSubProvider > | undefined {
2507- const { provider, path : rp } = this . getProvider ( repoPath ) ;
2508-
2509- const { stash } = provider ;
2510- return stash != null ? createSubProviderProxyForRepo ( stash , rp ) : undefined ;
2536+ return this . getSubProviderProxy ( repoPath , 'stash' ) ;
25112537 }
25122538
25132539 @log ( )
25142540 status ( repoPath : string | Uri ) : GitSubProviderForRepo < GitStatusSubProvider > {
2515- const { provider, path : rp } = this . getProvider ( repoPath ) ;
2516- return createSubProviderProxyForRepo ( provider . status , rp ) ;
2541+ return this . getSubProviderProxy ( repoPath , 'status' ) ;
25172542 }
25182543
25192544 @log ( )
25202545 tags ( repoPath : string | Uri ) : GitSubProviderForRepo < GitTagsSubProvider > {
2521- const { provider, path : rp } = this . getProvider ( repoPath ) ;
2522- return createSubProviderProxyForRepo ( provider . tags , rp ) ;
2546+ return this . getSubProviderProxy ( repoPath , 'tags' ) ;
25232547 }
25242548
25252549 @log ( )
25262550 worktrees ( repoPath : string | Uri ) : GitSubProviderForRepo < GitWorktreesSubProvider > | undefined {
2527- const { provider, path : rp } = this . getProvider ( repoPath ) ;
2528-
2529- const { worktrees } = provider ;
2530- return worktrees != null ? createSubProviderProxyForRepo ( worktrees , rp ) : undefined ;
2551+ return this . getSubProviderProxy ( repoPath , 'worktrees' ) ;
25312552 }
25322553
25332554 @log ( )
0 commit comments