diff --git a/extensions/git/extension.webpack.config.js b/extensions/git/extension.webpack.config.js index ee6203af47e45..5efa2052e88e5 100644 --- a/extensions/git/extension.webpack.config.js +++ b/extensions/git/extension.webpack.config.js @@ -13,7 +13,6 @@ module.exports = withDefaults({ context: __dirname, entry: { main: './src/main.ts', - ['askpass-main']: './src/askpass-main.ts', - ['git-editor-main']: './src/gitEditor/main.ts' + ['askpass-main']: './src/askpass-main.ts' } }); diff --git a/extensions/git/package.json b/extensions/git/package.json index 0ca505b833183..b5ad659a01055 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -13,9 +13,7 @@ "diffCommand", "contribMergeEditorToolbar", "contribViewsWelcome", - "resolvers", "scmActionButton", - "scmInput", "scmSelectedProvider", "scmValidation", "timeline" @@ -215,99 +213,83 @@ "command": "git.commit", "title": "%command.commit%", "category": "Git", - "icon": "$(check)", - "enablement": "!commitInProgress" + "icon": "$(check)" }, { "command": "git.commitStaged", "title": "%command.commitStaged%", - "category": "Git", - "enablement": "!commitInProgress" + "category": "Git" }, { "command": "git.commitEmpty", "title": "%command.commitEmpty%", - "category": "Git", - "enablement": "!commitInProgress" + "category": "Git" }, { "command": "git.commitStagedSigned", "title": "%command.commitStagedSigned%", - "category": "Git", - "enablement": "!commitInProgress" + "category": "Git" }, { "command": "git.commitStagedAmend", "title": "%command.commitStagedAmend%", - "category": "Git", - "enablement": "!commitInProgress" + "category": "Git" }, { "command": "git.commitAll", "title": "%command.commitAll%", - "category": "Git", - "enablement": "!commitInProgress" + "category": "Git" }, { "command": "git.commitAllSigned", "title": "%command.commitAllSigned%", - "category": "Git", - "enablement": "!commitInProgress" + "category": "Git" }, { "command": "git.commitAllAmend", "title": "%command.commitAllAmend%", - "category": "Git", - "enablement": "!commitInProgress" + "category": "Git" }, { "command": "git.commitNoVerify", "title": "%command.commitNoVerify%", "category": "Git", - "icon": "$(check)", - "enablement": "!commitInProgress" + "icon": "$(check)" }, { "command": "git.commitStagedNoVerify", "title": "%command.commitStagedNoVerify%", - "category": "Git", - "enablement": "!commitInProgress" + "category": "Git" }, { "command": "git.commitEmptyNoVerify", "title": "%command.commitEmptyNoVerify%", - "category": "Git", - "enablement": "!commitInProgress" + "category": "Git" }, { "command": "git.commitStagedSignedNoVerify", "title": "%command.commitStagedSignedNoVerify%", - "category": "Git", - "enablement": "!commitInProgress" + "category": "Git" }, { "command": "git.commitStagedAmendNoVerify", "title": "%command.commitStagedAmendNoVerify%", - "category": "Git", - "enablement": "!commitInProgress" + "category": "Git" }, { "command": "git.commitAllNoVerify", "title": "%command.commitAllNoVerify%", - "category": "Git", - "enablement": "!commitInProgress" + "category": "Git" }, { "command": "git.commitAllSignedNoVerify", "title": "%command.commitAllSignedNoVerify%", - "category": "Git", - "enablement": "!commitInProgress" + "category": "Git" }, { "command": "git.commitAllAmendNoVerify", "title": "%command.commitAllAmendNoVerify%", - "category": "Git", - "enablement": "!commitInProgress" + "category": "Git" }, { "command": "git.restoreCommitTemplate", @@ -2017,18 +1999,6 @@ "scope": "machine", "description": "%config.defaultCloneDirectory%" }, - "git.useEditorAsCommitInput": { - "type": "boolean", - "scope": "resource", - "description": "%config.useEditorAsCommitInput%", - "default": false - }, - "git.verboseCommit": { - "type": "boolean", - "scope": "resource", - "markdownDescription": "%config.verboseCommit%", - "default": false - }, "git.enableSmartCommit": { "type": "boolean", "scope": "resource", diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json index 8628ed655ca8e..e1a8c6a9fafcc 100644 --- a/extensions/git/package.nls.json +++ b/extensions/git/package.nls.json @@ -136,8 +136,6 @@ "config.ignoreLimitWarning": "Ignores the warning when there are too many changes in a repository.", "config.ignoreRebaseWarning": "Ignores the warning when it looks like the branch might have been rebased when pulling.", "config.defaultCloneDirectory": "The default location to clone a git repository.", - "config.useEditorAsCommitInput": "Use an editor to author the commit message.", - "config.verboseCommit": "Enable verbose output when `#git.useEditorAsCommitInput#` is enabled.", "config.enableSmartCommit": "Commit all changes when there are no staged changes.", "config.smartCommitChanges": "Control which changes are automatically staged by Smart Commit.", "config.smartCommitChanges.all": "Automatically stage all changes.", diff --git a/extensions/git/src/api/git.d.ts b/extensions/git/src/api/git.d.ts index e552f03f25d6d..7ba58a0e6073a 100644 --- a/extensions/git/src/api/git.d.ts +++ b/extensions/git/src/api/git.d.ts @@ -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' } diff --git a/extensions/git/src/askpass.ts b/extensions/git/src/askpass.ts index ffbd7e48a0e2b..81895a0e0d6dc 100644 --- a/extensions/git/src/askpass.ts +++ b/extensions/git/src/askpass.ts @@ -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(); private credentialsProviders = new Set(); - constructor(private ipc?: IIPCServer) { + static async create(outputChannelLogger: OutputChannelLogger, context?: string): Promise { + 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); } diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 4ea02b89155dc..e8cd512b6481a 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -1516,14 +1516,6 @@ export class CommandCenter { opts.signoff = true; } - if (config.get('useEditorAsCommitInput')) { - opts.useEditor = true; - - if (config.get('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 { 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('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 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); diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index f87cefbd653b3..a511db761a684 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -1400,37 +1400,20 @@ export class Repository { } async commit(message: string | undefined, opts: CommitOptions = Object.create(null)): Promise { - 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 { diff --git a/extensions/git/src/gitEditor/gitEditor.ts b/extensions/git/src/gitEditor/gitEditor.ts deleted file mode 100644 index 34f8ee9f20fca..0000000000000 --- a/extensions/git/src/gitEditor/gitEditor.ts +++ /dev/null @@ -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 { - 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(); - } -} diff --git a/extensions/git/src/gitEditor/main.ts b/extensions/git/src/gitEditor/main.ts deleted file mode 100644 index 661540e003005..0000000000000 --- a/extensions/git/src/gitEditor/main.ts +++ /dev/null @@ -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); diff --git a/extensions/git/src/gitEditor/scripts/git-editor-empty.bat b/extensions/git/src/gitEditor/scripts/git-editor-empty.bat deleted file mode 100644 index 56eeb8a5801a4..0000000000000 --- a/extensions/git/src/gitEditor/scripts/git-editor-empty.bat +++ /dev/null @@ -1 +0,0 @@ -@ECHO off diff --git a/extensions/git/src/gitEditor/scripts/git-editor-empty.sh b/extensions/git/src/gitEditor/scripts/git-editor-empty.sh deleted file mode 100755 index 1a2485251c33a..0000000000000 --- a/extensions/git/src/gitEditor/scripts/git-editor-empty.sh +++ /dev/null @@ -1 +0,0 @@ -#!/bin/sh diff --git a/extensions/git/src/gitEditor/scripts/git-editor.bat b/extensions/git/src/gitEditor/scripts/git-editor.bat deleted file mode 100644 index ce28807cae149..0000000000000 --- a/extensions/git/src/gitEditor/scripts/git-editor.bat +++ /dev/null @@ -1,4 +0,0 @@ -@ECHO off - -set ELECTRON_RUN_AS_NODE=1 -"%VSCODE_GIT_EDITOR_NODE%" "%VSCODE_GIT_EDITOR_MAIN%" %* diff --git a/extensions/git/src/gitEditor/scripts/git-editor.sh b/extensions/git/src/gitEditor/scripts/git-editor.sh deleted file mode 100755 index f4ba2e4fd73d2..0000000000000 --- a/extensions/git/src/gitEditor/scripts/git-editor.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -ELECTRON_RUN_AS_NODE="1" \ -"$VSCODE_GIT_EDITOR_NODE" "$VSCODE_GIT_EDITOR_MAIN" $@ diff --git a/extensions/git/src/main.ts b/extensions/git/src/main.ts index e5d99158a4ea1..ee60d2cb1b1cc 100644 --- a/extensions/git/src/main.ts +++ b/extensions/git/src/main.ts @@ -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 }[] = []; @@ -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); diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index c6fa51b54971a..69c184209fa88 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -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 { diff --git a/extensions/git/tsconfig.json b/extensions/git/tsconfig.json index 899f8c9c33dcf..13997275056b0 100644 --- a/extensions/git/tsconfig.json +++ b/extensions/git/tsconfig.json @@ -11,9 +11,7 @@ "src/**/*", "../../src/vscode-dts/vscode.d.ts", "../../src/vscode-dts/vscode.proposed.diffCommand.d.ts", - "../../src/vscode-dts/vscode.proposed.resolvers.d.ts", "../../src/vscode-dts/vscode.proposed.scmActionButton.d.ts", - "../../src/vscode-dts/vscode.proposed.scmInput.d.ts", "../../src/vscode-dts/vscode.proposed.scmSelectedProvider.d.ts", "../../src/vscode-dts/vscode.proposed.scmValidation.d.ts", "../../src/vscode-dts/vscode.proposed.tabs.d.ts", diff --git a/src/vs/workbench/contrib/scm/browser/util.ts b/src/vs/workbench/contrib/scm/browser/util.ts index c8f4524d017ba..80d5d19302d5d 100644 --- a/src/vs/workbench/contrib/scm/browser/util.ts +++ b/src/vs/workbench/contrib/scm/browser/util.ts @@ -37,7 +37,7 @@ export function isSCMResource(element: any): element is ISCMResource { return !!(element as ISCMResource).sourceUri && isSCMResourceGroup((element as ISCMResource).resourceGroup); } -const compareActions = (a: IAction, b: IAction) => a.id === b.id && a.enabled === b.enabled; +const compareActions = (a: IAction, b: IAction) => a.id === b.id; export function connectPrimaryMenu(menu: IMenu, callback: (primary: IAction[], secondary: IAction[]) => void, primaryGroup?: string): IDisposable { let cachedDisposable: IDisposable = Disposable.None;