From 562afeaaad530b5b59219ce9410b8c66056331e5 Mon Sep 17 00:00:00 2001 From: Eric Amodio Date: Tue, 8 Nov 2016 03:38:33 -0500 Subject: [PATCH] Adds `gitlens.diffWithPrevious` command to the explore context menu Adds output channel logging, controlled by the `gitlens.advanced.output.level` setting Removes all debug logging, unless the `gitlens.advanced.output.debug` settings it on --- CHANGELOG.md | 92 +++++++++++++++++ README.md | 92 +---------------- package.json | 166 +++++++++++++++++++------------ src/blameAnnotationProvider.ts | 2 +- src/commands/diffWithPrevious.ts | 9 +- src/commands/diffWithWorking.ts | 7 +- src/commands/showBlame.ts | 3 +- src/commands/showBlameHistory.ts | 3 +- src/commands/showHistory.ts | 5 +- src/commands/toggleBlame.ts | 5 +- src/configuration.ts | 15 ++- src/extension.ts | 7 +- src/git/git.ts | 13 +-- src/gitBlameContentProvider.ts | 7 +- src/gitContentProvider.ts | 7 +- src/gitProvider.ts | 31 ++++-- src/logger.ts | 57 +++++++++++ 17 files changed, 330 insertions(+), 191 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 src/logger.ts diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..7863be5 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,92 @@ +--- +## Release Notes + +### 1.0.0 + + - Adds support for git history (log) + - Adds `gitlens.diffWithPrevious` command to the explore context menu + - Adds output channel logging, controlled by the `gitlens.advanced.output.level` setting + - Changes `gitlens.diffWithPrevious` command to only be line sensitive if blame annotations are visible, otherwise it uses file history + - Changes `gitlens.diffWithWorking` command to only be line sensitive if blame annotations are visible, otherwise it uses file history + - Removes all debug logging, unless the `gitlens.advanced.output.debug` settings it on + - Fixes issue where blame annotations would not be cleared properly when switching between open files + +### 0.5.5 + + - Fixes another off-by-one issue when diffing with caching + +### 0.5.4 + + - Fixes off-by-one issues with blame annotations without caching and when diffing with a previous version + +### 0.5.3 + + - Adds better uncommitted hover message in blame annotations + - Adds more protection for dealing with uncommitted lines + +### 0.5.2 + + - Fixes loading issue on Linux + +### 0.5.1 + + - Adds blame information in the StatusBar + - Add new StatusBar settings -- see **Extension Settings** above for details + - Renames the `gitlens.codeLens.recentChange.command` & `gitlens.codeLens.authors.command` settings options (to align with command names) + - Adds new `gitlens.diffWithPrevious` option to the `gitlens.codeLens.recentChange.command` & `gitlens.codeLens.authors.command` settings + - Fixes Diff with Previous when the selection is uncommitted + - Removes `gitlens.blame.annotation.useCodeActions` setting and behavior + +### 0.3.3 + + - Fixes [#7](https://github.com/eamodio/vscode-gitlens/issues/7) - missing spawn-rx dependency (argh!) + +### 0.3.2 + + - Fixes [#7](https://github.com/eamodio/vscode-gitlens/issues/7) - missing lodash dependency + +### 0.3.1 + + - Adds new CodeLens visibility & location settings -- see **Extension Settings** above for details + - Adds new command to toggle CodeLens on and off when `gitlens.codeLens.visibility` is set to `ondemand` + +### 0.2.0 + + - Fixes [#1](https://github.com/eamodio/vscode-gitlens/issues/1) - Support blame on files outside the workspace repository + - Replaces blame regex parsing with a more robust parser + - Fixes failures with Diff with Previous command + - Fixes issues with blame explorer CodeLens when dealing with previous commits + - Fixes display issues with compact blame annotations (now skips blank lines) + +### 0.1.3 + + - Improved blame annotations, now with sha and author by default + - Add new blame annotation styles -- compact and expanded (default) + - Adds many new configuration settings; see **Extension Settings** above for details + +### 0.0.7 + + - Fixes [#4](https://github.com/eamodio/vscode-gitlens/issues/4) - Absolute paths fail on Windows due to backslash (Really!) + - Fixes [#5](https://github.com/eamodio/vscode-gitlens/issues/5) - Finding first non-white-space fails sometimes + - Adds .gitignore checks to reduce the number of blame calls + +### 0.0.6 + + - Fixes [#2](https://github.com/eamodio/vscode-gitlens/issues/2) - [request] Provide some debug info when things fail + - Fixes [#4](https://github.com/eamodio/vscode-gitlens/issues/4) - Absolute paths fail on Windows due to backslash + - Attempts to scroll to the correct position when opening a diff + +### 0.0.5 + +- Fixes issues where filename changes in history would cause diffs to fails +- Fixes some issues with uncommitted blames +- Removes CodeLens from fields and single-line properties to reduce visual noise +- Automatically turns off blame only when required now + +### 0.0.4 + +Candidate for preview release on the vscode marketplace. + +### 0.0.1 + +Initial release but still heavily a work in progress. \ No newline at end of file diff --git a/README.md b/README.md index 371615c..a0c49d1 100644 --- a/README.md +++ b/README.md @@ -51,94 +51,4 @@ Must be using Git and it must be in your path. - Content in the **Blame history explorer** disappears after a bit: [vscode issue](https://github.com/Microsoft/vscode/issues/11360) - Highlighted lines disappear in **Blame explorer** after changing selection and returning to a previous selection: [vscode issue](https://github.com/Microsoft/vscode/issues/11360) - CodeLens aren't updated properly after a file is saved: [vscode issue](https://github.com/Microsoft/vscode/issues/11546) -- Visible whitespace causes issue with blame overlay (currently fixed with a hack, but fails randomly): [vscode issue](https://github.com/Microsoft/vscode/issues/11485) - ---- -## Release Notes - -### 1.0.0 - - - Adds support for git history (log) - - Changes `gitlens.diffWithPrevious` command to only be line sensitive if blame annotations are visible, otherwise it uses file history - - Changes `gitlens.diffWithWorking` command to only be line sensitive if blame annotations are visible, otherwise it uses file history - - Fixes issue where blame annotations would not be cleared properly when switching between open files - -### 0.5.5 - - - Fixes another off-by-one issue when diffing with caching - -### 0.5.4 - - - Fixes off-by-one issues with blame annotations without caching and when diffing with a previous version - -### 0.5.3 - - - Adds better uncommitted hover message in blame annotations - - Adds more protection for dealing with uncommitted lines - -### 0.5.2 - - - Fixes loading issue on Linux - -### 0.5.1 - - - Adds blame information in the StatusBar - - Add new StatusBar settings -- see **Extension Settings** above for details - - Renames the `gitlens.codeLens.recentChange.command` & `gitlens.codeLens.authors.command` settings options (to align with command names) - - Adds new `gitlens.diffWithPrevious` option to the `gitlens.codeLens.recentChange.command` & `gitlens.codeLens.authors.command` settings - - Fixes Diff with Previous when the selection is uncommitted - - Removes `gitlens.blame.annotation.useCodeActions` setting and behavior - -### 0.3.3 - - - Fixes [#7](https://github.com/eamodio/vscode-gitlens/issues/7) - missing spawn-rx dependency (argh!) - -### 0.3.2 - - - Fixes [#7](https://github.com/eamodio/vscode-gitlens/issues/7) - missing lodash dependency - -### 0.3.1 - - - Adds new CodeLens visibility & location settings -- see **Extension Settings** above for details - - Adds new command to toggle CodeLens on and off when `gitlens.codeLens.visibility` is set to `ondemand` - -### 0.2.0 - - - Fixes [#1](https://github.com/eamodio/vscode-gitlens/issues/1) - Support blame on files outside the workspace repository - - Replaces blame regex parsing with a more robust parser - - Fixes failures with Diff with Previous command - - Fixes issues with blame explorer CodeLens when dealing with previous commits - - Fixes display issues with compact blame annotations (now skips blank lines) - -### 0.1.3 - - - Improved blame annotations, now with sha and author by default - - Add new blame annotation styles -- compact and expanded (default) - - Adds many new configuration settings; see **Extension Settings** above for details - -### 0.0.7 - - - Fixes [#4](https://github.com/eamodio/vscode-gitlens/issues/4) - Absolute paths fail on Windows due to backslash (Really!) - - Fixes [#5](https://github.com/eamodio/vscode-gitlens/issues/5) - Finding first non-white-space fails sometimes - - Adds .gitignore checks to reduce the number of blame calls - -### 0.0.6 - - - Fixes [#2](https://github.com/eamodio/vscode-gitlens/issues/2) - [request] Provide some debug info when things fail - - Fixes [#4](https://github.com/eamodio/vscode-gitlens/issues/4) - Absolute paths fail on Windows due to backslash - - Attempts to scroll to the correct position when opening a diff - -### 0.0.5 - -- Fixes issues where filename changes in history would cause diffs to fails -- Fixes some issues with uncommitted blames -- Removes CodeLens from fields and single-line properties to reduce visual noise -- Automatically turns off blame only when required now - -### 0.0.4 - -Candidate for preview release on the vscode marketplace. - -### 0.0.1 - -Initial release but still heavily a work in progress. \ No newline at end of file +- Visible whitespace causes issue with blame overlay (currently fixed with a hack, but fails randomly): [vscode issue](https://github.com/Microsoft/vscode/issues/11485) \ No newline at end of file diff --git a/package.json b/package.json index 1b41f66..87bc4c4 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ }, "publisher": "eamodio", "engines": { - "vscode": "^1.6.0" + "vscode": "^1.7.0" }, "license": "SEE LICENSE IN LICENSE", "displayName": "GitLens", @@ -16,11 +16,15 @@ "Other" ], "keywords": [ - "git", "blame", "gitblame", "codelens", "annotation" + "git", + "blame", + "gitblame", + "codelens", + "annotation" ], "galleryBanner": { - "color": "#f0efe7", - "theme": "light" + "color": "#56098c", + "theme": "dark" }, "icon": "images/gitlens-icon.png", "preview": false, @@ -143,69 +147,107 @@ "type": "boolean", "default": true, "description": "Specifies whether git blame output will be cached" + }, + "gitlens.advanced.output.debug": { + "type": "boolean", + "default": false, + "description": "Specifies whether all output will be sent to the console" + }, + "gitlens.advanced.output.level": { + "type": "string", + "default": "silent", + "enum": [ + "silent", + "errors", + "verbose" + ], + "description": "Specifies whether how much (if any) output will be sent to the GitLens output channel" } } }, - "commands": [{ - "command": "gitlens.diffWithPrevious", - "title": "Open Diff with Previous Commit", - "category": "GitLens" - }, { - "command": "gitlens.diffWithWorking", - "title": "Open Diff with Working Tree", - "category": "GitLens" - }, { - "command": "gitlens.showBlame", - "title": "Show Git Blame Annotations", - "category": "GitLens" - }, { - "command": "gitlens.toggleBlame", - "title": "Toggle Git Blame Annotations", - "category": "GitLens" - }, { - "command": "gitlens.toggleCodeLens", - "title": "Toggle Git CodeLens", - "category": "GitLens" - }, { - "command": "gitlens.showBlameHistory", - "title": "Open Git Blame History", - "category": "GitLens" - }, { - "command": "gitlens.showHistory", - "title": "Open Git History", - "category": "GitLens" - }], - "menus": { - "editor/title": [{ - "when": "editorTextFocus", - "command": "gitlens.toggleBlame", - "group": "gitlens" - }], - "editor/context": [{ - "when": "editorTextFocus", - "command": "gitlens.diffWithWorking", - "group": "gitlens@1.0" - }, { - "when": "editorTextFocus", + "commands": [ + { "command": "gitlens.diffWithPrevious", - "group": "gitlens@1.1" - }, { - "when": "editorTextFocus", + "title": "Open Diff with Previous Commit", + "category": "GitLens" + }, + { + "command": "gitlens.diffWithWorking", + "title": "Open Diff with Working Tree", + "category": "GitLens" + }, + { + "command": "gitlens.showBlame", + "title": "Show Git Blame Annotations", + "category": "GitLens" + }, + { "command": "gitlens.toggleBlame", - "group": "gitlens-blame@1.2" - }] + "title": "Toggle Git Blame Annotations", + "category": "GitLens" + }, + { + "command": "gitlens.toggleCodeLens", + "title": "Toggle Git CodeLens", + "category": "GitLens" + }, + { + "command": "gitlens.showBlameHistory", + "title": "Open Git Blame History", + "category": "GitLens" + }, + { + "command": "gitlens.showHistory", + "title": "Open Git History", + "category": "GitLens" + } + ], + "menus": { + "explorer/context": [ + { + "command": "gitlens.diffWithPrevious", + "group": "gitlens@1.1" + } + ], + "editor/title": [ + { + "when": "editorTextFocus", + "command": "gitlens.toggleBlame", + "group": "gitlens" + } + ], + "editor/context": [ + { + "when": "editorTextFocus", + "command": "gitlens.diffWithWorking", + "group": "gitlens@1.0" + }, + { + "when": "editorTextFocus", + "command": "gitlens.diffWithPrevious", + "group": "gitlens@1.1" + }, + { + "when": "editorTextFocus", + "command": "gitlens.toggleBlame", + "group": "gitlens-blame@1.2" + } + ] }, - "keybindings": [{ - "command": "gitlens.toggleBlame", - "key": "alt+b", - "mac": "alt+b", - "when": "editorTextFocus" - }, { - "command": "gitlens.toggleCodeLens", - "key": "alt+shift+b", - "mac": "alt+shift+b", - "when": "editorTextFocus" - }] + "keybindings": [ + { + "command": "gitlens.toggleBlame", + "key": "alt+b", + "mac": "alt+b", + "when": "editorTextFocus" + }, + { + "command": "gitlens.toggleCodeLens", + "key": "alt+shift+b", + "mac": "alt+shift+b", + "when": "editorTextFocus" + } + ] }, "activationEvents": [ "*" @@ -222,7 +264,7 @@ "devDependencies": { "mocha": "^3.1.2", "tslint": "^3.15.1", - "typescript": "^2.0.6", + "typescript": "^2.0.8", "vscode": "^1.0.3", "@types/node": "^6.0.46", "@types/mocha": "^2.2.32", diff --git a/src/blameAnnotationProvider.ts b/src/blameAnnotationProvider.ts index 5860b60..cb3f8ce 100644 --- a/src/blameAnnotationProvider.ts +++ b/src/blameAnnotationProvider.ts @@ -1,7 +1,7 @@ 'use strict'; import { Iterables } from './system'; import { commands, DecorationOptions, Disposable, ExtensionContext, OverviewRulerLane, Range, TextDocument, TextEditor, TextEditorDecorationType, TextEditorSelectionChangeEvent, Uri, window, workspace } from 'vscode'; -import { BuiltInCommands} from './constants'; +import { BuiltInCommands } from './constants'; import { BlameAnnotationStyle, IBlameConfig } from './configuration'; import GitProvider, { IGitBlame, IGitCommit } from './gitProvider'; import * as moment from 'moment'; diff --git a/src/commands/diffWithPrevious.ts b/src/commands/diffWithPrevious.ts index 57fc719..82731cc 100644 --- a/src/commands/diffWithPrevious.ts +++ b/src/commands/diffWithPrevious.ts @@ -5,6 +5,7 @@ import { EditorCommand } from './commands'; import { BuiltInCommands, Commands } from '../constants'; import BlameAnnotationController from '../blameAnnotationController'; import GitProvider from '../gitProvider'; +import { Logger } from '../logger'; import * as path from 'path'; export default class DiffWithPreviousCommand extends EditorCommand { @@ -22,7 +23,7 @@ export default class DiffWithPreviousCommand extends EditorCommand { return Promise.all([this.git.getVersionedFile(shaUri.fsPath, repoPath, sha), this.git.getVersionedFile(compareWithUri.fsPath, repoPath, compareWithSha)]) .then(values => commands.executeCommand(BuiltInCommands.Diff, Uri.file(values[1]), Uri.file(values[0]), `${path.basename(compareWithUri.fsPath)} (${compareWithSha}) ↔ ${path.basename(shaUri.fsPath)} (${sha})`)) .then(() => commands.executeCommand(BuiltInCommands.RevealLine, { lineNumber: line, at: 'center' })) - .catch(ex => console.error('[GitLens.DiffWithPreviousCommand]', 'getVersionedFile', ex)); + .catch(ex => Logger.error('[GitLens.DiffWithPreviousCommand]', 'getVersionedFile', ex)); } if (!(uri instanceof Uri)) { @@ -46,13 +47,13 @@ export default class DiffWithPreviousCommand extends EditorCommand { return commands.executeCommand(Commands.DiffWithPrevious, commit.previousUri, commit.repoPath, commit.previousSha, commit.previousUri, prevCommit.sha, prevCommit.uri, blame.line.originalLine); } catch (ex) { - console.error('[GitLens.DiffWithPreviousCommand]', `getBlameForLine(${blame.line.originalLine}, ${commit.previousSha})`, ex); + Logger.error('[GitLens.DiffWithPreviousCommand]', `getBlameForLine(${blame.line.originalLine}, ${commit.previousSha})`, ex); } } return commands.executeCommand(Commands.DiffWithPrevious, commit.uri, commit.repoPath, commit.sha, commit.uri, commit.previousSha, commit.previousUri, line); } catch (ex) { - console.error('[GitLens.DiffWithPreviousCommand]', `getBlameForLine(${line})`, ex); + Logger.error('[GitLens.DiffWithPreviousCommand]', `getBlameForLine(${line})`, ex); } } else { @@ -66,7 +67,7 @@ export default class DiffWithPreviousCommand extends EditorCommand { return commands.executeCommand(Commands.DiffWithPrevious, commit.uri, commit.repoPath, commit.sha, commit.uri, prevCommit.sha, prevCommit.uri, line); } catch (ex) { - console.error('[GitLens.DiffWithPreviousCommand]', `getLogForFile(${uri.fsPath})`, ex); + Logger.error('[GitLens.DiffWithPreviousCommand]', `getLogForFile(${uri.fsPath})`, ex); } } } diff --git a/src/commands/diffWithWorking.ts b/src/commands/diffWithWorking.ts index 9908b37..61a4b90 100644 --- a/src/commands/diffWithWorking.ts +++ b/src/commands/diffWithWorking.ts @@ -5,6 +5,7 @@ import { EditorCommand } from './commands'; import { BuiltInCommands, Commands } from '../constants'; import BlameAnnotationController from '../blameAnnotationController'; import GitProvider from '../gitProvider'; +import { Logger } from '../logger'; import * as path from 'path'; export default class DiffWithWorkingCommand extends EditorCommand { @@ -18,7 +19,7 @@ export default class DiffWithWorkingCommand extends EditorCommand { return this.git.getVersionedFile(shaUri.fsPath, repoPath, sha) .then(compare => commands.executeCommand(BuiltInCommands.Diff, Uri.file(compare), uri, `${path.basename(shaUri.fsPath)} (${sha}) ↔ ${path.basename(uri.fsPath)}`)) .then(() => commands.executeCommand(BuiltInCommands.RevealLine, { lineNumber: line, at: 'center' })) - .catch(ex => console.error('[GitLens.DiffWithWorkingCommand]', 'getVersionedFile', ex)); + .catch(ex => Logger.error('[GitLens.DiffWithWorkingCommand]', 'getVersionedFile', ex)); } if (!(uri instanceof Uri)) { @@ -39,7 +40,7 @@ export default class DiffWithWorkingCommand extends EditorCommand { return commands.executeCommand(Commands.DiffWithWorking, commit.uri, commit.repoPath, commit.sha, commit.uri, line); } catch (ex) { - console.error('[GitLens.DiffWithWorkingCommand]', `getBlameForLine(${line})`, ex); + Logger.error('[GitLens.DiffWithWorkingCommand]', `getBlameForLine(${line})`, ex); } } else { @@ -51,7 +52,7 @@ export default class DiffWithWorkingCommand extends EditorCommand { return commands.executeCommand(Commands.DiffWithWorking, commit.uri, commit.repoPath, commit.sha, commit.uri, line); } catch (ex) { - console.error('[GitLens.DiffWithPreviousCommand]', `getLogForFile(${uri.fsPath})`, ex); + Logger.error('[GitLens.DiffWithPreviousCommand]', `getLogForFile(${uri.fsPath})`, ex); } } } diff --git a/src/commands/showBlame.ts b/src/commands/showBlame.ts index bb4e46a..a6b94ec 100644 --- a/src/commands/showBlame.ts +++ b/src/commands/showBlame.ts @@ -4,6 +4,7 @@ import BlameAnnotationController from '../blameAnnotationController'; import { EditorCommand } from './commands'; import { Commands } from '../constants'; import GitProvider from '../gitProvider'; +import { Logger } from '../logger'; export default class ShowBlameCommand extends EditorCommand { constructor(private git: GitProvider, private annotationController: BlameAnnotationController) { @@ -25,7 +26,7 @@ export default class ShowBlameCommand extends EditorCommand { this.annotationController.showBlameAnnotation(editor, blame && blame.commit.sha); } catch (ex) { - console.error('[GitLens.ShowBlameCommand]', `getBlameForLine(${editor.selection.active.line})`, ex); + Logger.error('[GitLens.ShowBlameCommand]', `getBlameForLine(${editor.selection.active.line})`, ex); } } } \ No newline at end of file diff --git a/src/commands/showBlameHistory.ts b/src/commands/showBlameHistory.ts index e86b7b6..9dd259e 100644 --- a/src/commands/showBlameHistory.ts +++ b/src/commands/showBlameHistory.ts @@ -3,6 +3,7 @@ import { commands, Position, Range, TextEditor, TextEditorEdit, Uri } from 'vsco import { EditorCommand } from './commands'; import { BuiltInCommands, Commands } from '../constants'; import GitProvider from '../gitProvider'; +import { Logger } from '../logger'; export default class ShowBlameHistoryCommand extends EditorCommand { constructor(private git: GitProvider) { @@ -24,7 +25,7 @@ export default class ShowBlameHistoryCommand extends EditorCommand { return commands.executeCommand(BuiltInCommands.ShowReferences, uri, position, locations); } catch (ex) { - console.error('[GitLens.ShowBlameHistoryCommand]', 'getBlameLocations', ex); + Logger.error('[GitLens.ShowBlameHistoryCommand]', 'getBlameLocations', ex); } } } \ No newline at end of file diff --git a/src/commands/showHistory.ts b/src/commands/showHistory.ts index 6b72bcf..37397ce 100644 --- a/src/commands/showHistory.ts +++ b/src/commands/showHistory.ts @@ -1,8 +1,9 @@ 'use strict'; import { commands, Position, Range, TextEditor, TextEditorEdit, Uri } from 'vscode'; -import { EditorCommand} from './commands'; +import { EditorCommand } from './commands'; import { BuiltInCommands, Commands } from '../constants'; import GitProvider from '../gitProvider'; +import { Logger } from '../logger'; export default class ShowHistoryCommand extends EditorCommand { constructor(private git: GitProvider) { @@ -23,7 +24,7 @@ export default class ShowHistoryCommand extends EditorCommand { return commands.executeCommand(BuiltInCommands.ShowReferences, uri, position, locations); } catch (ex) { - console.error('[GitLens.ShowHistoryCommand]', 'getLogLocations', ex); + Logger.error('[GitLens.ShowHistoryCommand]', 'getLogLocations', ex); } } } \ No newline at end of file diff --git a/src/commands/toggleBlame.ts b/src/commands/toggleBlame.ts index 4c622e8..7c1a3c8 100644 --- a/src/commands/toggleBlame.ts +++ b/src/commands/toggleBlame.ts @@ -4,8 +4,9 @@ import BlameAnnotationController from '../blameAnnotationController'; import { EditorCommand } from './commands'; import { Commands } from '../constants'; import GitProvider from '../gitProvider'; +import { Logger } from '../logger'; -export default class ToggleBlameCommand extends EditorCommand { +export default class ToggleBlameCommand extends EditorCommand { constructor(private git: GitProvider, private annotationController: BlameAnnotationController) { super(Commands.ToggleBlame); } @@ -25,7 +26,7 @@ export default class ToggleBlameCommand extends EditorCommand { this.annotationController.toggleBlameAnnotation(editor, blame && blame.commit.sha); } catch (ex) { - console.error('[GitLens.ToggleBlameCommand]', `getBlameForLine(${editor.selection.active.line})`, ex); + Logger.error('[GitLens.ToggleBlameCommand]', `getBlameForLine(${editor.selection.active.line})`, ex); } } } \ No newline at end of file diff --git a/src/configuration.ts b/src/configuration.ts index 5918c49..4bde0b7 100644 --- a/src/configuration.ts +++ b/src/configuration.ts @@ -1,5 +1,5 @@ 'use strict'; -import {Commands} from './constants'; +import { Commands } from './constants'; export type BlameAnnotationStyle = 'compact' | 'expanded'; export const BlameAnnotationStyle = { @@ -66,9 +66,20 @@ export interface IStatusBarConfig { command: StatusBarCommand; } +export type OutputLevel = 'silent' | 'errors' | 'verbose'; +export const OutputLevel = { + Silent: 'silent' as OutputLevel, + Errors: 'errors' as OutputLevel, + Verbose: 'verbose' as OutputLevel +}; + export interface IAdvancedConfig { caching: { - enabled: boolean + enabled: boolean; + }; + output: { + debug: boolean; + level: OutputLevel; }; } diff --git a/src/extension.ts b/src/extension.ts index ac4b4f6..57669ee 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -14,18 +14,19 @@ import ShowBlameHistoryCommand from './commands/showBlameHistory'; import ShowHistoryCommand from './commands/showHistory'; import ToggleBlameCommand from './commands/toggleBlame'; import ToggleCodeLensCommand from './commands/toggleCodeLens'; +import { Logger } from './logger'; // this method is called when your extension is activated export function activate(context: ExtensionContext) { // Workspace not using a folder. No access to git repo. if (!workspace.rootPath) { - console.warn('GitLens inactive: no rootPath'); + Logger.warn('GitLens inactive: no rootPath'); return; } const rootPath = workspace.rootPath.replace(/\\/g, '/'); - console.log(`GitLens active: ${rootPath}`); + Logger.log(`GitLens active: ${rootPath}`); Git.repoPath(rootPath).then(repoPath => { context.workspaceState.update(WorkspaceState.RepoPath, repoPath); @@ -52,7 +53,7 @@ export function activate(context: ExtensionContext) { context.subscriptions.push(new ShowBlameHistoryCommand(git)); context.subscriptions.push(new ShowHistoryCommand(git)); context.subscriptions.push(new ToggleCodeLensCommand(git)); - }).catch(reason => console.warn('[GitLens]', reason)); + }).catch(reason => Logger.warn(reason)); } // this method is called when your extension is deactivated diff --git a/src/git/git.ts b/src/git/git.ts index 7f379ad..2c7bf20 100644 --- a/src/git/git.ts +++ b/src/git/git.ts @@ -3,6 +3,7 @@ import * as fs from 'fs'; import * as path from 'path'; import * as tmp from 'tmp'; import { spawnPromise } from 'spawn-rx'; +import { Logger } from '../logger'; export * from './gitEnrichment'; export * from './enrichers/blameParserEnricher'; @@ -10,18 +11,18 @@ export * from './enrichers/logParserEnricher'; const UncommittedRegex = /^[0]+$/; -async function gitCommand(cwd: string, ...args: any[]) { +async function gitCommand(cwd: string, ...args: any[]) { try { const s = await spawnPromise('git', args, { cwd: cwd }); - console.log('[GitLens]', 'git', ...args, cwd); + Logger.log('git', ...args, cwd); return s; } catch (ex) { const msg = ex && ex.toString(); if (msg && (msg.includes('is outside repository') || msg.includes('no such path'))) { - console.warn('[GitLens]', 'git', ...args, cwd, msg && msg.replace(/\r?\n|\r/g, ' ')); + Logger.warn('git', ...args, cwd, msg && msg.replace(/\r?\n|\r/g, ' ')); } else { - console.error('[GitLens]', 'git', ...args, cwd, msg && msg.replace(/\r?\n|\r/g, ' ')); + Logger.error('git', ...args, cwd, msg && msg.replace(/\r?\n|\r/g, ' ')); } throw ex; } @@ -41,7 +42,7 @@ export default class Git { static splitPath(fileName: string, repoPath?: string): [string, string] { // if (!path.isAbsolute(fileName)) { - // console.error('[GitLens]', `Git.splitPath(${fileName}) is not an absolute path!`); + // Logger.error(`Git.splitPath(${fileName}) is not an absolute path!`); // debugger; // } if (repoPath) { @@ -89,7 +90,7 @@ export default class Git { return; } - //console.log(`getVersionedFile(${fileName}, ${sha}); destination=${destination}`); + //Logger.log(`getVersionedFile(${fileName}, ${sha}); destination=${destination}`); fs.appendFile(destination, data, err => { if (err) { reject(err); diff --git a/src/gitBlameContentProvider.ts b/src/gitBlameContentProvider.ts index c3f21bb..bc2031b 100644 --- a/src/gitBlameContentProvider.ts +++ b/src/gitBlameContentProvider.ts @@ -1,7 +1,8 @@ 'use strict'; import { EventEmitter, ExtensionContext, OverviewRulerLane, Range, TextEditor, TextEditorDecorationType, TextDocumentContentProvider, Uri, window } from 'vscode'; import { DocumentSchemes } from './constants'; -import GitProvider, {IGitBlameUriData} from './gitProvider'; +import GitProvider, { IGitBlameUriData } from './gitProvider'; +import { Logger } from './logger'; import * as moment from 'moment'; export default class GitBlameContentProvider implements TextDocumentContentProvider { @@ -29,7 +30,7 @@ export default class GitBlameContentProvider implements TextDocumentContentProvi }); //this._subscriptions = Disposable.from( - // window.onDidChangeActiveTextEditor(e => e ? console.log(e.document.uri) : console.log('active missing')), + // window.onDidChangeActiveTextEditor(e => e ? Logger.log(e.document.uri) : Logger.log('active missing')), //); } @@ -63,7 +64,7 @@ export default class GitBlameContentProvider implements TextDocumentContentProvi return text; }) - .catch(ex => console.error('[GitLens.GitBlameContentProvider]', 'getVersionedFileText', ex)); + .catch(ex => Logger.error('[GitLens.GitBlameContentProvider]', 'getVersionedFileText', ex)); // return this.git.getVersionedFile(data.fileName, data.sha).then(dst => { // let uri = Uri.parse(`file:${dst}`) diff --git a/src/gitContentProvider.ts b/src/gitContentProvider.ts index c37982a..3af63a2 100644 --- a/src/gitContentProvider.ts +++ b/src/gitContentProvider.ts @@ -1,7 +1,8 @@ 'use strict'; -import {ExtensionContext, TextDocumentContentProvider, Uri} from 'vscode'; -import {DocumentSchemes} from './constants'; +import { ExtensionContext, TextDocumentContentProvider, Uri } from 'vscode'; +import { DocumentSchemes } from './constants'; import GitProvider from './gitProvider'; +import { Logger } from './logger'; export default class GitContentProvider implements TextDocumentContentProvider { static scheme = DocumentSchemes.Git; @@ -12,6 +13,6 @@ export default class GitContentProvider implements TextDocumentContentProvider { const data = GitProvider.fromGitUri(uri); return this.git.getVersionedFileText(data.originalFileName || data.fileName, data.repoPath, data.sha) .then(text => data.decoration ? `${data.decoration}\n${text}` : text) - .catch(ex => console.error('[GitLens.GitContentProvider]', 'getVersionedFileText', ex)); + .catch(ex => Logger.error('[GitLens.GitContentProvider]', 'getVersionedFileText', ex)); } } \ No newline at end of file diff --git a/src/gitProvider.ts b/src/gitProvider.ts index c8b4dd2..dd2315c 100644 --- a/src/gitProvider.ts +++ b/src/gitProvider.ts @@ -5,6 +5,7 @@ import { DocumentSchemes, WorkspaceState } from './constants'; import { CodeLensVisibility, IConfig } from './configuration'; import GitCodeLensProvider from './gitCodeLensProvider'; import Git, { GitBlameParserEnricher, GitBlameFormat, GitCommit, GitLogParserEnricher, IGitAuthor, IGitBlame, IGitBlameCommitLines, IGitBlameLine, IGitBlameLines, IGitCommit, IGitLog } from './git/git'; +import { Logger } from './logger'; import * as fs from 'fs'; import * as ignore from 'ignore'; import * as moment from 'moment'; @@ -149,7 +150,7 @@ export default class GitProvider extends Disposable { } if (this._cache.delete(cacheKey)) { - console.log('[GitLens]', `Clear cache entry: cacheKey=${cacheKey}, reason=${RemoveCacheReason[reason]}`); + Logger.log(`Clear cache entry for '${cacheKey}', reason=${RemoveCacheReason[reason]}`); // if (reason === RemoveCacheReason.DocumentSaved) { // // TODO: Killing the code lens provider is too drastic -- makes the editor jump around, need to figure out how to trigger a refresh @@ -163,6 +164,7 @@ export default class GitProvider extends Disposable { } async getBlameForFile(fileName: string): Promise { + Logger.log(`getBlameForFile('${fileName}')`); fileName = Git.normalizePath(fileName); const cacheKey = this._getCacheEntryKey(fileName); @@ -178,7 +180,7 @@ export default class GitProvider extends Disposable { const ignore = await this._gitignore; let blame: Promise; if (ignore && !ignore.filter([fileName]).length) { - console.log('[GitLens]', `Skipping blame; ${fileName} is gitignored`); + Logger.log(`Skipping blame; '${fileName}' is gitignored`); blame = GitProvider.EmptyPromise; } else { @@ -188,7 +190,7 @@ export default class GitProvider extends Disposable { // Trap and cache expected blame errors if (this.UseCaching) { const msg = ex && ex.toString(); - console.log('[GitLens]', `Replace blame cache: cacheKey=${cacheKey}`); + Logger.log(`Replace blame cache with empty promise for '${cacheKey}'`); entry.blame = { //date: new Date(), @@ -204,7 +206,7 @@ export default class GitProvider extends Disposable { } if (this.UseCaching) { - console.log('[GitLens]', `Add blame cache: cacheKey=${cacheKey}`); + Logger.log(`Add ${(blame === GitProvider.EmptyPromise ? 'empty promise to ' : '')}blame cache for '${cacheKey}'`); entry.blame = { //date: new Date(), @@ -218,6 +220,8 @@ export default class GitProvider extends Disposable { } async getBlameForLine(fileName: string, line: number, sha?: string, repoPath?: string): Promise { + Logger.log(`getBlameForLine('${fileName}', ${line}, ${sha}, ${repoPath})`); + if (this.UseCaching && !sha) { const blame = await this.getBlameForFile(fileName); const blameLine = blame && blame.lines[line]; @@ -254,6 +258,8 @@ export default class GitProvider extends Disposable { } async getBlameForRange(fileName: string, range: Range): Promise { + Logger.log(`getBlameForRange('${fileName}', ${range})`); + const blame = await this.getBlameForFile(fileName); if (!blame) return null; @@ -302,6 +308,8 @@ export default class GitProvider extends Disposable { } async getBlameForShaRange(fileName: string, sha: string, range: Range): Promise { + Logger.log(`getBlameForShaRange('${fileName}', ${sha}, ${range})`); + const blame = await this.getBlameForFile(fileName); if (!blame) return null; @@ -317,6 +325,8 @@ export default class GitProvider extends Disposable { } async getBlameLocations(fileName: string, range: Range): Promise { + Logger.log(`getBlameForShaRange('${fileName}', ${range})`); + const blame = await this.getBlameForRange(fileName, range); if (!blame) return null; @@ -337,6 +347,7 @@ export default class GitProvider extends Disposable { } async getLogForFile(fileName: string) { + Logger.log(`getLogForFile('${fileName}')`); fileName = Git.normalizePath(fileName); const cacheKey = this._getCacheEntryKey(fileName); @@ -352,7 +363,7 @@ export default class GitProvider extends Disposable { const ignore = await this._gitignore; let log: Promise; if (ignore && !ignore.filter([fileName]).length) { - console.log('[GitLens]', `Skipping log; ${fileName} is gitignored`); + Logger.log(`Skipping log; '${fileName}' is gitignored`); log = GitProvider.EmptyPromise; } else { @@ -362,7 +373,7 @@ export default class GitProvider extends Disposable { // Trap and cache expected blame errors if (this.UseCaching) { const msg = ex && ex.toString(); - console.log('[GitLens]', `Replace log cache: cacheKey=${cacheKey}`); + Logger.log(`Replace log cache with empty promise for '${cacheKey}'`); entry.log = { //date: new Date(), @@ -378,7 +389,7 @@ export default class GitProvider extends Disposable { } if (this.UseCaching) { - console.log('[GitLens]', `Add log cache: cacheKey=${cacheKey}`); + Logger.log(`Add ${(log === GitProvider.EmptyPromise ? 'empty promise to ' : '')}log cache for '${cacheKey}'`); entry.log = { //date: new Date(), @@ -392,6 +403,8 @@ export default class GitProvider extends Disposable { } async getLogLocations(fileName: string): Promise { + Logger.log(`getLogLocations('${fileName}')`); + const log = await this.getLogForFile(fileName); if (!log) return null; @@ -412,14 +425,18 @@ export default class GitProvider extends Disposable { } getVersionedFile(fileName: string, repoPath: string, sha: string) { + Logger.log(`getVersionedFile('${fileName}', ${repoPath}, ${sha})`); return Git.getVersionedFile(fileName, repoPath, sha); } getVersionedFileText(fileName: string, repoPath: string, sha: string) { + Logger.log(`getVersionedFileText('${fileName}', ${repoPath}, ${sha})`); return Git.getVersionedFileText(fileName, repoPath, sha); } toggleCodeLens(editor: TextEditor) { + Logger.log(`toggleCodeLens(${editor})`); + if (this._config.codeLens.visibility !== CodeLensVisibility.OnDemand || (!this._config.codeLens.recentChange.enabled && !this._config.codeLens.authors.enabled)) return; diff --git a/src/logger.ts b/src/logger.ts new file mode 100644 index 0000000..6bb39fc --- /dev/null +++ b/src/logger.ts @@ -0,0 +1,57 @@ +'use strict'; +import { Objects } from './system'; +import { OutputChannel, window, workspace } from 'vscode'; +import { IAdvancedConfig, OutputLevel } from './configuration'; + +let config: IAdvancedConfig; +let output: OutputChannel; + +workspace.onDidChangeConfiguration(onConfigurationChange); +onConfigurationChange(); + +function onConfigurationChange() { + const cfg = workspace.getConfiguration('gitlens').get('advanced'); + + if (!Objects.areEquivalent(cfg.output, config && config.output)) { + if (cfg.output.level === OutputLevel.Silent) { + output && output.dispose(); + } + else if (!output) { + output = window.createOutputChannel('GitLens'); + } + } + + config = cfg; +} + +export class Logger { + static log(message?: any, ...params: any[]): void { + if (config.output.debug) { + console.log('[GitLens]', message, ...params); + } + + if (config.output.level === OutputLevel.Verbose) { + output.appendLine([message, ...params].join(' ')); + } + } + + static error(message?: any, ...params: any[]): void { + if (config.output.debug) { + console.error('[GitLens]', message, ...params); + } + + if (config.output.level !== OutputLevel.Silent) { + output.appendLine([message, ...params].join(' ')); + } + } + + static warn(message?: any, ...params: any[]): void { + if (config.output.debug) { + console.warn('[GitLens]', message, ...params); + } + + if (config.output.level !== OutputLevel.Silent) { + output.appendLine([message, ...params].join(' ')); + } + } +}