Revert "A full editor can be used as git commit message editor (#95266)" (#150487)

This reverts commit 97f8e66d74.
This commit is contained in:
Ladislau Szomoru
2022-05-26 23:06:23 +02:00
committed by GitHub
parent 33a8212fd2
commit 9bfd3c1d72
17 changed files with 45 additions and 235 deletions

View File

@@ -137,8 +137,6 @@ export interface CommitOptions {
empty?: boolean;
noVerify?: boolean;
requireUserConfig?: boolean;
useEditor?: boolean;
verbose?: boolean;
}
export interface FetchOptions {
@@ -338,5 +336,4 @@ export const enum GitErrorCodes {
PatchDoesNotApply = 'PatchDoesNotApply',
NoPathFound = 'NoPathFound',
UnknownPath = 'UnknownPath',
EmptyCommitMessage = 'EmptyCommitMessage'
}

View File

@@ -6,8 +6,9 @@
import { window, InputBoxOptions, Uri, Disposable, workspace } from 'vscode';
import { IDisposable, EmptyDisposable, toDisposable } from './util';
import * as path from 'path';
import { IIPCHandler, IIPCServer } from './ipc/ipcServer';
import { IIPCHandler, IIPCServer, createIPCServer } from './ipc/ipcServer';
import { CredentialsProvider, Credentials } from './api/git';
import { OutputChannelLogger } from './log';
export class Askpass implements IIPCHandler {
@@ -15,7 +16,16 @@ export class Askpass implements IIPCHandler {
private cache = new Map<string, Credentials>();
private credentialsProviders = new Set<CredentialsProvider>();
constructor(private ipc?: IIPCServer) {
static async create(outputChannelLogger: OutputChannelLogger, context?: string): Promise<Askpass> {
try {
return new Askpass(await createIPCServer(context));
} catch (err) {
outputChannelLogger.logError(`Failed to create git askpass IPC: ${err}`);
return new Askpass();
}
}
private constructor(private ipc?: IIPCServer) {
if (ipc) {
this.disposable = ipc.registerHandler('askpass', this);
}

View File

@@ -1516,14 +1516,6 @@ export class CommandCenter {
opts.signoff = true;
}
if (config.get<boolean>('useEditorAsCommitInput')) {
opts.useEditor = true;
if (config.get<boolean>('verboseCommit')) {
opts.verbose = true;
}
}
const smartCommitChanges = config.get<'all' | 'tracked'>('smartCommitChanges');
if (
@@ -1571,7 +1563,7 @@ export class CommandCenter {
let message = await getCommitMessage();
if (!message && !opts.amend && !opts.useEditor) {
if (!message && !opts.amend) {
return false;
}
@@ -1631,13 +1623,10 @@ export class CommandCenter {
private async commitWithAnyInput(repository: Repository, opts?: CommitOptions): Promise<void> {
const message = repository.inputBox.value;
const root = Uri.file(repository.root);
const config = workspace.getConfiguration('git', root);
const getCommitMessage = async () => {
let _message: string | undefined = message;
if (!_message && !config.get<boolean>('useEditorAsCommitInput')) {
if (!_message) {
let value: string | undefined = undefined;
if (opts && opts.amend && repository.HEAD && repository.HEAD.commit) {
@@ -3021,7 +3010,7 @@ export class CommandCenter {
};
let message: string;
let type: 'error' | 'warning' | 'information' = 'error';
let type: 'error' | 'warning' = 'error';
const choices = new Map<string, () => void>();
const openOutputChannelChoice = localize('open git log', "Open Git Log");
@@ -3084,12 +3073,6 @@ export class CommandCenter {
message = localize('missing user info', "Make sure you configure your 'user.name' and 'user.email' in git.");
choices.set(localize('learn more', "Learn More"), () => commands.executeCommand('vscode.open', Uri.parse('https://aka.ms/vscode-setup-git')));
break;
case GitErrorCodes.EmptyCommitMessage:
message = localize('empty commit', "Commit operation was cancelled due to empty commit message.");
choices.clear();
type = 'information';
options.modal = false;
break;
default: {
const hint = (err.stderr || err.message || String(err))
.replace(/^error: /mi, '')
@@ -3111,20 +3094,10 @@ export class CommandCenter {
return;
}
let result: string | undefined;
const allChoices = Array.from(choices.keys());
switch (type) {
case 'error':
result = await window.showErrorMessage(message, options, ...allChoices);
break;
case 'warning':
result = await window.showWarningMessage(message, options, ...allChoices);
break;
case 'information':
result = await window.showInformationMessage(message, options, ...allChoices);
break;
}
const result = type === 'error'
? await window.showErrorMessage(message, options, ...allChoices)
: await window.showWarningMessage(message, options, ...allChoices);
if (result) {
const resultFn = choices.get(result);

View File

@@ -1400,37 +1400,20 @@ export class Repository {
}
async commit(message: string | undefined, opts: CommitOptions = Object.create(null)): Promise<void> {
const args = ['commit', '--quiet'];
const options: SpawnOptions = {};
if (message) {
options.input = message;
args.push('--file', '-');
}
if (opts.verbose) {
args.push('--verbose');
}
const args = ['commit', '--quiet', '--allow-empty-message'];
if (opts.all) {
args.push('--all');
}
if (opts.amend) {
if (opts.amend && message) {
args.push('--amend');
}
if (!opts.useEditor) {
if (!message) {
if (opts.amend) {
args.push('--no-edit');
} else {
options.input = '';
args.push('--file', '-');
}
}
args.push('--allow-empty-message');
if (opts.amend && !message) {
args.push('--amend', '--no-edit');
} else {
args.push('--file', '-');
}
if (opts.signoff) {
@@ -1455,7 +1438,7 @@ export class Repository {
}
try {
await this.exec(args, options);
await this.exec(args, !opts.amend || message ? { input: message || '' } : {});
} catch (commitErr) {
await this.handleCommitError(commitErr);
}
@@ -1479,9 +1462,6 @@ export class Repository {
if (/not possible because you have unmerged files/.test(commitErr.stderr || '')) {
commitErr.gitErrorCode = GitErrorCodes.UnmergedChanges;
throw commitErr;
} else if (/Aborting commit due to empty commit message/.test(commitErr.stderr || '')) {
commitErr.gitErrorCode = GitErrorCodes.EmptyCommitMessage;
throw commitErr;
}
try {

View File

@@ -1,64 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as path from 'path';
import { TabInputText, Uri, window, workspace } from 'vscode';
import { IIPCHandler, IIPCServer } from '../ipc/ipcServer';
import { EmptyDisposable, IDisposable } from '../util';
interface GitEditorRequest {
commitMessagePath?: string;
}
export class GitEditor implements IIPCHandler {
private disposable: IDisposable = EmptyDisposable;
constructor(private ipc?: IIPCServer) {
if (ipc) {
this.disposable = ipc.registerHandler('git-editor', this);
}
}
async handle({ commitMessagePath }: GitEditorRequest): Promise<any> {
if (commitMessagePath) {
const uri = Uri.file(commitMessagePath);
const doc = await workspace.openTextDocument(uri);
await window.showTextDocument(doc, { preview: false });
return new Promise((c) => {
const onDidClose = window.tabGroups.onDidChangeTabs(async (tabs) => {
if (tabs.closed.some(t => t.input instanceof TabInputText && t.input.uri.toString() === uri.toString())) {
onDidClose.dispose();
return c(true);
}
});
});
}
}
getEnv(): { [key: string]: string } {
if (!this.ipc) {
const fileType = process.platform === 'win32' ? 'bat' : 'sh';
const gitEditor = path.join(__dirname, `scripts/git-editor-empty.${fileType}`);
return {
GIT_EDITOR: `'${gitEditor}'`
};
}
const fileType = process.platform === 'win32' ? 'bat' : 'sh';
const gitEditor = path.join(__dirname, `scripts/git-editor.${fileType}`);
return {
GIT_EDITOR: `'${gitEditor}'`,
VSCODE_GIT_EDITOR_NODE: process.execPath,
VSCODE_GIT_EDITOR_MAIN: path.join(__dirname, 'main.js')
};
}
dispose(): void {
this.disposable.dispose();
}
}

View File

@@ -1,21 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { IPCClient } from '../ipc/ipcClient';
function fatal(err: any): void {
console.error(err);
process.exit(1);
}
function main(argv: string[]): void {
const ipcClient = new IPCClient('git-editor');
const commitMessagePath = argv[2];
ipcClient.call({ commitMessagePath }).then(() => {
setTimeout(() => process.exit(0), 0);
}).catch(err => fatal(err));
}
main(process.argv);

View File

@@ -1 +0,0 @@
@ECHO off

View File

@@ -1 +0,0 @@
#!/bin/sh

View File

@@ -1,4 +0,0 @@
@ECHO off
set ELECTRON_RUN_AS_NODE=1
"%VSCODE_GIT_EDITOR_NODE%" "%VSCODE_GIT_EDITOR_MAIN%" %*

View File

@@ -1,4 +0,0 @@
#!/bin/sh
ELECTRON_RUN_AS_NODE="1" \
"$VSCODE_GIT_EDITOR_NODE" "$VSCODE_GIT_EDITOR_MAIN" $@

View File

@@ -25,8 +25,6 @@ import { GitTimelineProvider } from './timelineProvider';
import { registerAPICommands } from './api/api1';
import { TerminalEnvironmentManager } from './terminal';
import { OutputChannelLogger } from './log';
import { createIPCServer, IIPCServer } from './ipc/ipcServer';
import { GitEditor } from './gitEditor/gitEditor';
const deactivateTasks: { (): Promise<any> }[] = [];
@@ -62,21 +60,10 @@ async function createModel(context: ExtensionContext, outputChannelLogger: Outpu
return !skip;
});
let ipc: IIPCServer | undefined = undefined;
try {
ipc = await createIPCServer(context.storagePath);
} catch (err) {
outputChannelLogger.logError(`Failed to create git IPC: ${err}`);
}
const askpass = new Askpass(ipc);
const askpass = await Askpass.create(outputChannelLogger, context.storagePath);
disposables.push(askpass);
const gitEditor = new GitEditor(ipc);
disposables.push(gitEditor);
const environment = { ...askpass.getEnv(), ...gitEditor.getEnv() };
const environment = askpass.getEnv();
const terminalEnvironmentManager = new TerminalEnvironmentManager(context, environment);
disposables.push(terminalEnvironmentManager);

View File

@@ -454,13 +454,6 @@ class ProgressManager {
const onDidChange = filterEvent(workspace.onDidChangeConfiguration, e => e.affectsConfiguration('git', Uri.file(this.repository.root)));
onDidChange(_ => this.updateEnablement());
this.updateEnablement();
this.repository.onDidChangeOperations(() => {
const commitInProgress = this.repository.operations.isRunning(Operation.Commit);
this.repository.sourceControl.inputBox.enabled = !commitInProgress;
commands.executeCommand('setContext', 'commitInProgress', commitInProgress);
});
}
private updateEnablement(): void {