Skip to content

Commit 373085a

Browse files
committed
Splits repo events
- Allows for not debounced cache clearing but debounced external events
1 parent 61d0d5b commit 373085a

File tree

5 files changed

+51
-20
lines changed

5 files changed

+51
-20
lines changed

src/env/node/git/localGitProvider.ts

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,11 @@ export class LocalGitProvider implements GitProvider, Disposable {
274274
return this._onDidChange.event;
275275
}
276276

277+
private _onWillChangeRepository = new EventEmitter<RepositoryChangeEvent>();
278+
get onWillChangeRepository(): Event<RepositoryChangeEvent> {
279+
return this._onWillChangeRepository.event;
280+
}
281+
277282
private _onDidChangeRepository = new EventEmitter<RepositoryChangeEvent>();
278283
get onDidChangeRepository(): Event<RepositoryChangeEvent> {
279284
return this._onDidChangeRepository.event;
@@ -371,7 +376,7 @@ export class LocalGitProvider implements GitProvider, Disposable {
371376
this._worktreesCache.delete(repo.path);
372377
}
373378

374-
this._onDidChangeRepository.fire(e);
379+
this._onWillChangeRepository.fire(e);
375380
}
376381

377382
private _gitLocator: Promise<GitLocation> | undefined;
@@ -574,7 +579,10 @@ export class LocalGitProvider implements GitProvider, Disposable {
574579
const opened = [
575580
new Repository(
576581
this.container,
577-
this.onRepositoryChanged.bind(this),
582+
{
583+
onDidRepositoryChange: this._onDidChangeRepository,
584+
onRepositoryChanged: this.onRepositoryChanged.bind(this),
585+
},
578586
this.descriptor,
579587
folder ?? workspace.getWorkspaceFolder(uri),
580588
uri,
@@ -590,7 +598,10 @@ export class LocalGitProvider implements GitProvider, Disposable {
590598
opened.push(
591599
new Repository(
592600
this.container,
593-
this.onRepositoryChanged.bind(this),
601+
{
602+
onDidRepositoryChange: this._onDidChangeRepository,
603+
onRepositoryChanged: this.onRepositoryChanged.bind(this),
604+
},
594605
this.descriptor,
595606
folder ?? workspace.getWorkspaceFolder(canonicalUri),
596607
canonicalUri,
@@ -607,10 +618,7 @@ export class LocalGitProvider implements GitProvider, Disposable {
607618
@debug({ singleLine: true })
608619
openRepositoryInitWatcher(): RepositoryInitWatcher {
609620
const watcher = workspace.createFileSystemWatcher('**/.git', false, true, true);
610-
return {
611-
onDidCreate: watcher.onDidCreate,
612-
dispose: () => void watcher.dispose(),
613-
};
621+
return { onDidCreate: watcher.onDidCreate, dispose: watcher.dispose };
614622
}
615623

616624
private _supportedFeatures = new Map<Features, boolean>();

src/git/gitProvider.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,7 @@ export interface GitProviderRepository {
470470

471471
export interface GitProvider extends GitProviderRepository, Disposable {
472472
get onDidChange(): Event<void>;
473+
get onWillChangeRepository(): Event<RepositoryChangeEvent>;
473474
get onDidChangeRepository(): Event<RepositoryChangeEvent>;
474475
get onDidCloseRepository(): Event<RepositoryCloseEvent>;
475476
get onDidOpenRepository(): Event<RepositoryOpenEvent>;

src/git/gitProviderService.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -463,8 +463,8 @@ export class GitProviderService implements Disposable {
463463
void this.discoverRepositories(workspaceFolders, { force: true });
464464
}
465465
}),
466-
provider.onDidChangeRepository(async e => {
467-
Logger.debug(`GitProvider(${id}).onDidChangeRepository(e=${e.repository.toString()})`);
466+
provider.onWillChangeRepository(e => {
467+
Logger.debug(`GitProvider(${id}).onWillChangeRepository(e=${e.repository.toString()})`);
468468

469469
if (
470470
e.changed(
@@ -475,6 +475,9 @@ export class GitProviderService implements Disposable {
475475
) {
476476
this._bestRemotesCache.clear();
477477
}
478+
}),
479+
provider.onDidChangeRepository(async e => {
480+
Logger.debug(`GitProvider(${id}).onDidChangeRepository(e=${e.repository.toString()})`);
478481

479482
if (e.changed(RepositoryChange.Closed, RepositoryChangeComparisonMode.Any)) {
480483
this.updateContext();

src/git/models/repository.ts

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import type { FeatureAccess, PlusFeatures } from '../../features';
88
import { showCreatePullRequestPrompt, showGenericErrorMessage } from '../../messages';
99
import type { RepoComparisonKey } from '../../repositories';
1010
import { asRepoComparisonKey } from '../../repositories';
11+
import { getScopedCounter } from '../../system/counter';
1112
import { formatDate, fromNow } from '../../system/date';
1213
import { gate } from '../../system/decorators/gate';
1314
import { debug, log, logName } from '../../system/decorators/log';
@@ -24,7 +25,7 @@ import { configuration } from '../../system/vscode/configuration';
2425
import type { GitProviderDescriptor, GitProviderRepository } from '../gitProvider';
2526
import type { GitProviderService } from '../gitProviderService';
2627
import type { GitBranch } from './branch';
27-
import { getBranchNameWithoutRemote, getNameWithoutRemote , getRemoteNameFromBranchName } from './branch.utils';
28+
import { getBranchNameWithoutRemote, getNameWithoutRemote, getRemoteNameFromBranchName } from './branch.utils';
2829
import type { GitBranchReference, GitReference } from './reference';
2930
import { isBranchReference } from './reference.utils';
3031
import type { GitRemote } from './remote';
@@ -175,7 +176,9 @@ export interface RepositoryFileSystemChangeEvent {
175176
readonly uris: Uri[];
176177
}
177178

178-
@logName<Repository>((r, name) => `${name}(${r.id})`)
179+
const instanceCounter = getScopedCounter();
180+
181+
@logName<Repository>((r, name) => `${name}(${r.id}|${r.instance})`)
179182
export class Repository implements Disposable {
180183
static formatLastFetched(lastFetched: number, short: boolean = true): string {
181184
const date = new Date(lastFetched);
@@ -224,6 +227,7 @@ export class Repository implements Disposable {
224227

225228
readonly id: RepoComparisonKey;
226229
readonly index: number;
230+
readonly instance = instanceCounter.next();
227231

228232
private _name: string;
229233
get name(): string {
@@ -247,7 +251,10 @@ export class Repository implements Disposable {
247251

248252
constructor(
249253
private readonly container: Container,
250-
private readonly onDidRepositoryChange: (repo: Repository, e: RepositoryChangeEvent) => void,
254+
private readonly providerService: {
255+
readonly onDidRepositoryChange: EventEmitter<RepositoryChangeEvent>;
256+
readonly onRepositoryChanged: (repo: Repository, e: RepositoryChangeEvent) => void;
257+
},
251258
public readonly provider: GitProviderDescriptor,
252259
public readonly folder: WorkspaceFolder | undefined,
253260
public readonly uri: Uri,
@@ -361,9 +368,9 @@ export class Repository implements Disposable {
361368

362369
disposables.push(
363370
watcher,
364-
watcher.onDidChange(e => this.onRepositoryChanged(e, uri)),
365-
watcher.onDidCreate(e => this.onRepositoryChanged(e, uri)),
366-
watcher.onDidDelete(e => this.onRepositoryChanged(e, uri)),
371+
watcher.onDidChange(e => this.onRepositoryChanged(e, uri, 'change')),
372+
watcher.onDidCreate(e => this.onRepositoryChanged(e, uri, 'create')),
373+
watcher.onDidDelete(e => this.onRepositoryChanged(e, uri, 'delete')),
367374
);
368375
return watcher;
369376
}
@@ -465,7 +472,7 @@ export class Repository implements Disposable {
465472
}
466473

467474
@debug()
468-
private onRepositoryChanged(uri: Uri | undefined, base: Uri) {
475+
private onRepositoryChanged(uri: Uri | undefined, base: Uri, _reason: 'create' | 'change' | 'delete') {
469476
// TODO@eamodio Revisit -- as I can't seem to get this to work as a negative glob pattern match when creating the watcher
470477
if (uri?.path.includes('/fsmonitor--daemon/')) {
471478
return;
@@ -1031,7 +1038,7 @@ export class Repository implements Disposable {
10311038

10321039
this._pendingRepoChange = this._pendingRepoChange?.with(changes) ?? new RepositoryChangeEvent(this, changes);
10331040

1034-
this.onDidRepositoryChange(this, new RepositoryChangeEvent(this, changes));
1041+
this.providerService.onRepositoryChanged(this, this._pendingRepoChange);
10351042

10361043
if (this._suspended) {
10371044
Logger.debug(scope, `queueing suspended ${this._pendingRepoChange.toString(true)}`);
@@ -1049,7 +1056,11 @@ export class Repository implements Disposable {
10491056
this._pendingRepoChange = undefined;
10501057

10511058
Logger.debug(`Repository(${this.id}) firing ${e.toString(true)}`);
1052-
this._onDidChange.fire(e);
1059+
try {
1060+
this._onDidChange.fire(e);
1061+
} finally {
1062+
this.providerService.onDidRepositoryChange.fire(e);
1063+
}
10531064
}
10541065

10551066
@debug()

src/plus/integrations/providers/github/githubGitProvider.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,11 @@ export class GitHubGitProvider implements GitProvider, Disposable {
152152
return this._onDidChange.event;
153153
}
154154

155+
private _onWillChangeRepository = new EventEmitter<RepositoryChangeEvent>();
156+
get onWillChangeRepository(): Event<RepositoryChangeEvent> {
157+
return this._onWillChangeRepository.event;
158+
}
159+
155160
private _onDidChangeRepository = new EventEmitter<RepositoryChangeEvent>();
156161
get onDidChangeRepository(): Event<RepositoryChangeEvent> {
157162
return this._onDidChangeRepository.event;
@@ -213,7 +218,7 @@ export class GitHubGitProvider implements GitProvider, Disposable {
213218
this._tagsCache.delete(repo.path);
214219
this._repoInfoCache.delete(repo.path);
215220

216-
this._onDidChangeRepository.fire(e);
221+
this._onWillChangeRepository.fire(e);
217222
}
218223

219224
async discoverRepositories(
@@ -289,7 +294,10 @@ export class GitHubGitProvider implements GitProvider, Disposable {
289294
return [
290295
new Repository(
291296
this.container,
292-
this.onRepositoryChanged.bind(this),
297+
{
298+
onDidRepositoryChange: this._onDidChangeRepository,
299+
onRepositoryChanged: this.onRepositoryChanged.bind(this),
300+
},
293301
this.descriptor,
294302
folder ?? workspace.getWorkspaceFolder(uri),
295303
uri,

0 commit comments

Comments
 (0)