Skip to content

Commit 8ed1744

Browse files
committed
Fixes repo etag checks in Home
1 parent 8f28c19 commit 8ed1744

File tree

1 file changed

+55
-17
lines changed

1 file changed

+55
-17
lines changed

src/webviews/home/homeWebview.ts

Lines changed: 55 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import type { Issue } from '../../git/models/issue';
2525
import type { GitPausedOperationStatus } from '../../git/models/pausedOperationStatus';
2626
import type { PullRequest } from '../../git/models/pullRequest';
2727
import { RemoteResourceType } from '../../git/models/remoteResource';
28-
import type { Repository } from '../../git/models/repository';
28+
import type { Repository, RepositoryFileSystemChangeEvent } from '../../git/models/repository';
2929
import { RepositoryChange, RepositoryChangeComparisonMode } from '../../git/models/repository';
3030
import { uncommitted } from '../../git/models/revision';
3131
import type { GitStatus } from '../../git/models/status';
@@ -141,6 +141,8 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
141141
private readonly _disposable: Disposable;
142142
private _discovering: Promise<number | undefined> | undefined;
143143
private _etag?: number;
144+
private _etagFileSystem?: number;
145+
private _etagRepository?: number;
144146
private _etagSubscription?: number;
145147
private _pendingFocusAccount = false;
146148

@@ -396,6 +398,21 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
396398
}
397399
}
398400

401+
private hasRepositoryChanged(): boolean {
402+
if (this._repositorySubscription?.repo != null) {
403+
if (
404+
this._repositorySubscription.repo.etag !== this._etagRepository ||
405+
this._repositorySubscription.repo.etagFileSystem !== this._etagFileSystem
406+
) {
407+
return true;
408+
}
409+
} else if (this._etag !== this.container.git.etag) {
410+
return true;
411+
}
412+
413+
return false;
414+
}
415+
399416
onVisibilityChanged(visible: boolean): void {
400417
if (!visible) {
401418
this.stopRepositorySubscription();
@@ -405,7 +422,10 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
405422

406423
this.resumeRepositorySubscription();
407424

408-
if (this._discovering == null && this._etag !== this.container.git.etag) {
425+
if (
426+
this._discovering == null &&
427+
(this.container.subscription.etag !== this._etagSubscription || this.hasRepositoryChanged())
428+
) {
409429
this.notifyDidChangeRepositories(true);
410430
}
411431
}
@@ -638,7 +658,7 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
638658
await this.notifyDidChangeSubscription(e.current);
639659

640660
if (isSubscriptionStatePaidOrTrial(e.current.state) !== isSubscriptionStatePaidOrTrial(e.previous.state)) {
641-
this.onOverviewRepoChanged('repo');
661+
this.onOverviewRepoChanged();
642662
}
643663
}
644664

@@ -702,7 +722,7 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
702722
if (repo == null) return undefined;
703723

704724
const forceRepo = this._invalidateOverview === 'repo';
705-
const forceWip = this._invalidateOverview !== undefined;
725+
const forceWip = this._invalidateOverview === 'wip';
706726
const branchesAndWorktrees = await this.getBranchesData(repo, forceRepo);
707727

708728
const { branches, worktreesByBranch } = branchesAndWorktrees;
@@ -718,15 +738,16 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
718738
this.container,
719739
{
720740
isActive: true,
721-
forceStatus: forceWip ? true : undefined,
741+
forceStatus: forceRepo || forceWip ? true : undefined,
722742
},
723743
);
724744

725-
// TODO: revisit invalidation
726-
if (!forceRepo && forceWip) {
745+
if (forceWip) {
727746
this._invalidateOverview = undefined;
728747
}
729748

749+
this._etagFileSystem = repo.etagFileSystem;
750+
730751
return {
731752
repository: await this.formatRepository(repo),
732753
active: activeOverviewBranch,
@@ -881,7 +902,7 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
881902
return Disposable.from(
882903
// TODO: advanced configuration for the watchFileSystem timing
883904
repo.watchFileSystem(1000),
884-
repo.onDidChangeFileSystem(() => this.onOverviewRepoChanged('wip')),
905+
repo.onDidChangeFileSystem(e => this.onOverviewWipChanged(e, repo)),
885906
repo.onDidChange(e => {
886907
if (
887908
e.changed(
@@ -895,26 +916,42 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
895916
RepositoryChangeComparisonMode.Any,
896917
)
897918
) {
898-
this.onOverviewRepoChanged('repo');
919+
this.onOverviewRepoChanged(repo);
899920
}
900921
}),
901922
);
902923
}
903924

904925
@debug()
905-
private onOverviewRepoChanged(scope: 'repo' | 'wip') {
906-
if (this._etag === this.container.git.etag) return;
926+
private onOverviewWipChanged(e: RepositoryFileSystemChangeEvent, repository: Repository) {
927+
if (e.repository?.path !== repository.path) return;
928+
if (this._etagFileSystem === repository.etagFileSystem) return;
907929

930+
// if the repo is already marked invalid, we already need to recompute the whole overview
908931
if (this._invalidateOverview !== 'repo') {
909-
this._invalidateOverview = scope;
932+
this._invalidateOverview = 'wip';
910933
}
934+
911935
if (!this.host.visible) return;
912936

913-
if (scope === 'wip') {
914-
void this.host.notify(DidChangeRepositoryWip, undefined);
915-
} else {
916-
this.notifyDidChangeRepositories();
937+
void this.host.notify(DidChangeRepositoryWip, undefined);
938+
}
939+
940+
@debug()
941+
private onOverviewRepoChanged(repo?: Repository) {
942+
if (repo != null) {
943+
if (this._etagRepository === repo.etag) {
944+
return;
945+
}
946+
} else if (this._etag === this.container.git.etag) {
947+
return;
917948
}
949+
950+
this._invalidateOverview = 'repo';
951+
952+
if (!this.host.visible) return;
953+
954+
this.notifyDidChangeRepositories();
918955
}
919956

920957
private getSelectedRepository() {
@@ -928,7 +965,7 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
928965
private _invalidateOverview: 'repo' | 'wip' | undefined;
929966
private readonly _repositoryBranches: Map<string, RepositoryBranchData> = new Map();
930967
private async getBranchesData(repo: Repository, force = false) {
931-
if (force || !this._repositoryBranches.has(repo.path)) {
968+
if (force || !this._repositoryBranches.has(repo.path) || repo.etag !== this._etagRepository) {
932969
const worktrees = (await repo.git.worktrees()?.getWorktrees()) ?? [];
933970
const worktreesByBranch = groupWorktreesByBranch(worktrees, { includeDefault: true });
934971
const [branchesResult] = await Promise.allSettled([
@@ -939,6 +976,7 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
939976
]);
940977

941978
const branches = getSettledValue(branchesResult)?.values ?? [];
979+
this._etagRepository = repo.etag;
942980

943981
this._repositoryBranches.set(repo.path, {
944982
repo: repo,

0 commit comments

Comments
 (0)