Prompt before auto publishing branch (#171748)

This commit is contained in:
Joyce Er
2023-01-19 11:34:54 -08:00
committed by GitHub
parent ef9fb8a4ea
commit 00d12fcdb2
3 changed files with 41 additions and 7 deletions

View File

@@ -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": [

View File

@@ -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",

View File

@@ -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<void> {
private async _onWillCreateEditSessionIdentity(workspaceFolder: vscode.WorkspaceFolder, cancellationToken: vscode.CancellationToken, publishBeforeContinueOn: 'always' | 'prompt'): Promise<void> {
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...')