@@ -53,10 +53,12 @@ import type {
53
53
GitStashSubProvider ,
54
54
GitStatusSubProvider ,
55
55
GitSubProviderForRepo ,
56
+ GitSubProviderProps ,
56
57
GitTagsSubProvider ,
57
58
GitWorktreesSubProvider ,
58
59
LeftRightCommitCountResult ,
59
60
NextComparisonUrisResult ,
61
+ NonNullableGitSubProviderProps ,
60
62
PreviousComparisonUrisResult ,
61
63
PreviousLineComparisonUrisResult ,
62
64
RepositoryVisibility ,
@@ -2474,60 +2476,79 @@ export class GitProviderService implements Disposable {
2474
2476
return provider . validateReference ( path , ref ) ;
2475
2477
}
2476
2478
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
+
2477
2514
@log ( )
2478
2515
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' ) ;
2481
2517
}
2482
2518
2483
2519
@log ( )
2484
2520
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' ) ;
2489
2522
}
2490
2523
2491
2524
@log ( )
2492
2525
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' ) ;
2495
2527
}
2496
2528
2497
2529
@log ( )
2498
2530
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' ) ;
2503
2532
}
2504
2533
2505
2534
@log ( )
2506
2535
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' ) ;
2511
2537
}
2512
2538
2513
2539
@log ( )
2514
2540
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' ) ;
2517
2542
}
2518
2543
2519
2544
@log ( )
2520
2545
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' ) ;
2523
2547
}
2524
2548
2525
2549
@log ( )
2526
2550
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' ) ;
2531
2552
}
2532
2553
2533
2554
@log ( )
0 commit comments