Skip to content

Commit

Permalink
Cache last quick diff (#188506)
Browse files Browse the repository at this point in the history
Fixes #179441
  • Loading branch information
alexr00 committed Sep 8, 2023
1 parent 0795888 commit 5ae46ad
Showing 1 changed file with 21 additions and 2 deletions.
23 changes: 21 additions & 2 deletions src/vs/workbench/contrib/scm/common/quickDiffService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ export class QuickDiffService extends Disposable implements IQuickDiffService {
private readonly _onDidChangeQuickDiffProviders = this._register(new Emitter<void>());
readonly onDidChangeQuickDiffProviders = this._onDidChangeQuickDiffProviders.event;

// It is common to get many requests for the same resource back to back (ex. when editing a file)
// Cache the last resource so to avoid unneeded extension host round trips.
private cachedOriginalResource: { uri: URI; resources: Map<string, URI> } | undefined;

constructor(@IUriIdentityService private readonly uriIdentityService: IUriIdentityService) {
super();
}
Expand All @@ -62,6 +66,19 @@ export class QuickDiffService extends Disposable implements IQuickDiffService {
return !!diff.originalResource && (typeof diff.label === 'string') && (typeof diff.isSCM === 'boolean');
}

private getOriginalResourceFromCache(provider: string, uri: URI): URI | undefined {
if (this.cachedOriginalResource?.uri.toString() === uri.toString()) {
return this.cachedOriginalResource.resources.get(provider);
}
return undefined;
}

private updateOriginalResourceCache(uri: URI, quickDiffs: QuickDiff[]) {
if (this.cachedOriginalResource?.uri.toString() !== uri.toString()) {
this.cachedOriginalResource = { uri, resources: new Map(quickDiffs.map(diff => ([diff.label, diff.originalResource]))) };
}
}

async getQuickDiffs(uri: URI, language: string = '', isSynchronized: boolean = false): Promise<QuickDiff[]> {
const providers = Array.from(this.quickDiffProviders)
.filter(provider => !provider.rootUri || this.uriIdentityService.extUri.isEqualOrParent(uri, provider.rootUri))
Expand All @@ -70,12 +87,14 @@ export class QuickDiffService extends Disposable implements IQuickDiffService {
const diffs = await Promise.all(providers.map(async provider => {
const scoreValue = provider.selector ? score(provider.selector, uri, language, isSynchronized, undefined, undefined) : 10;
const diff: Partial<QuickDiff> = {
originalResource: scoreValue > 0 ? await provider.getOriginalResource(uri) ?? undefined : undefined,
originalResource: scoreValue > 0 ? (this.getOriginalResourceFromCache(provider.label, uri) ?? await provider.getOriginalResource(uri) ?? undefined) : undefined,
label: provider.label,
isSCM: provider.isSCM
};
return diff;
}));
return diffs.filter<QuickDiff>(this.isQuickDiff);
const quickDiffs = diffs.filter<QuickDiff>(this.isQuickDiff);
this.updateOriginalResourceCache(uri, quickDiffs);
return quickDiffs;
}
}

0 comments on commit 5ae46ad

Please sign in to comment.