diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index a1069359507..b6e80aa0b4a 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -1020,18 +1020,37 @@ export class CommandCenter { } } - @command('git.continueInLocalClone') - async continueInLocalClone(): Promise { - if (this.model.repositories.length === 0) { return; } - - // Pick a single repository to continue working on in a local clone if there's more than one - const items = this.model.repositories.reduce<(QuickPickItem & { repository: Repository })[]>((items, repository) => { + private getRepositoriesWithRemote(repositories: Repository[]) { + return repositories.reduce<(QuickPickItem & { repository: Repository })[]>((items, repository) => { const remote = repository.remotes.find((r) => r.name === repository.HEAD?.upstream?.remote); if (remote?.pushUrl) { items.push({ repository: repository, label: remote.pushUrl }); } return items; }, []); + } + + @command('git.continueInLocalClone') + async continueInLocalClone(): Promise { + if (this.model.repositories.length === 0) { return; } + + // Pick a single repository to continue working on in a local clone if there's more than one + let items = this.getRepositoriesWithRemote(this.model.repositories); + + // We have a repository but there is no remote URL (e.g. git init) + if (items.length === 0) { + const pick = this.model.repositories.length === 1 + ? { repository: this.model.repositories[0] } + : await window.showQuickPick(this.model.repositories.map((i) => ({ repository: i, label: i.root })), { canPickMany: false, placeHolder: l10n.t('Choose which repository to publish') }); + if (!pick) { return; } + + await this.publish(pick.repository); + + items = this.getRepositoriesWithRemote([pick.repository]); + if (items.length === 0) { + return; + } + } let selection = items[0]; if (items.length > 1) { diff --git a/extensions/git/src/editSessionIdentityProvider.ts b/extensions/git/src/editSessionIdentityProvider.ts index 6a0a31774a1..517cde32080 100644 --- a/extensions/git/src/editSessionIdentityProvider.ts +++ b/extensions/git/src/editSessionIdentityProvider.ts @@ -13,11 +13,12 @@ export class GitEditSessionIdentityProvider implements vscode.EditSessionIdentit private providerRegistration: vscode.Disposable; constructor(private model: Model) { - this.providerRegistration = vscode.workspace.registerEditSessionIdentityProvider('file', this); - - vscode.workspace.onWillCreateEditSessionIdentity((e) => { - e.waitUntil(this._onWillCreateEditSessionIdentity(e.workspaceFolder)); - }); + this.providerRegistration = vscode.Disposable.from( + vscode.workspace.registerEditSessionIdentityProvider('file', this), + vscode.workspace.onWillCreateEditSessionIdentity((e) => { + e.waitUntil(this._onWillCreateEditSessionIdentity(e.workspaceFolder)); + }) + ); } dispose() { diff --git a/src/vs/workbench/api/browser/mainThreadEditSessionIdentityParticipant.ts b/src/vs/workbench/api/browser/mainThreadEditSessionIdentityParticipant.ts index db70e241abc..ae1198c5455 100644 --- a/src/vs/workbench/api/browser/mainThreadEditSessionIdentityParticipant.ts +++ b/src/vs/workbench/api/browser/mainThreadEditSessionIdentityParticipant.ts @@ -16,7 +16,7 @@ import { WorkspaceFolder } from '../../../platform/workspace/common/workspace.js class ExtHostEditSessionIdentityCreateParticipant implements IEditSessionIdentityCreateParticipant { private readonly _proxy: ExtHostWorkspaceShape; - private readonly timeout = 10000; + private readonly timeout = 20000; constructor(extHostContext: IExtHostContext) { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostWorkspace);