Skip to content

Commit 8b0ec28

Browse files
committed
Optimizes repository metadata and initialization
- Converts repository worktree and common URI lookups from asynchronous methods to synchronous, memoized properties - Simplifies repository setup by requiring `gitDir` information at initialization, avoiding lazy-loading overhead
1 parent 81ac691 commit 8b0ec28

File tree

15 files changed

+132
-108
lines changed

15 files changed

+132
-108
lines changed

src/commands/git/worktree.ts

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -377,13 +377,8 @@ export class WorktreeGitCommand extends QuickCommand<State> {
377377
}
378378

379379
private async *createCommandSteps(state: CreateStepState, context: Context): AsyncStepResultGenerator<void> {
380-
if (context.defaultUri == null) {
381-
context.defaultUri = await state.repo.git.worktrees?.getWorktreesDefaultUri();
382-
}
383-
384-
if (state.flags == null) {
385-
state.flags = [];
386-
}
380+
context.defaultUri ??= state.repo.git.worktrees?.getWorktreesDefaultUri();
381+
state.flags ??= [];
387382

388383
context.pickedRootFolder = undefined;
389384
context.pickedSpecificFolder = undefined;
@@ -664,10 +659,10 @@ export class WorktreeGitCommand extends QuickCommand<State> {
664659
return value;
665660
}
666661

667-
private async *createCommandConfirmStep(
662+
private *createCommandConfirmStep(
668663
state: CreateStepState,
669664
context: Context,
670-
): AsyncStepResultGenerator<[CreateConfirmationChoice, CreateFlags[]]> {
665+
): StepResultGenerator<[CreateConfirmationChoice, CreateFlags[]]> {
671666
/**
672667
* Here are the rules for creating the recommended path for the new worktree:
673668
*
@@ -685,7 +680,7 @@ export class WorktreeGitCommand extends QuickCommand<State> {
685680

686681
let recommendedRootUri;
687682

688-
const repoUri = (await state.repo.getCommonRepositoryUri()) ?? state.repo.uri;
683+
const repoUri = state.repo.commonUri ?? state.repo.uri;
689684
const trailer = `${basename(repoUri.path)}.worktrees`;
690685

691686
if (context.pickedRootFolder != null) {

src/env/node/git/localGitProvider.ts

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { GitCache } from '../../../git/cache';
1515
import { BlameIgnoreRevsFileBadRevisionError, BlameIgnoreRevsFileError } from '../../../git/errors';
1616
import { GitIgnoreCache } from '../../../git/gitIgnoreCache';
1717
import type {
18+
GitDir,
1819
GitProvider,
1920
GitProviderDescriptor,
2021
RepositoryCloseEvent,
@@ -427,7 +428,13 @@ export class LocalGitProvider implements GitProvider, Disposable {
427428
}
428429

429430
@debug({ exit: true })
430-
openRepository(folder: WorkspaceFolder | undefined, uri: Uri, root: boolean, closed?: boolean): Repository[] {
431+
openRepository(
432+
folder: WorkspaceFolder | undefined,
433+
uri: Uri,
434+
gitDir: GitDir,
435+
root: boolean,
436+
closed?: boolean,
437+
): Repository[] {
431438
if (!closed) {
432439
void this.getOrOpenScmRepository(uri);
433440
}
@@ -442,6 +449,7 @@ export class LocalGitProvider implements GitProvider, Disposable {
442449
this.descriptor,
443450
folder ?? workspace.getWorkspaceFolder(uri),
444451
uri,
452+
gitDir,
445453
root,
446454
closed,
447455
),
@@ -460,6 +468,7 @@ export class LocalGitProvider implements GitProvider, Disposable {
460468
this.descriptor,
461469
folder ?? workspace.getWorkspaceFolder(canonicalUri),
462470
canonicalUri,
471+
gitDir,
463472
root,
464473
true,
465474
),
@@ -613,7 +622,7 @@ export class LocalGitProvider implements GitProvider, Disposable {
613622
let rootPath;
614623
let canonicalRootPath;
615624

616-
function maybeAddRepo(this: LocalGitProvider, uri: Uri, folder: WorkspaceFolder | undefined, root: boolean) {
625+
const maybeAddRepo = async (uri: Uri, folder: WorkspaceFolder | undefined, root: boolean) => {
617626
const comparisonId = asRepoComparisonKey(uri);
618627
if (repositories.some(r => r.id === comparisonId)) {
619628
Logger.log(scope, `found ${root ? 'root ' : ''}repository in '${uri.fsPath}'; skipping - duplicate`);
@@ -630,8 +639,9 @@ export class LocalGitProvider implements GitProvider, Disposable {
630639
}
631640

632641
Logger.log(scope, `found ${root ? 'root ' : ''}repository in '${uri.fsPath}'`);
633-
repositories.push(...this.openRepository(folder, uri, root, silent));
634-
}
642+
const gitDir = await this.config.getGitDir(uri.fsPath);
643+
repositories.push(...this.openRepository(folder, uri, gitDir, root, silent));
644+
};
635645

636646
const uri = await this.findRepositoryUri(rootUri, true);
637647
if (uri != null) {
@@ -642,7 +652,7 @@ export class LocalGitProvider implements GitProvider, Disposable {
642652
canonicalRootPath = normalizePath(canonicalUri.fsPath);
643653
}
644654

645-
maybeAddRepo.call(this, uri, folder, true);
655+
await maybeAddRepo(uri, folder, true);
646656
}
647657

648658
if (depth <= 0 || cancellation?.isCancellationRequested) return repositories;
@@ -699,7 +709,7 @@ export class LocalGitProvider implements GitProvider, Disposable {
699709
const rp = await this.findRepositoryUri(Uri.file(p), true);
700710
if (rp == null) continue;
701711

702-
maybeAddRepo.call(this, rp, folder, false);
712+
await maybeAddRepo(rp, folder, false);
703713
}
704714

705715
return repositories;

src/env/node/git/sub-providers/worktrees.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,13 +129,13 @@ export class WorktreesGitSubProvider implements GitWorktreesSubProvider {
129129
}
130130

131131
@log()
132-
async getWorktreesDefaultUri(repoPath: string): Promise<Uri | undefined> {
132+
getWorktreesDefaultUri(repoPath: string): Uri | undefined {
133133
let defaultUri = this.getWorktreesDefaultUriCore(repoPath);
134134
if (defaultUri != null) return defaultUri;
135135

136136
// If we don't have a default set, default it to the parent folder of the repo folder
137137
const repo = this.container.git.getRepository(repoPath);
138-
defaultUri = (await repo?.getCommonRepositoryUri()) ?? repo?.uri;
138+
defaultUri = repo?.commonUri ?? repo?.uri;
139139
if (defaultUri != null) {
140140
defaultUri = Uri.joinPath(defaultUri, '..');
141141
}

src/env/node/git/vslsGitProvider.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type { GitProviderDescriptor } from '../../../git/gitProvider';
66
import type { Repository } from '../../../git/models/repository';
77
import { isFolderUri } from '../../../system/-webview/path';
88
import { addVslsPrefixIfNeeded } from '../../../system/-webview/path.vsls';
9+
import { debug } from '../../../system/decorators/log';
910
import { Logger } from '../../../system/logger';
1011
import { getLogScope } from '../../../system/logger.scope';
1112
import type { GitResult } from './git';
@@ -57,6 +58,7 @@ export class VslsGitProvider extends LocalGitProvider {
5758
};
5859
override readonly supportedSchemes = new Set<string>([Schemes.Vsls, Schemes.VslsScc]);
5960

61+
@debug({ exit: true })
6062
override async discoverRepositories(uri: Uri): Promise<Repository[]> {
6163
if (!this.supportedSchemes.has(uri.scheme)) return [];
6264

@@ -65,11 +67,20 @@ export class VslsGitProvider extends LocalGitProvider {
6567
try {
6668
const guest = await this.container.vsls.guest();
6769
const repositories = await guest?.getRepositoriesForUri(uri);
68-
if (repositories == null || repositories.length === 0) return [];
70+
if (!repositories?.length) return [];
6971

70-
return repositories.flatMap(r =>
71-
this.openRepository(undefined, Uri.parse(r.folderUri, true), r.root, r.closed),
72-
);
72+
const result: Repository[] = [];
73+
for (const r of repositories) {
74+
const repoUri = Uri.parse(r.folderUri, true);
75+
76+
const gitDir = await this.config.getGitDir(repoUri.fsPath);
77+
if (gitDir == null) {
78+
Logger.warn(scope, `Unable to get gitDir for '${repoUri.toString(true)}'`);
79+
}
80+
81+
result.push(...this.openRepository(undefined, repoUri, gitDir, r.root, r.closed));
82+
}
83+
return result;
7384
} catch (ex) {
7485
Logger.error(ex, scope);
7586
debugger;

src/git/gitProvider.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -900,7 +900,7 @@ export interface GitWorktreesSubProvider {
900900
cancellation?: CancellationToken,
901901
): Promise<GitWorktree | undefined>;
902902
getWorktrees(repoPath: string, cancellation?: CancellationToken): Promise<GitWorktree[]>;
903-
getWorktreesDefaultUri(repoPath: string): Promise<Uri | undefined>;
903+
getWorktreesDefaultUri(repoPath: string): Uri | undefined;
904904
deleteWorktree(repoPath: string, path: string | Uri, options?: { force?: boolean }): Promise<void>;
905905
}
906906

@@ -963,7 +963,13 @@ export interface GitProvider extends GitRepositoryProvider, Disposable {
963963
options?: { cancellation?: CancellationToken; depth?: number; silent?: boolean },
964964
): Promise<Repository[]>;
965965
updateContext?(): void;
966-
openRepository(folder: WorkspaceFolder | undefined, uri: Uri, root: boolean, closed?: boolean): Repository[];
966+
openRepository(
967+
folder: WorkspaceFolder | undefined,
968+
uri: Uri,
969+
gitDir: GitDir | undefined,
970+
root: boolean,
971+
closed?: boolean,
972+
): Repository[];
967973
openRepositoryInitWatcher?(): RepositoryInitWatcher;
968974

969975
supports(feature: Features): Promise<boolean>;

src/git/gitProviderService.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1612,7 +1612,11 @@ export class GitProviderService implements Disposable {
16121612
}
16131613

16141614
Logger.log(scope, `Repository found in '${repoUri.toString(true)}'`);
1615-
const repositories = provider.openRepository(root?.folder, repoUri, false, closed);
1615+
const gitDir = await provider.config.getGitDir?.(repoUri.fsPath);
1616+
if (gitDir == null) {
1617+
Logger.warn(scope, `Unable to get gitDir for '${repoUri.toString(true)}'`);
1618+
}
1619+
const repositories = provider.openRepository(root?.folder, repoUri, gitDir, false, closed);
16161620

16171621
const added: Repository[] = [];
16181622

0 commit comments

Comments
 (0)