From 945085a37585cdfa2d871dd750efcc13d5bf152c Mon Sep 17 00:00:00 2001 From: Alex Corre Date: Sat, 6 Sep 2014 13:28:25 -0700 Subject: [PATCH 01/10] add in bound callback for Editor 'screen-lines-changed' event --- lib/views/blame-list-view.coffee | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/lib/views/blame-list-view.coffee b/lib/views/blame-list-view.coffee index 7b78815..d1537bf 100644 --- a/lib/views/blame-list-view.coffee +++ b/lib/views/blame-list-view.coffee @@ -110,12 +110,6 @@ BlameListView = React.createClass else "translate(0px, #{-scrollTop}px)" - componentWillMount: -> - # kick off async request for blame data - @loadBlame() - @editor().on 'contents-modified', @contentsModified - @editor().buffer.on 'saved', @saved - loadBlame: -> @setState loading: true @props.projectBlamer.blame @editor().getPath(), (err, data) => @@ -131,14 +125,21 @@ BlameListView = React.createClass dirty: false annotations: data + # bound callback for Editor 'contents-modified' event contentsModified: -> return unless @isMounted() @setState dirty: true unless @state.dirty + # bound callback for Editor.buffer 'saved' event saved: -> return unless @isMounted() @loadBlame() if @state.visible and @state.dirty + # bound callback for Editor 'screen-lines-changed' event + screenLinesChanged: -> + console.log 'screen-lines-changed!' + return + toggle: -> if @state.visible @setState visible: false @@ -151,9 +152,17 @@ BlameListView = React.createClass # blame gutter. @scrollbar().on 'scroll', @matchScrollPosition + componentWillMount: -> + # kick off async request for blame data + @loadBlame() + @editor().on 'contents-modified', @contentsModified + @editor().on 'screen-lines-changed', @screenLinesChanged + @editor().buffer.on 'saved', @saved + componentWillUnmount: -> @scrollbar().off 'scroll', @matchScrollPosition @editor().off 'contents-modified', @contentsModified + @editor().off 'screen-lines-changed', @screenLinesChanged @editor().buffer.off 'saved', @saved # Makes the view arguments scroll position match the target elements scroll From e58ac38ef563a16d8bfcfa0d870e4290edf595d7 Mon Sep 17 00:00:00 2001 From: Alex Corre Date: Sat, 6 Sep 2014 16:00:06 -0700 Subject: [PATCH 02/10] add code folding support to blame --- lib/views/blame-list-view.coffee | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/lib/views/blame-list-view.coffee b/lib/views/blame-list-view.coffee index d1537bf..9f9edf6 100644 --- a/lib/views/blame-list-view.coffee +++ b/lib/views/blame-list-view.coffee @@ -119,12 +119,34 @@ BlameListView = React.createClass error: true dirty: false else + data = @prepareDataForCurrentEditorState(data) @setState loading: false error: false dirty: false annotations: data + # Modifies the blame data for the current editor state, taking + # folds into account. + # TODO: Handle soft wraps here as well + prepareDataForCurrentEditorState: (originalData) -> + filteredLineData = [] + highestScreenRowSeen = 0 + e = @editor() + + # loop through the blame data and filter out the blame line rows + # for lines that are not visible on the screen due to wrapped code + # TODO: Handle soft wraps here. + # Using each instead of _.filter() since I will need to add empty rows + # for line wraps + _.each originalData, (lineData, index) -> + screenRow = e.screenPositionForBufferPosition([index, 0]).row + if screenRow == index or screenRow > highestScreenRowSeen + filteredLineData.push lineData + highestScreenRowSeen = screenRow + + return filteredLineData + # bound callback for Editor 'contents-modified' event contentsModified: -> return unless @isMounted() @@ -137,8 +159,9 @@ BlameListView = React.createClass # bound callback for Editor 'screen-lines-changed' event screenLinesChanged: -> - console.log 'screen-lines-changed!' - return + return unless @isMounted() + @loadBlame() if @state.visible + @matchScrollPosition() toggle: -> if @state.visible From 81e37120d65354e4768b01c13c8ef77c22da0ef3 Mon Sep 17 00:00:00 2001 From: Alex Corre Date: Sun, 7 Sep 2014 12:31:10 -0700 Subject: [PATCH 03/10] update blame-list-view to use forceUpdate() on screen-lines-changed --- lib/controllers/blameViewController.js | 1 - lib/views/blame-list-view.coffee | 23 +++++++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/lib/controllers/blameViewController.js b/lib/controllers/blameViewController.js index a988bc9..f11667d 100644 --- a/lib/controllers/blameViewController.js +++ b/lib/controllers/blameViewController.js @@ -43,7 +43,6 @@ function toggleBlame(projectBlamer) { } } - // EXPORTS module.exports = { toggleBlame: toggleBlame diff --git a/lib/views/blame-list-view.coffee b/lib/views/blame-list-view.coffee index 9f9edf6..ccc5e9f 100644 --- a/lib/views/blame-list-view.coffee +++ b/lib/views/blame-list-view.coffee @@ -13,11 +13,14 @@ BlameListLinesComponent = React.createClass initialLineCount: RP.number.isRequired remoteRevision: RP.object.isRequired + # Renders the loading gutter. Should be shown while blame command + # line async process is happening, i.e. when @props.loading is true renderLoading: -> lines = [0...@props.initialLineCount].map renderLoading div null, lines - # makes background color alternate by commit + # Helper that makes background color of BlameLineComponent + # alternate by commit _addAlternatingBackgroundColor: (lines) -> bgClass = null lastHash = null @@ -34,6 +37,7 @@ BlameListLinesComponent = React.createClass lastHash = line.hash lines + # Renders list of BlameLineComponents to show the user useful git-blame data renderLoaded: -> # clone so it can be modified lines = _.clone @props.annotations @@ -79,6 +83,7 @@ BlameListView = React.createClass render: -> display = if @state.visible then 'inline-block' else 'none' + preparedAnnotations = @prepareAnnotationsForCurrentEditorState @state.annotations body = if @state.error div "Sorry, an error occurred." # TODO: make this better @@ -89,7 +94,7 @@ BlameListView = React.createClass className: 'blame-lines' style: WebkitTransform: @getTransform() BlameListLinesComponent - annotations: @state.annotations + annotations: preparedAnnotations loading: @state.loading dirty: @state.dirty initialLineCount: @editor().getLineCount() @@ -119,7 +124,6 @@ BlameListView = React.createClass error: true dirty: false else - data = @prepareDataForCurrentEditorState(data) @setState loading: false error: false @@ -129,17 +133,19 @@ BlameListView = React.createClass # Modifies the blame data for the current editor state, taking # folds into account. # TODO: Handle soft wraps here as well - prepareDataForCurrentEditorState: (originalData) -> + prepareAnnotationsForCurrentEditorState: (annotations) -> + return unless annotations + filteredLineData = [] highestScreenRowSeen = 0 e = @editor() # loop through the blame data and filter out the blame line rows - # for lines that are not visible on the screen due to wrapped code + # for lines that are not visible on the screen due to folded code # TODO: Handle soft wraps here. # Using each instead of _.filter() since I will need to add empty rows # for line wraps - _.each originalData, (lineData, index) -> + for lineData, index in annotations screenRow = e.screenPositionForBufferPosition([index, 0]).row if screenRow == index or screenRow > highestScreenRowSeen filteredLineData.push lineData @@ -157,10 +163,11 @@ BlameListView = React.createClass return unless @isMounted() @loadBlame() if @state.visible and @state.dirty - # bound callback for Editor 'screen-lines-changed' event + # bound callback for Editor 'screen-lines-changed' event. Force a + # re-render with current data. screenLinesChanged: -> return unless @isMounted() - @loadBlame() if @state.visible + @forceUpdate() @matchScrollPosition() toggle: -> From da44d0000e36cd86e4ec096c67c5720d01327c75 Mon Sep 17 00:00:00 2001 From: Alex Corre Date: Sun, 14 Sep 2014 11:04:29 -0700 Subject: [PATCH 04/10] use new event bindings. folding now works except scroll position off sometimes --- lib/views/blame-list-view.coffee | 54 ++++++++++++++++++++------------ package.json | 2 +- 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/lib/views/blame-list-view.coffee b/lib/views/blame-list-view.coffee index ccc5e9f..9bd6c96 100644 --- a/lib/views/blame-list-view.coffee +++ b/lib/views/blame-list-view.coffee @@ -53,10 +53,6 @@ BlameListLinesComponent = React.createClass else @renderLoaded() - shouldComponentUpdate: ({loading, dirty}) -> - finishedInitialLoad = @props.loading and not loading and not @props.dirty - finishedEdit = @props.dirty and not dirty - finishedInitialLoad or finishedEdit BlameListView = React.createClass propTypes: @@ -64,6 +60,9 @@ BlameListView = React.createClass remoteRevision: RP.object.isRequired editorView: RP.object.isRequired + # an array of event binding Disposable objects used for unbinding + eventBindingDisposables: [] + getInitialState: -> { # TODO: get this from the parent component somehow? @@ -97,7 +96,7 @@ BlameListView = React.createClass annotations: preparedAnnotations loading: @state.loading dirty: @state.dirty - initialLineCount: @editor().getLineCount() + initialLineCount: preparedAnnotations.length remoteRevision: @props.remoteRevision div className: 'git-blame' @@ -134,7 +133,7 @@ BlameListView = React.createClass # folds into account. # TODO: Handle soft wraps here as well prepareAnnotationsForCurrentEditorState: (annotations) -> - return unless annotations + return [] unless annotations filteredLineData = [] highestScreenRowSeen = 0 @@ -143,8 +142,6 @@ BlameListView = React.createClass # loop through the blame data and filter out the blame line rows # for lines that are not visible on the screen due to folded code # TODO: Handle soft wraps here. - # Using each instead of _.filter() since I will need to add empty rows - # for line wraps for lineData, index in annotations screenRow = e.screenPositionForBufferPosition([index, 0]).row if screenRow == index or screenRow > highestScreenRowSeen @@ -163,12 +160,14 @@ BlameListView = React.createClass return unless @isMounted() @loadBlame() if @state.visible and @state.dirty - # bound callback for Editor 'screen-lines-changed' event. Force a - # re-render with current data. - screenLinesChanged: -> + # bound callback for Editor 'screen-lines-changed' event. This happens quite + # often while editing, so we calla debounced method to force a re-render with + # current data. This is the only way to know when code is folded / unfolded, + # but its also called whenever new lines are added / while editing. + onScreenLinesChanged: (e) -> return unless @isMounted() @forceUpdate() - @matchScrollPosition() + # @matchScrollPosition() toggle: -> if @state.visible @@ -185,21 +184,32 @@ BlameListView = React.createClass componentWillMount: -> # kick off async request for blame data @loadBlame() - @editor().on 'contents-modified', @contentsModified - @editor().on 'screen-lines-changed', @screenLinesChanged - @editor().buffer.on 'saved', @saved + + # bind to published events + @eventBindingDisposables.push @editor().onDidStopChanging(@contentsModified) + @eventBindingDisposables.push @editor().buffer.onDidSave(@saved) + + # bind to internal events + @editor().on 'screen-lines-changed', @onScreenLinesChanged componentWillUnmount: -> + # unbind published events + for disposable in @eventBindingDisposables + disposable.dispose() + + # unbind internal events + @editor().off 'screen-lines-changed', @onScreenLinesChanged @scrollbar().off 'scroll', @matchScrollPosition - @editor().off 'contents-modified', @contentsModified - @editor().off 'screen-lines-changed', @screenLinesChanged - @editor().buffer.off 'saved', @saved - # Makes the view arguments scroll position match the target elements scroll - # position + # Matches scroll position of the BlameListView with the scroll bar. Bit + # of a hack since blame scrolls separately from the buffer right now matchScrollPosition: -> @setState scrollTop: @scrollbar().scrollTop() + # ========== + # Resize + # ========== + resizeStarted: ({pageX}) -> @setState dragging: true, initialPageX: pageX, initialWidth: @state.width $(document).on 'mousemove', @onResizeMouseMove @@ -220,4 +230,8 @@ BlameListView = React.createClass e.stopPropagation() e.preventDefault() +# ========== +# Exports +# ========== + module.exports = BlameListView diff --git a/package.json b/package.json index bdb0a77..107f949 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "repository": "https://github.com/alexcorre/git-blame", "license": "MIT", "engines": { - "atom": ">=0.121.0" + "atom": ">=0.127.0" }, "dependencies": { "underscore": "1.6.0", From e8f9506a39361357068166d2a6631ceb2ccd68e8 Mon Sep 17 00:00:00 2001 From: Alex Corre Date: Sun, 14 Sep 2014 11:24:41 -0700 Subject: [PATCH 05/10] split BlameListLinesComponent into its own file --- lib/views/blame-list-lines-component.coffee | 62 +++++++++++++++++++++ lib/views/blame-list-view.coffee | 55 ++---------------- 2 files changed, 66 insertions(+), 51 deletions(-) create mode 100644 lib/views/blame-list-lines-component.coffee diff --git a/lib/views/blame-list-lines-component.coffee b/lib/views/blame-list-lines-component.coffee new file mode 100644 index 0000000..3761abd --- /dev/null +++ b/lib/views/blame-list-lines-component.coffee @@ -0,0 +1,62 @@ +{React, Reactionary, $} = require 'atom' +{div} = Reactionary +RP = React.PropTypes +_ = require 'underscore' +{BlameLineComponent, renderLoading} = require './blame-line-view' + +# React Component representing a list of git-blame lines. Contained +# within the BlameListView when necessary. +# +BlameListLinesComponent = React.createClass + propTypes: + annotations: RP.arrayOf(RP.object) + loading: RP.bool.isRequired + dirty: RP.bool.isRequired + initialLineCount: RP.number.isRequired + remoteRevision: RP.object.isRequired + + # Renders the loading gutter. Should be shown while blame command + # line async process is happening, i.e. when @props.loading is true + renderLoading: -> + lines = [0...@props.initialLineCount].map renderLoading + div null, lines + + # Helper that makes background color of BlameLineComponent + # alternate by commit + _addAlternatingBackgroundColor: (lines) -> + bgClass = null + lastHash = null + for line in lines + bgClass = if line.noCommit + '' + else if line.hash is lastHash + bgClass + else if bgClass is 'line-bg-lighter' + 'line-bg-darker' + else + 'line-bg-lighter' + line['backgroundClass'] = bgClass + lastHash = line.hash + lines + + # Renders list of BlameLineComponents to show the user useful git-blame data + renderLoaded: -> + # clone so it can be modified + lines = _.clone @props.annotations + + # add url to open diff + l.remoteRevision = @props.remoteRevision for l in lines + @_addAlternatingBackgroundColor lines + div null, lines.map BlameLineComponent + + render: -> + if @props.loading + @renderLoading() + else + @renderLoaded() + +# ============= +# Exports +# ============= + +module.exports = BlameListLinesComponent diff --git a/lib/views/blame-list-view.coffee b/lib/views/blame-list-view.coffee index 9bd6c96..0ca006b 100644 --- a/lib/views/blame-list-view.coffee +++ b/lib/views/blame-list-view.coffee @@ -2,58 +2,11 @@ {div} = Reactionary RP = React.PropTypes _ = require 'underscore' -{BlameLineComponent, renderLoading} = require './blame-line-view' - - -BlameListLinesComponent = React.createClass - propTypes: - annotations: RP.arrayOf(RP.object) - loading: RP.bool.isRequired - dirty: RP.bool.isRequired - initialLineCount: RP.number.isRequired - remoteRevision: RP.object.isRequired - - # Renders the loading gutter. Should be shown while blame command - # line async process is happening, i.e. when @props.loading is true - renderLoading: -> - lines = [0...@props.initialLineCount].map renderLoading - div null, lines - - # Helper that makes background color of BlameLineComponent - # alternate by commit - _addAlternatingBackgroundColor: (lines) -> - bgClass = null - lastHash = null - for line in lines - bgClass = if line.noCommit - '' - else if line.hash is lastHash - bgClass - else if bgClass is 'line-bg-lighter' - 'line-bg-darker' - else - 'line-bg-lighter' - line['backgroundClass'] = bgClass - lastHash = line.hash - lines - - # Renders list of BlameLineComponents to show the user useful git-blame data - renderLoaded: -> - # clone so it can be modified - lines = _.clone @props.annotations - - # add url to open diff - l.remoteRevision = @props.remoteRevision for l in lines - @_addAlternatingBackgroundColor lines - div null, lines.map BlameLineComponent - - render: -> - if @props.loading - @renderLoading() - else - @renderLoaded() - +BlameListLinesComponent = require './blame-list-lines-component' +# Main container component for the git-blame gutter. Handles bound +# Editor events to keep the blame gutter in sync. +# BlameListView = React.createClass propTypes: projectBlamer: RP.object.isRequired From 5fc3987442805c5a0c6d979447bc4d1603679ed8 Mon Sep 17 00:00:00 2001 From: Alex Corre Date: Wed, 22 Oct 2014 00:17:23 -0700 Subject: [PATCH 06/10] Fix #41: adding an option to run git blame -w --- lib/git-blame.js | 3 ++- lib/util/gitCommander.js | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/git-blame.js b/lib/git-blame.js index 4469347..650fc9c 100644 --- a/lib/git-blame.js +++ b/lib/git-blame.js @@ -39,7 +39,8 @@ module.exports = { configDefaults: { useCustomUrlTemplateIfStandardRemotesFail: false, customCommitUrlTemplateString: 'Example -> https://github.com/<%- project %>/<%- repo %>/commit/<%- revision %>', - dateFormatString: 'YYYY-MM-DD' + dateFormatString: 'YYYY-MM-DD', + ignoreWhiteSpaceDiffs: false }, toggleBlame: toggleBlame, activate: activate diff --git a/lib/util/gitCommander.js b/lib/util/gitCommander.js index 59ab120..7f5711c 100644 --- a/lib/util/gitCommander.js +++ b/lib/util/gitCommander.js @@ -71,7 +71,14 @@ _.extend(GitCommander.prototype, { * @param {function} callback - callback funtion to call with results or error */ blame: function(fileName, callback) { - var args = ['blame', '--line-porcelain', fileName]; + var args = ['blame', '--line-porcelain']; + + // ignore white space based on config + if (atom.config.get('git-blame.ignoreWhiteSpaceDiffs')) { + args.push('-w'); + } + + args.push(fileName); // Execute blame command and parse this.exec(args, function(err, blame) { From 65b7b061eb893cade22f4297dea7905062104dc2 Mon Sep 17 00:00:00 2001 From: Alex Corre Date: Wed, 22 Oct 2014 00:18:11 -0700 Subject: [PATCH 07/10] updating readme with option explanations --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 22c66ba..2475951 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,17 @@ Show git blame for the current editor with the command `ctrl-b`. Only works when `.editor` is active. Submodules? No problem. Click on the revision to be taken to the commit page on Github, Bitbucket, or your remote repository url of choice. -## Setting a Custom Remote Repo Url +## Options + +### Ignore White Space Diffs + +If this option is selected, the `git blame` command will be run with `-w` option. + +### Date Format String + +Default date format is `YYYY-MM-DD`. This feature is backed by [moment.js](http://momentjs.com/). Any formats [supported by moment](http://momentjs.com/docs/#/displaying/format/) are valid here. + +### Setting a Custom Remote Repo Url This plugin will first check to see if your repo is backed by **Github** or **Bitbucket** so nothing is required if your repo is hosted on one of these. If its not, you can easily set a custom revision URL string like so: From 59dd2f8547dca578485152f8c710d48bc68eb820 Mon Sep 17 00:00:00 2001 From: Alex Corre Date: Wed, 29 Oct 2014 18:29:25 -0700 Subject: [PATCH 08/10] Fix #43. Blame error show only when click on hash --- lib/controllers/blameViewController.js | 3 +-- lib/views/blame-line-view.coffee | 15 +++++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/controllers/blameViewController.js b/lib/controllers/blameViewController.js index f11667d..86127a6 100644 --- a/lib/controllers/blameViewController.js +++ b/lib/controllers/blameViewController.js @@ -25,8 +25,7 @@ function toggleBlame(projectBlamer) { remoteRevision = RemoteRevision.create(remoteUrl); } catch (e) { // the only exception possible occurs when the template string is invalid - errorController.showError('error-no-custom-url-specified'); - return; + // TODO refactor this to not throw an exception } // insert the BlameListView after the gutter div diff --git a/lib/views/blame-line-view.coffee b/lib/views/blame-line-view.coffee index ec25a1a..df47c03 100644 --- a/lib/views/blame-line-view.coffee +++ b/lib/views/blame-line-view.coffee @@ -3,6 +3,7 @@ RP = React.PropTypes moment = require 'moment' {formatDate} = require '../util/blameFormatter' +errorController = require '../controllers/errorController' HASH_LENGTH = 7 # github uses this length BLANK_HASH = '-'.repeat(HASH_LENGTH) @@ -22,7 +23,7 @@ BlameLineComponent = React.createClass propTypes: date: RP.string.isRequired hash: RP.string.isRequired - remoteRevision: RP.object.isRequired + remoteRevision: RP.object author: RP.string.isRequired committer: RP.string.isRequired committerDate: RP.string.isRequired @@ -37,10 +38,13 @@ BlameLineComponent = React.createClass span className: 'date', @props.date span className: 'committer', 'Nobody' else - url = @props.remoteRevision.url @props.hash div className: 'blame-line ' + @props.backgroundClass, - a className: 'hash', href: url, - @props.hash.substring(0, HASH_LENGTH) + unless @props.remoteRevision + a onClick: @didClickHashWithoutUrl, className: 'hash', @props.hash.substring(0, HASH_LENGTH) + else + url = @props.remoteRevision.url @props.hash + a className: 'hash', href: url, + @props.hash.substring(0, HASH_LENGTH) span className: 'date', @props.date span className: 'committer text-highlight', @props.author.split(' ').slice(-1)[0] @@ -58,4 +62,7 @@ BlameLineComponent = React.createClass shouldComponentUpdate: ({hash}) -> hash isnt @props.hash + didClickHashWithoutUrl: (event, element) -> + errorController.showError 'error-no-custom-url-specified' + module.exports = {BlameLineComponent, renderLoading} From 6f140809d1762d393878ff543e5a9c0efed47661 Mon Sep 17 00:00:00 2001 From: Alex Corre Date: Wed, 22 Oct 2014 00:21:30 -0700 Subject: [PATCH 09/10] prepare 0.3.1 release --- README.md | 1 + package.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2475951..1e0dadd 100644 --- a/README.md +++ b/README.md @@ -59,3 +59,4 @@ https://github.com/alexcorre/git-blame/commit/12345 - See commit message tooltip when hovering over a commit - git-blame now updates to pick up changes on save - support for remote repositories that have "." in project or repo names +* **0.3.1**: [Issue #41](https://github.com/alexcorre/git-blame/issues/5). Option to blame with -w. diff --git a/package.json b/package.json index f08a025..3677142 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "git-blame", "main": "./lib/git-blame", - "version": "0.3.0", + "version": "0.3.1", "description": "Toggle git-blame annotations in the gutter of atom editor.", "activationEvents": [ "git-blame:toggle" From 4391ebb43bc042c8dfc9c9c202050c44357159ae Mon Sep 17 00:00:00 2001 From: Alex Corre Date: Wed, 29 Oct 2014 18:39:38 -0700 Subject: [PATCH 10/10] prepare 0.3.2 release --- README.md | 3 ++- package.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1e0dadd..21a2619 100644 --- a/README.md +++ b/README.md @@ -59,4 +59,5 @@ https://github.com/alexcorre/git-blame/commit/12345 - See commit message tooltip when hovering over a commit - git-blame now updates to pick up changes on save - support for remote repositories that have "." in project or repo names -* **0.3.1**: [Issue #41](https://github.com/alexcorre/git-blame/issues/5). Option to blame with -w. +* **0.3.1**: [Issue #41](https://github.com/alexcorre/git-blame/issues/41). Option to blame with -w. +* **0.3.2**: [Issue #43](https://github.com/alexcorre/git-blame/issues/43). diff --git a/package.json b/package.json index 3677142..4d8d409 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "git-blame", "main": "./lib/git-blame", - "version": "0.3.1", + "version": "0.3.2", "description": "Toggle git-blame annotations in the gutter of atom editor.", "activationEvents": [ "git-blame:toggle"