diff --git a/extensions/git/src/commit.ts b/extensions/git/src/commit.ts new file mode 100644 index 00000000000..6d471729774 --- /dev/null +++ b/extensions/git/src/commit.ts @@ -0,0 +1,50 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { workspace, languages, Disposable, Uri, TextDocumentChangeEvent, DiagnosticCollection, Diagnostic, DiagnosticSeverity } from 'vscode'; +import { Model } from './model'; +import { filterEvent } from './util'; +import * as nls from 'vscode-nls'; + +const localize = nls.loadMessageBundle(); + +function isSCMInput(uri: Uri) { + return uri.toString() === 'scm:input'; +} + +// TODO@Joao: prevent these diagnostics from showing in global error/warnings +// TODO@Joao: hover dissapears if editor is scrolled +export class CommitHandler { + + private diagnosticCollection: DiagnosticCollection; + private disposables: Disposable[] = []; + + constructor(private model: Model) { + const onDidChange = filterEvent(workspace.onDidChangeTextDocument, e => e.document && isSCMInput(e.document.uri)); + onDidChange(this.onSCMInputChange, this, this.disposables); + + this.diagnosticCollection = languages.createDiagnosticCollection(localize('git commit message', "Git Commit Message")); + this.disposables.push(this.diagnosticCollection); + } + + private onSCMInputChange(e: TextDocumentChangeEvent): void { + const uri = e.document.uri; + const firstLineRange = e.document.lineAt(0).range; + const firstLineLength = firstLineRange.end.character - firstLineRange.start.character; + + if (firstLineLength > 80) { + const warning = new Diagnostic(firstLineRange, localize('too long', "You should keep the first line under 50 characters.\nYou can use more lines for extra information."), DiagnosticSeverity.Warning); + this.diagnosticCollection.set(uri, [warning]); + } else { + this.diagnosticCollection.clear(); + } + } + + dispose(): void { + this.disposables.forEach(d => d.dispose()); + } +} diff --git a/extensions/git/src/main.ts b/extensions/git/src/main.ts index 1df0364a6ad..a724582c0ed 100644 --- a/extensions/git/src/main.ts +++ b/extensions/git/src/main.ts @@ -15,6 +15,7 @@ import { filterEvent, anyEvent } from './util'; import { GitContentProvider } from './contentProvider'; import { AutoFetcher } from './autofetch'; import { MergeDecorator } from './merge'; +import { CommitHandler } from './commit'; import * as nls from 'vscode-nls'; const localize = nls.config()(); @@ -48,6 +49,7 @@ async function init(disposables: Disposable[]): Promise { const syncStatusBar = new SyncStatusBar(model); const autoFetcher = new AutoFetcher(model); const mergeDecorator = new MergeDecorator(model); + const commitHandler = new CommitHandler(model); disposables.push( commandCenter, @@ -58,7 +60,8 @@ async function init(disposables: Disposable[]): Promise { checkoutStatusBar, syncStatusBar, autoFetcher, - mergeDecorator + mergeDecorator, + commitHandler ); } diff --git a/src/vs/editor/contrib/hover/browser/hover.ts b/src/vs/editor/contrib/hover/browser/hover.ts index b2be03752c8..dc3e994478c 100644 --- a/src/vs/editor/contrib/hover/browser/hover.ts +++ b/src/vs/editor/contrib/hover/browser/hover.ts @@ -24,7 +24,7 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import EditorContextKeys = editorCommon.EditorContextKeys; @editorContribution -class ModesHoverController implements editorCommon.IEditorContribution { +export class ModesHoverController implements editorCommon.IEditorContribution { private static ID = 'editor.contrib.hover'; diff --git a/src/vs/workbench/parts/scm/electron-browser/scmEditor.ts b/src/vs/workbench/parts/scm/electron-browser/scmEditor.ts index 5cfa7c06e42..dda97403401 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmEditor.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmEditor.ts @@ -20,9 +20,9 @@ import { ContextMenuController } from 'vs/editor/contrib/contextmenu/browser/con import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; import { SnippetController } from 'vs/editor/contrib/snippet/common/snippetController'; import { TabCompletionController } from 'vs/editor/contrib/suggest/browser/tabCompletion'; +import { ModesHoverController } from 'vs/editor/contrib/hover/browser/hover'; import { IModelService } from 'vs/editor/common/services/modelService'; import { IThemeService } from 'vs/workbench/services/themes/common/themeService'; -import { append, $ } from 'vs/base/browser/dom'; import URI from 'vs/base/common/uri'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import Event, { Emitter } from 'vs/base/common/event'; @@ -48,6 +48,7 @@ class SCMCodeEditorWidget extends CodeEditorWidget { SuggestController, SnippetController, TabCompletionController, + ModesHoverController ]; }