diff --git a/extensions/git/package.json b/extensions/git/package.json index 013d1375ea3..9e95f9a0c7c 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -2675,8 +2675,18 @@ ] }, "git.publishBeforeContinueOn": { - "type": "boolean", - "default": true, + "type": "string", + "enum": [ + "prompt", + "always", + "never" + ], + "markdownEnumDescriptions": [ + "%config.publishBeforeContinueOn.prompt%", + "%config.publishBeforeContinueOn.always%", + "%config.publishBeforeContinueOn.never%" + ], + "default": "prompt", "markdownDescription": "%config.publishBeforeContinueOn%", "scope": "resource", "tags": [ diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json index 24acb32bac3..3414836a971 100644 --- a/extensions/git/package.nls.json +++ b/extensions/git/package.nls.json @@ -243,6 +243,9 @@ "config.mergeEditor": "Open the merge editor for files that are currently under conflict.", "config.optimisticUpdate": "Controls whether to optimistically update the state of the Source Control view after running git commands.", "config.publishBeforeContinueOn": "Controls whether to publish unpublished git state when using Continue Working On from a git repository.", + "config.publishBeforeContinueOn.always": "Always publish unpublished git state when using Continue Working On from a git repository", + "config.publishBeforeContinueOn.never": "Never publish unpublished git state when using Continue Working On from a git repository", + "config.publishBeforeContinueOn.prompt": "Prompt to publish unpublished git state when using Continue Working On from a git repository", "submenu.explorer": "Git", "submenu.commit": "Commit", "submenu.commit.amend": "Amend", diff --git a/extensions/git/src/editSessionIdentityProvider.ts b/extensions/git/src/editSessionIdentityProvider.ts index 69e3918407b..b66d1af2c3c 100644 --- a/extensions/git/src/editSessionIdentityProvider.ts +++ b/extensions/git/src/editSessionIdentityProvider.ts @@ -16,8 +16,9 @@ export class GitEditSessionIdentityProvider implements vscode.EditSessionIdentit this.providerRegistration = vscode.workspace.registerEditSessionIdentityProvider('file', this); vscode.workspace.onWillCreateEditSessionIdentity((e) => { - if (vscode.workspace.getConfiguration('git').get('publishBeforeContinueOn')) { - e.waitUntil(this._onWillCreateEditSessionIdentity(e.workspaceFolder, e.token)); + const publishBeforeContinueOn = vscode.workspace.getConfiguration('git').get<'never' | 'always' | 'prompt'>('publishBeforeContinueOn', 'prompt'); + if (publishBeforeContinueOn !== 'never') { + e.waitUntil(this._onWillCreateEditSessionIdentity(e.workspaceFolder, e.token, publishBeforeContinueOn)); } }); } @@ -66,12 +67,12 @@ export class GitEditSessionIdentityProvider implements vscode.EditSessionIdentit } } - private async _onWillCreateEditSessionIdentity(workspaceFolder: vscode.WorkspaceFolder, cancellationToken: vscode.CancellationToken): Promise { + private async _onWillCreateEditSessionIdentity(workspaceFolder: vscode.WorkspaceFolder, cancellationToken: vscode.CancellationToken, publishBeforeContinueOn: 'always' | 'prompt'): Promise { const cancellationPromise = createCancellationPromise(cancellationToken); - await Promise.race([this._doPublish(workspaceFolder), cancellationPromise]); + await Promise.race([this._doPublish(workspaceFolder, publishBeforeContinueOn), cancellationPromise]); } - private async _doPublish(workspaceFolder: vscode.WorkspaceFolder) { + private async _doPublish(workspaceFolder: vscode.WorkspaceFolder, publishBeforeContinueOn: 'always' | 'prompt') { await this.model.openRepository(path.dirname(workspaceFolder.uri.fsPath)); const repository = this.model.getRepository(workspaceFolder.uri); @@ -84,6 +85,26 @@ export class GitEditSessionIdentityProvider implements vscode.EditSessionIdentit // If this branch hasn't been published to the remote yet, // ensure that it is published before Continue On is invoked if (!repository.HEAD?.upstream && repository.HEAD?.type === RefType.Head) { + + if (publishBeforeContinueOn === 'prompt') { + const always = vscode.l10n.t('Always'); + const never = vscode.l10n.t('Never'); + const selection = await vscode.window.showInformationMessage( + vscode.l10n.t('The current branch is not published to the remote. Would you like to publish it to access your changes elsewhere?'), + { modal: true }, + ...[always, never] + ); + switch (selection) { + case always: + vscode.workspace.getConfiguration('git').update('publishBeforeContinueOn', 'always'); + break; + case never: + vscode.workspace.getConfiguration('git').update('publishBeforeContinueOn', 'never'); + default: + return; + } + } + await vscode.window.withProgress({ location: vscode.ProgressLocation.Notification, title: vscode.l10n.t('Publishing branch...')