Skip to content

Commit 5b63a1c

Browse files
committed
Adds sub-provider proxy caching
1 parent df68fd6 commit 5b63a1c

File tree

2 files changed

+56
-27
lines changed

2 files changed

+56
-27
lines changed

src/git/gitProvider.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,7 @@ export interface GitWorktreesSubProvider {
551551
deleteWorktree(repoPath: string, path: string | Uri, options?: { force?: boolean }): Promise<void>;
552552
}
553553

554-
type GitSubProviders =
554+
export type GitSubProvider =
555555
| GitBranchesSubProvider
556556
| GitPatchSubProvider
557557
| GitRemotesSubProvider
@@ -561,11 +561,19 @@ type GitSubProviders =
561561
| GitTagsSubProvider
562562
| GitWorktreesSubProvider;
563563

564-
export type GitSubProviderForRepo<T extends GitSubProviders> = {
564+
export type GitSubProviderProps = keyof {
565+
[P in keyof GitProvider as NonNullable<GitProvider[P]> extends GitSubProvider ? P : never]: GitProvider[P];
566+
};
567+
568+
export type NonNullableGitSubProviderProps = keyof {
569+
[P in keyof GitProvider as GitProvider[P] extends GitSubProvider ? P : never]: GitProvider[P];
570+
};
571+
572+
export type GitSubProviderForRepo<T extends GitSubProvider> = {
565573
[K in keyof T]: RemoveFirstArg<T[K]>;
566574
};
567575

568-
export function createSubProviderProxyForRepo<T extends GitSubProviders, U extends GitSubProviderForRepo<T>>(
576+
export function createSubProviderProxyForRepo<T extends GitSubProvider, U extends GitSubProviderForRepo<T>>(
569577
target: T,
570578
rp: string,
571579
): U {

src/git/gitProviderService.ts

Lines changed: 45 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)