basyura's blog

あしたになったらほんきだす。

コミットの変更度を出してみる

実装してコミットした後にどれぐらい変更をしたのか(頑張ったのか)をざっくりでも知りたいなぁと前々から思っていてなんとか実現できないものかと調べ始みてる。
git log から + と - の変更行を抜き出して単純にステップ数を出してもいいのだけどあまり面白くないし、+ は単純な行追加とは限らないし、- も単純な行削除とは限らない。修正前後の変化量をもうちょっと突っ込んで知りたい。ぐぐる。

LCS(Longest Common Subsequence)
2つの要素列の最長共通部分列

diffの動作原理を知る~どのようにして差分を導き出すのか

細かいところは分からないけど、そういうことができるらしい。
ということは共通部分が分かるなら、それを除けば変更箇所が分かるくね?

gem 発見。

Diff::LCS computes the difference between two Enumerable sequences using the McIlroy-Hunt longest common subsequence (LCS) algorithm.

diff-lcs

たとえば修正して増えた場合の比較をしてみる

content1 → content2 に修正した想定で、共通部分を取得してみる

require 'diff/lcs'

content1 =<<EOF
class Test
  def initialize
  end
  def say
    puts 'hello'
  end
end
EOF

content2 =<<EOF
class Test
  def hoge
    puts 'hello hoge'
  end
  def say
    puts 'hello world'
  end
end
EOF

lcs = Diff::LCS.LCS(content1, content2)

p lcs

結果

["c", "l", "a", "s", "s", " ", "T", "e", "s", "t", "\n", " ", " ", "d", "e", "f", " ", "t", "l", "e", "\n", " ", " ", "e", "n", "d", "\n", " ", " ", "d", "e", "f", " ", "s", "a", "y", "\n", " ", " ", " ", " ", "p", "u", "t", "s", " ", "'", "h", "e", "l", "l", "o", "'", "\n", " ", " ", "e", "n", "d", "\n", "e", "n", "d", "\n"]

ここまで分かるなら、それぞれから共通部分の長さを引いたものを修正量として扱えるんじゃないだろうか (てきとう)。

puts lcs.length 
puts "#{content1.length} - #{lcs.length} = #{content1.length - lcs.length}"
puts "#{content2.length} - #{lcs.length} = #{content2.length - lcs.length}"
# 64
# 71 - 64 = 7
# 93 - 64 = 29

とりあえず、大きい方を変更度として扱うことにする。この場合は 29 が変更度

ほんとにあってんのか検証してみる

修正前で共通部分の背景色を変更


class Test\n
  def initialize\n
  end\n
  def say\n
    puts 'hello'\n
  end\n
end\n

修正後で共通部分の背景色を変更


class Test\n
  def hoge\n
    puts 'hello hoge'\n
  end\n
  def say\n
    puts 'hello world'\n
  end\n
end\n

これを反転すれば変更されたところが分かるはず。
修正前の変更箇所の背景色を変更


class Test\n
  def initialize\n
    end
  def say\n
    puts 'hello'\n
  end\n
end\n


修正後の変更箇所の背景色を変更


class Test\n
  def hoge\n
    puts 'hello hoge'\n
  end\n
  def say\n
    puts 'hello world'\n
  end\n
end\n

文字数をカウントすると、一致するので、あってるっぽい。

修正して減った場合

他のパターンも試してみる

content1 =<<EOF
class Test
  def initialize
  end
  def say
    puts 'hello'
  end
end
EOF

content2 =<<EOF
class Test
  def say
    puts 'hello'
  end
end
EOF

lcs = Diff::LCS.LCS(content1, content2)

p lcs
puts lcs.length
puts "#{content1.length} - #{lcs.length} = #{content1.length - lcs.length}"
puts "#{content2.length} - #{lcs.length} = #{content2.length - lcs.length}"

結果

["c", "l", "a", "s", "s", " ", "T", "e", "s", "t", "\n", " ", " ", "d", "e", "f", " ", "s", "a", "y", "\n", " ", " ", " ", " ", "p", "u", "t", "s", " ", "'", "h", "e", "l", "l", "o", "'", "\n", " ", " ", "e", "n", "d", "\n", "e", "n", "d", "\n"]
48
71 - 48 = 23
48 - 48 = 0

変更度を 23 とする

修正して増減した場合

content1 =<<EOF
class Test
  def initialize
  end
  def say
    puts 'hello'
  end
end
EOF

content2 =<<EOF
class Test
  def say
    puts 'hello'
    puts 'world'
  end
end
EOF

lcs = Diff::LCS.LCS(content1, content2)

p lcs
puts lcs.length
puts "#{content1.length} - #{lcs.length} = #{content1.length - lcs.length}"
puts "#{content2.length} - #{lcs.length} = #{content2.length - lcs.length}"

結果

["c", "l", "a", "s", "s", " ", "T", "e", "s", "t", "\n", " ", " ", "d", "e", "f", " ", "s", "a", "y", "\n", " ", " ", " ", " ", "p", "u", "t", "s", " ", "'", "h", "e", "l", "l", "o", "'", "\n", " ", " ", "e", "n", "d", "\n", "e", "n", "d", "\n"]
48
71 - 48 = 23
65 - 48 = 17

変更度を 23 とする。

tweetvim の変更度を調べるスクリプトを書いてみる

とりあえず直近 100 コミット

#!/usr/bin/env ruby

require 'diff/lcs'

Dir.chdir(File.expand_path('~/repos/vimfiles/gitplugins/TweetVim'))

ENV['GIT_PAGER'] = ''

class Status
  def initialize
    @statuses = {}
    @files    = []
  end
  def [](key)
    @statuses[key]
  end
  def files
    @files
  end
  def add(line)
    line.chomp!
    if line =~ /^commit/
      @statuses[:commit] = line.split(' ')[1]
    elsif line =~ /^Author/
      @statuses[:author] = line.split(': ')[1]
    elsif line =~ /^Date/
      @statuses[:date] = line.split(':   ')[1]
    elsif line =~ /^[MAD]\t/
      @files << line.split("\t")[1]
    end
  end
end

def get_content(commit, file_path)
  IO.popen("git show #{commit}:#{file_path} 2>/dev/null") { |io| io.read }
end

statuses = []
status   = nil
IO.popen('git log --name-status') do |io|
  while line = io.gets
    if line =~ /^commit/
      statuses << status if status
      status = Status.new
    end
    status.add(line)
    break if statuses.length > 100
  end
end

for i in 0...100
  total = 0
  point_logs = []
  current = statuses[i]
  prev    = statuses[i+1]
  for file in statuses[i].files
    content1 = get_content(current[:commit], file)
    content2 = get_content(prev[:commit], file)
    lcs = Diff::LCS.LCS(content1, content2)
    v1 = lcs.length - content1.length
    v2 = lcs.length - content2.length

    v1 = v1 * -1 if v1 < 0
    v2 = v2 * -1 if v2 < 0
    point = v1 > v2 ? v1 : v2
    total += point
    point_logs << point.to_s.rjust(16) + "  " + file + " (#{v1} : #{v2})"
  end

  puts "#{total.to_s.rjust(8)} : #{current[:commit]} | #{current[:author]} | #{current[:date]}"
  point_logs.each {|log| puts log }
  puts '' if point_logs.empty?
end

出力形式

コミットの変更度 : コミット | ユーザ | 日付
        ファイルの変更度 ファイル名 (修正前に対する変更度 : 修正後に対する変更度)

結果

     0 : 6bcf7d95c0289289794499b0959e20bfb91b750d | basyura | Sat Feb 15 22:26:08 2014

    71 : 1f017a3d2ad61dd70f1265b50c4f4d3d8ba2b704 | Shohei Fujii | Sat Feb 15 16:12:26 2014
            71  autoload/tweetvim.vim (71 : 0)
    43 : 9478169f4213b9e59b37e416a925a783c36a6db5 | basyura | Sat Dec 7 17:17:02 2013
            43  autoload/tweetvim.vim (43 : 0)
   930 : a5c80c116c2b660d81af75872c12b6313f48e903 | basyura | Sun Nov 17 22:28:48 2013
           408  autoload/tweetvim.vim (408 : 347)
            11  autoload/tweetvim/action/reload.vim (11 : 0)
            60  autoload/tweetvim/filter.vim (60 : 0)
           436  autoload/tweetvim/filter/userstream.vim (436 : 0)
            15  plugin/tweetvim.vim (15 : 0)
    86 : d33d0ff7c8fb64cfe63b526cdf030521dfe6fcda | basyura | Sun Nov 17 10:49:03 2013
            32  autoload/tweetvim.vim (32 : 0)
            54  autoload/tweetvim/action/reload.vim (54 : 1)
   305 : 51acfa535fbb984889d0369cb476e3110db94846 | basyura | Mon Nov 4 17:26:37 2013
            97  autoload/tweetvim/say.vim (97 : 84)
           208  plugin/tweetvim.vim (208 : 0)
     1 : 9bc7fef07a2741862f2080746d9a348210afdc0a | basyura | Mon Nov 4 09:49:27 2013
             1  autoload/tweetvim/buffer.vim (1 : 0)
    41 : 19dad61e2fd0509baa2b54d2837b0814348af5a6 | basyura | Mon Nov 4 09:44:04 2013
            41  autoload/tweetvim/say.vim (41 : 0)
    56 : c42bde480f5636e6d2ea30e5f7f15a16344360e1 | basyura | Sun Nov 3 14:27:38 2013
            56  autoload/tweetvim/say.vim (42 : 56)
    21 : 264b690b1999477e842d065798f6ab53d4729424 | basyura | Mon Oct 14 22:18:30 2013
            21  autoload/unite/sources/tweetvim_add_to_list.vim (21 : 15)
283698 : f27a88d29384f494255050fbe028e2ffeeac4e6e | basyura | Sun Oct 13 08:40:06 2013
          5445  autoload/vital/_5de2c28.vim (5445 : 0)
          6788  autoload/vital/_5de2c28/Bitwise.vim (6788 : 0)
          2710  autoload/vital/_5de2c28/Data/Base64.vim (2710 : 0)
           357  autoload/vital/_5de2c28/Data/Collection.vim (357 : 0)
          1280  autoload/vital/_5de2c28/Data/Dict.vim (1280 : 0)
          5118  autoload/vital/_5de2c28/Data/LazyList.vim (5118 : 0)
          6975  autoload/vital/_5de2c28/Data/List.vim (6975 : 0)
          2387  autoload/vital/_5de2c28/Data/OrderedSet.vim (2387 : 0)
          5879  autoload/vital/_5de2c28/Data/String.vim (5879 : 0)
          1609  autoload/vital/_5de2c28/Data/Tree.vim (1609 : 0)
          2661  autoload/vital/_5de2c28/Database/SQLite.vim (2661 : 0)
         22024  autoload/vital/_5de2c28/DateTime.vim (22024 : 0)
          2272  autoload/vital/_5de2c28/Experimental/Functor.vim (2272 : 0)
          1249  autoload/vital/_5de2c28/Locale/Message.vim (1249 : 0)
          4318  autoload/vital/_5de2c28/Mapping.vim (4318 : 0)
           416  autoload/vital/_5de2c28/Math.vim (416 : 0)
         11319  autoload/vital/_5de2c28/Prelude.vim (11319 : 0)
          2828  autoload/vital/_5de2c28/Process.vim (2828 : 0)
          2696  autoload/vital/_5de2c28/ProcessManager.vim (2696 : 0)
           811  autoload/vital/_5de2c28/Random/Xor128.vim (811 : 0)
          2255  autoload/vital/_5de2c28/System/Cache.vim (2255 : 0)
          4268  autoload/vital/_5de2c28/System/File.vim (4268 : 0)
          4608  autoload/vital/_5de2c28/System/Filepath.vim (4608 : 0)
          1848  autoload/vital/_5de2c28/Text/CSV.vim (1848 : 0)
          1276  autoload/vital/_5de2c28/Text/LTSV.vim (1276 : 0)
          2545  autoload/vital/_5de2c28/Text/Lexer.vim (2545 : 0)
          1608  autoload/vital/_5de2c28/Text/Parser.vim (1608 : 0)
           190  autoload/vital/_5de2c28/Vim/Buffer.vim (190 : 0)
          5076  autoload/vital/_5de2c28/Vim/BufferManager.vim (5076 : 0)
          1138  autoload/vital/_5de2c28/Vim/Compat.vim (1138 : 0)
           390  autoload/vital/_5de2c28/Vim/Message.vim (390 : 0)
          1824  autoload/vital/_5de2c28/Web/HTML.vim (1824 : 0)
         13947  autoload/vital/_5de2c28/Web/HTTP.vim (13947 : 0)
          1228  autoload/vital/_5de2c28/Web/JSON.vim (1228 : 0)
          8746  autoload/vital/_5de2c28/Web/URI.vim (8746 : 0)
          7866  autoload/vital/_5de2c28/Web/XML.vim (7866 : 0)
          5013  autoload/vital/_b268d8d.vim (0 : 5013)
          6788  autoload/vital/_b268d8d/Bitwise.vim (0 : 6788)
          2710  autoload/vital/_b268d8d/Data/Base64.vim (0 : 2710)
           357  autoload/vital/_b268d8d/Data/Collection.vim (0 : 357)
          1280  autoload/vital/_b268d8d/Data/Dict.vim (0 : 1280)
          5118  autoload/vital/_b268d8d/Data/LazyList.vim (0 : 5118)
          7189  autoload/vital/_b268d8d/Data/List.vim (0 : 7189)
          2387  autoload/vital/_b268d8d/Data/OrderedSet.vim (0 : 2387)
          5712  autoload/vital/_b268d8d/Data/String.vim (0 : 5712)
          1609  autoload/vital/_b268d8d/Data/Tree.vim (0 : 1609)
          2661  autoload/vital/_b268d8d/Database/SQLite.vim (0 : 2661)
         22024  autoload/vital/_b268d8d/DateTime.vim (0 : 22024)
          2272  autoload/vital/_b268d8d/Experimental/Functor.vim (0 : 2272)
          1249  autoload/vital/_b268d8d/Locale/Message.vim (0 : 1249)
          4318  autoload/vital/_b268d8d/Mapping.vim (0 : 4318)
           416  autoload/vital/_b268d8d/Math.vim (0 : 416)
         11319  autoload/vital/_b268d8d/Prelude.vim (0 : 11319)
          2712  autoload/vital/_b268d8d/Process.vim (0 : 2712)
          2696  autoload/vital/_b268d8d/ProcessManager.vim (0 : 2696)
          2255  autoload/vital/_b268d8d/System/Cache.vim (0 : 2255)
          4268  autoload/vital/_b268d8d/System/File.vim (0 : 4268)
          4608  autoload/vital/_b268d8d/System/Filepath.vim (0 : 4608)
          1276  autoload/vital/_b268d8d/Text/LTSV.vim (0 : 1276)
          2545  autoload/vital/_b268d8d/Text/Lexer.vim (0 : 2545)
          1608  autoload/vital/_b268d8d/Text/Parser.vim (0 : 1608)
           190  autoload/vital/_b268d8d/Vim/Buffer.vim (0 : 190)
          5076  autoload/vital/_b268d8d/Vim/BufferManager.vim (0 : 5076)
          1138  autoload/vital/_b268d8d/Vim/Compat.vim (0 : 1138)
          1824  autoload/vital/_b268d8d/Web/HTML.vim (0 : 1824)
         14026  autoload/vital/_b268d8d/Web/HTTP.vim (0 : 14026)
          1228  autoload/vital/_b268d8d/Web/JSON.vim (0 : 1228)
          7866  autoload/vital/_b268d8d/Web/XML.vim (0 : 7866)
             5  autoload/vital/tweetvim.vital (5 : 5)
    69 : e91c913d66201f2536c9e2e6d4b679ddd1755f42 | itchyny | Fri Oct 4 23:16:38 2013
            69  autoload/tweetvim/buffer.vim (69 : 65)
   101 : 47e5e976d9802e5ca7516c4bbb764c6d5353181e | itchyny | Fri Oct 4 21:41:24 2013
           101  autoload/tweetvim/buffer.vim (101 : 0)
    63 : 3d6cde8142ce3a6d6c585a8a1cb91cce270cb3a1 | itchyny | Fri Oct 4 01:56:06 2013
            63  autoload/tweetvim/buffer.vim (63 : 46)
     4 : e886a00da61ae78199f2ea611711529b52c0c547 | itchyny | Thu Oct 3 21:54:15 2013
             4  autoload/tweetvim/buffer.vim (0 : 4)
   172 : f7a3a3f6bf6f538ee1b0355bb7d9e83aa82e5a28 | itchyny | Thu Oct 3 21:53:17 2013
           172  autoload/tweetvim/buffer.vim (165 : 172)
  1096 : 95a9cdc766a41af20cbaa5e0ed8777db2644fbb7 | itchyny | Thu Oct 3 15:38:23 2013
           922  autoload/tweetvim/buffer.vim (922 : 20)
           108  doc/tweetvim.txt (108 : 0)
            66  plugin/tweetvim.vim (66 : 0)
     1 : 574bbec77622e776e75f370b03a5a70ce4913a03 | Masahiro Saito | Tue Aug 27 16:10:04 2013
             1  README.markdown (1 : 1)
     3 : d123a53b93e8fb8e3d939ffdd2919d4008749156 | basyura | Mon Aug 26 00:11:30 2013
             3  autoload/tweetvim/action/around.vim (3 : 3)
  1064 : 48bc47c80253c618698cd1f5563f42ebb2d97109 | basyura | Sun Aug 25 23:11:30 2013
          1002  autoload/tweetvim/action/around.vim (1002 : 19)
            62  autoload/tweetvim/action/reload.vim (62 : 0)
    28 : bc6139d0287901b3483ea171dfb23be53020babe | basyura | Sat Aug 24 22:59:22 2013
            28  autoload/tweetvim/action/around.vim (28 : 0)
   230 : 36ce506859573bc432d3bbca6974ac5de26397cc | basyura | Sat Aug 24 20:38:28 2013
            11  autoload/tweetvim.vim (11 : 11)
           127  autoload/tweetvim/action/around.vim (127 : 8)
            92  syntax/tweetvim.vim (92 : 0)
   671 : 2ef94db2eb566859cc9e8c4ee351cf2b5c8ffa80 | basyura | Sat Aug 24 18:46:44 2013
           671  autoload/tweetvim/action/around.vim (671 : 0)
   730 : 60a5f83052836e470419f9bd68c58f0d7dd8f2fb | basyura | Wed Aug 21 20:15:39 2013
           728  README.markdown (728 : 0)
             1  autoload/tweetvim.vim (1 : 1)
             1  doc/tweetvim.txt (1 : 1)
     0 : b80578b32d31bb2a4875bff210df63f36f9a4285 | basyura | Wed Aug 21 20:11:34 2013

     0 : 32880d12e85cc6caf322324cf57523412f4dc710 | basyura | Tue Aug 20 01:28:08 2013 -0700

     3 : eae9658d156e1b482f9b9e7d824bc2e156b38ed7 | rhysd | Tue Aug 20 14:41:54 2013
             3  autoload/tweetvim/util.vim (3 : 3)
   672 : aa7e8d6809a61108a64588d870add8f51b275834 | basyura | Mon Aug 19 19:43:34 2013
           401  autoload/tweetvim/util.vim (401 : 0)
           160  doc/tweetvim.txt (160 : 0)
           111  plugin/tweetvim.vim (111 : 0)
257235 : 8deb314d406ead75c6ffdd3c3329ca0de6c80fa1 | basyura | Mon Aug 19 18:56:52 2013
          5013  autoload/vital/_b268d8d.vim (5013 : 0)
          6788  autoload/vital/_b268d8d/Bitwise.vim (6788 : 0)
          2710  autoload/vital/_b268d8d/Data/Base64.vim (2710 : 0)
           357  autoload/vital/_b268d8d/Data/Collection.vim (357 : 0)
          1280  autoload/vital/_b268d8d/Data/Dict.vim (1280 : 0)
          5118  autoload/vital/_b268d8d/Data/LazyList.vim (5118 : 0)
          7189  autoload/vital/_b268d8d/Data/List.vim (7189 : 0)
          2387  autoload/vital/_b268d8d/Data/OrderedSet.vim (2387 : 0)
          5712  autoload/vital/_b268d8d/Data/String.vim (5712 : 0)
          1609  autoload/vital/_b268d8d/Data/Tree.vim (1609 : 0)
          2661  autoload/vital/_b268d8d/Database/SQLite.vim (2661 : 0)
         22024  autoload/vital/_b268d8d/DateTime.vim (22024 : 0)
          2272  autoload/vital/_b268d8d/Experimental/Functor.vim (2272 : 0)
          1249  autoload/vital/_b268d8d/Locale/Message.vim (1249 : 0)
          4318  autoload/vital/_b268d8d/Mapping.vim (4318 : 0)
           416  autoload/vital/_b268d8d/Math.vim (416 : 0)
         11319  autoload/vital/_b268d8d/Prelude.vim (11319 : 0)
          2712  autoload/vital/_b268d8d/Process.vim (2712 : 0)
          2696  autoload/vital/_b268d8d/ProcessManager.vim (2696 : 0)
          2255  autoload/vital/_b268d8d/System/Cache.vim (2255 : 0)
          4268  autoload/vital/_b268d8d/System/File.vim (4268 : 0)
          4608  autoload/vital/_b268d8d/System/Filepath.vim (4608 : 0)
          1276  autoload/vital/_b268d8d/Text/LTSV.vim (1276 : 0)
          2545  autoload/vital/_b268d8d/Text/Lexer.vim (2545 : 0)
          1608  autoload/vital/_b268d8d/Text/Parser.vim (1608 : 0)
           190  autoload/vital/_b268d8d/Vim/Buffer.vim (190 : 0)
          5076  autoload/vital/_b268d8d/Vim/BufferManager.vim (5076 : 0)
          1138  autoload/vital/_b268d8d/Vim/Compat.vim (1138 : 0)
          1824  autoload/vital/_b268d8d/Web/HTML.vim (1824 : 0)
         14026  autoload/vital/_b268d8d/Web/HTTP.vim (14026 : 0)
          1228  autoload/vital/_b268d8d/Web/JSON.vim (1228 : 0)
          7866  autoload/vital/_b268d8d/Web/XML.vim (7866 : 0)
          4833  autoload/vital/_f6aedf7.vim (0 : 4833)
          6788  autoload/vital/_f6aedf7/bitwise.vim (0 : 6788)
          2710  autoload/vital/_f6aedf7/data/base64.vim (0 : 2710)
           357  autoload/vital/_f6aedf7/data/collection.vim (0 : 357)
          1280  autoload/vital/_f6aedf7/data/dict.vim (0 : 1280)
          5592  autoload/vital/_f6aedf7/data/list.vim (0 : 5592)
          2387  autoload/vital/_f6aedf7/data/ordered_set.vim (0 : 2387)
          5956  autoload/vital/_f6aedf7/data/string.vim (0 : 5956)
          1609  autoload/vital/_f6aedf7/data/tree.vim (0 : 1609)
         21965  autoload/vital/_f6aedf7/date_time.vim (0 : 21965)
          2272  autoload/vital/_f6aedf7/experimental/functor.vim (0 : 2272)
          1249  autoload/vital/_f6aedf7/locale/message.vim (0 : 1249)
          4318  autoload/vital/_f6aedf7/mapping.vim (0 : 4318)
           279  autoload/vital/_f6aedf7/math.vim (0 : 279)
          9891  autoload/vital/_f6aedf7/prelude.vim (0 : 9891)
          3290  autoload/vital/_f6aedf7/process.vim (0 : 3290)
          2358  autoload/vital/_f6aedf7/system/cache.vim (0 : 2358)
          4487  autoload/vital/_f6aedf7/system/file.vim (0 : 4487)
          4607  autoload/vital/_f6aedf7/system/filepath.vim (0 : 4607)
          2499  autoload/vital/_f6aedf7/text/lexer.vim (0 : 2499)
          1276  autoload/vital/_f6aedf7/text/ltsv.vim (0 : 1276)
          5016  autoload/vital/_f6aedf7/vim/buffer/manager.vim (0 : 5016)
          4782  autoload/vital/_f6aedf7/vim/buffer_manager.vim (0 : 4782)
          1138  autoload/vital/_f6aedf7/vim/compat.vim (0 : 1138)
          1824  autoload/vital/_f6aedf7/web/html.vim (0 : 1824)
          9635  autoload/vital/_f6aedf7/web/http.vim (0 : 9635)
          1228  autoload/vital/_f6aedf7/web/json.vim (0 : 1228)
          7866  autoload/vital/_f6aedf7/web/xml.vim (0 : 7866)
             5  autoload/vital/tweetvim.vital (5 : 5)
   326 : e33ec893499bfa840f5d6bb30b4f37db1094f322 | basyura | Mon Aug 12 14:25:58 2013
           314  autoload/tweetvim/account.vim (314 : 256)
             6  autoload/tweetvim/complete.vim (6 : 0)
             6  autoload/unite/sources/tweetvim_timeline.vim (6 : 0)
     0 : 53186547fda4a264f11cffa861a8f768d52eeca3 | basyura | Sun Aug 11 17:27:29 2013

   300 : e322d01482be911c0ed7ff5d206aed767d510b96 | alpaca_taichou | Sun Aug 11 01:19:18 2013
           300  plugin/tweetvim.vim (83 : 300)
    35 : 5b0bf64cc457c0e5cf24fb2b4aaf1be90eaa65b3 | basyura | Tue Aug 6 08:45:10 2013
            35  autoload/tweetvim/buffer.vim (35 : 0)
     0 : 53d050c0db7a15191e1e962fd5ea7ffe6ab0e891 | basyura | Fri Aug 2 00:55:05 2013 -0700

    14 : fc3e3e6b111ffb7619bc3ff690c85e2a783bc60f | rhysd | Fri Aug 2 14:30:54 2013
            14  autoload/tweetvim.vim (14 : 2)
     2 : 2f75fb04067f515dc5e0292082df210f98122b09 | basyura | Tue Jul 30 22:42:50 2013
             2  plugin/tweetvim.vim (2 : 1)
    83 : 879c7291b28558a7bf928439d0c585662803bf5d | basyura | Thu Jul 25 00:11:21 2013
            83  autoload/tweetvim/action/reload.vim (83 : 0)
     0 : 388ac9e64640f3ea2c26b85ca8db7aaf89a9ce41 | basyura | Sat Jul 20 01:03:02 2013 -0700

    31 : 028ca70740ac0ca302c52cbb1f19eb8f4bbb5f38 | Shohei Fujii | Sat Jul 20 15:12:07 2013
            31  autoload/tweetvim.vim (31 : 0)
    91 : 908316ee8751c0a83c23ce8a6c6ad7bef13c5ea3 | basyura | Mon Jul 15 23:14:08 2013
            91  autoload/tweetvim/buffer.vim (91 : 0)
     5 : 1e56f6082c993c15942492579d0f32cd1a84cf59 | basyura | Mon Jul 15 22:20:38 2013
             5  autoload/tweetvim/buffer.vim (2 : 5)
  1095 : 189532cbe993f0eeb501fc3dbe2959b074866119 | basyura | Mon Jul 15 20:20:48 2013
           361  autoload/tweetvim/action/buffer_previous_stream.vim (361 : 0)
           612  autoload/tweetvim/buffer.vim (612 : 0)
           122  plugin/tweetvim.vim (122 : 0)
    78 : 5e8afbc87b8f566a7801bff86d15f44b548e85c1 | basyura | Sat Jul 13 21:51:01 2013
            78  autoload/tweetvim/buffer.vim (78 : 0)
    50 : d25d2e2c8aeb45d609c4220dd2175532b476beb7 | basyura | Wed Jul 10 22:21:00 2013
            50  autoload/tweetvim/action/reply_to_all.vim (0 : 50)
     0 : 57556c2d908aa0997bfb1c3b030e2236c0fe3ef6 | basyura | Wed Jul 10 21:49:02 2013

    52 : 6a12e362ec3a1cfdbde308254c53b68881b8790b | Shohei Fujii | Mon Jul 8 21:54:42 2013
            52  autoload/tweetvim/action/reply_to_all.vim (52 : 0)
   172 : 6a898fa26ef120102714e18f6c34bf7b9e4960e5 | Shohei Fujii | Mon Jul 8 21:46:22 2013
            67  autoload/tweetvim/buffer.vim (67 : 0)
           105  plugin/tweetvim.vim (105 : 0)
   699 : 1f70b53ba1a18a32ca03243f216e2f5da972bb4a | Shohei Fujii | Mon Jul 8 21:09:01 2013
           699  autoload/tweetvim/action/reply_to_all.vim (699 : 0)
   289 : dafba5044fa07ba35f1c4a2dff25e168c3f4f3b8 | basyura | Fri Jul 5 22:34:28 2013
           289  autoload/tweetvim/buffer.vim (289 : 2)
     0 : a656628e94f3171414ecc33737518257a55cbbe8 | basyura | Fri Jul 5 22:12:17 2013

   576 : ee94ab38cc62bcd2e29e515d151d405bd56f31f0 | Shohei Fujii | Thu Jul 4 18:57:43 2013
           186  autoload/tweetvim.vim (186 : 0)
           390  autoload/tweetvim/buffer.vim (390 : 0)
     2 : 99ce8485d93467176cbbda97c5705711da915485 | basyura | Sun Jun 30 10:42:07 2013
             2  plugin/tweetvim.vim (1 : 2)
     0 : 9df368ccfc432958b624a8005446168fbe0b6721 | basyura | Sat Jun 29 14:50:55 2013

    25 : d420337adaba8f5279c0c0fa8283b5f978f3df62 | rhysd | Sat Jun 29 14:05:24 2013
            25  autoload/tweetvim.vim (25 : 0)
   108 : ceb68842672ccb9ff5efcbdd97484135fcc1d690 | basyura | Tue Jun 25 23:47:19 2013
           108  autoload/tweetvim/buffer.vim (108 : 0)
   214 : 36bcd3c9201ff560fc8c0b93d067432f0c0f3a5b | basyura | Mon Jun 24 10:15:40 2013
           214  README.markdown (214 : 0)
    26 : d1b015218db8cf28090cc0293ef75574b96ba6a6 | basyura | Mon Jun 24 10:15:31 2013
            25  autoload/tweetvim.vim (25 : 0)
             1  autoload/tweetvim/buffer.vim (1 : 0)
   162 : 2ec80bd9138cd75fc7b1c980d330995d23ad6a02 | basyura | Wed Jun 19 12:50:25 2013
           162  autoload/tweetvim.vim (162 : 48)
    96 : 58cbbdc0ddedf1853fb9355d5b743d148dcde17d | basyura | Sun Jun 16 20:54:07 2013
            28  autoload/tweetvim.vim (28 : 2)
            68  plugin/tweetvim.vim (68 : 0)
    70 : 629d2ea700277141d058e883b68b7e5250491be7 | basyura | Sun Jun 16 20:53:54 2013
            70  autoload/tweetvim.vim (70 : 1)
   355 : 9a739dd9f4f3558d461bd8b95adda0d5bce8b9ee | basyura | Fri Jun 14 21:44:20 2013
           355  autoload/tweetvim.vim (355 : 1)
     1 : 4d8391ce411fb729807421cd91098c7866696849 | basyura | Mon Jun 10 22:03:55 2013
             1  autoload/tweetvim.vim (1 : 1)
    28 : 81f764310cd2043a486b63129a6b4ae707e6cff0 | basyura | Sun Jun 9 21:58:07 2013
            28  autoload/tweetvim.vim (0 : 28)
   493 : af0116765ec26691ca910802b868f86ccdf980c0 | basyura | Sun Jun 9 21:47:03 2013
           493  autoload/tweetvim.vim (493 : 266)
   224 : 161cf45cddfd17c4cd84fd075775b7b7271535af | basyura | Sun Jun 9 17:55:25 2013
           224  autoload/tweetvim/buffer.vim (224 : 31)
  1021 : 3176ca89e023eb699c43948bf609edcda9d09b74 | basyura | Sun Jun 9 16:53:58 2013
           505  autoload/tweetvim.vim (121 : 505)
           516  autoload/tweetvim/util.vim (516 : 0)
   200 : 7a10ee1e378d21be71f018b7c659920f0c617b4c | basyura | Sun Jun 9 16:23:36 2013
           142  autoload/tweetvim.vim (142 : 0)
            58  autoload/tweetvim/buffer.vim (58 : 0)
   277 : 8aede7532fec47e7c75da748b5d6156e4ce899f9 | basyura | Sun Jun 9 13:09:35 2013
           270  autoload/tweetvim/buffer.vim (270 : 111)
             7  syntax/tweetvim.vim (7 : 5)
    79 : bd329433328eb13ec19d9f354aa83c4ba4232af9 | basyura | Sat Jun 8 14:34:34 2013
             4  autoload/tweetvim.vim (4 : 3)
            75  plugin/tweetvim.vim (5 : 75)
     0 : e094926045395aaeb19829dfa62812f58e9d4f9a | basyura | Sat Jun 8 08:30:42 2013

     2 : dfcd3d01c99f9e9c6a01556d9fafff51b5aa9e0b | basyura | Fri Jun 7 21:30:39 2013
             2  autoload/tweetvim.vim (2 : 2)
   792 : 755d38e009b1fc5bb1bc1112edc26c3adced8b47 | basyura | Fri Jun 7 21:30:00 2013
           792  doc/tweetvim.txt (792 : 1)
   110 : 273f564112d17ec427654ed6859392482a158e9b | basyura | Tue Jun 4 21:41:14 2013
           110  autoload/tweetvim/buffer.vim (110 : 0)
   251 : 3b977aacb017113c5f7abb291736f580241f6273 | basyura | Tue Jun 4 16:06:11 2013
           215  autoload/tweetvim/action/cursor_down.vim (215 : 13)
            36  autoload/tweetvim/action/cursor_up.vim (36 : 2)
   268 : e53111cd3ad0c3149ad487ea110583ce390956e5 | basyura | Mon Jun 3 22:36:27 2013
            59  autoload/tweetvim/buffer.vim (59 : 1)
            59  autoload/tweetvim/say.vim (59 : 0)
           150  plugin/tweetvim.vim (150 : 0)
    32 : 512c65e56f4cc55a65608c7fa0c9c87d9ac242d3 | basyura | Mon Jun 3 21:42:44 2013
            32  autoload/tweetvim/buffer.vim (2 : 32)
   254 : 4880290114e50f43dfa5cf290df6b0be65b4cbfd | basyura | Mon Jun 3 19:53:46 2013
           192  autoload/tweetvim/buffer.vim (192 : 11)
            62  plugin/tweetvim.vim (62 : 0)
    20 : 835f0ea9c42c670721d8d897348a3ca7916da970 | basyura | Mon Jun 3 08:55:00 2013
            10  autoload/tweetvim.vim (10 : 0)
            10  autoload/tweetvim/buffer.vim (10 : 0)
     0 : d1b29c7eaab6c434c7a8277e443183725e4ffd79 | basyura | Sun Jun 2 13:19:34 2013

    96 : f8e91d99e992b6b8d2e471c9aceec2f53cae6d84 | basyura | Sun Jun 2 10:09:29 2013
            96  autoload/tweetvim.vim (96 : 0)
    31 : bf48354c45a335d7bfc2f1796e3023a520931a79 | basyura | Sun Jun 2 00:33:52 2013
            27  autoload/tweetvim.vim (27 : 0)
             4  autoload/tweetvim/buffer.vim (4 : 0)
    30 : 56045fbc3139d6a41fa74145424c559d4e89e460 | basyura | Sun Jun 2 00:21:26 2013
            30  autoload/tweetvim.vim (30 : 0)
   459 : 76e585b7d07eeaf421f0e7f3800aff6c20db4fef | basyura | Sun Jun 2 00:17:38 2013
           427  autoload/tweetvim.vim (427 : 0)
            15  autoload/tweetvim/buffer.vim (15 : 9)
            17  plugin/tweetvim.vim (17 : 0)
    54 : 6c43f5871d502c24fb8dbbb4eb286466a6a9333d | basyura | Sat Jun 1 18:07:33 2013
            54  autoload/tweetvim.vim (54 : 2)
    28 : baffd325abaa02b79c3e31e4a41a814283972cb7 | basyura | Sat Jun 1 17:48:57 2013
            28  autoload/tweetvim.vim (28 : 0)
     6 : 35ffe2866951539a472bea29f46dcb070f2be8a7 | basyura | Sat Jun 1 17:41:56 2013
             6  autoload/tweetvim.vim (6 : 4)
   223 : b18c84fea3401019724362a468073eee747305a6 | basyura | Sat Jun 1 16:24:21 2013
           223  autoload/tweetvim/buffer.vim (223 : 61)
   311 : 5a94f55c1603561bc9c5b1b06127ddb7e67eda41 | basyura | Sat Jun 1 15:27:52 2013
           222  autoload/tweetvim.vim (222 : 13)
            89  autoload/tweetvim/buffer.vim (89 : 1)
   201 : 2502e228c5ae36bd29a5637a2b6298ca214443ea | basyura | Sat Jun 1 15:08:15 2013
           201  autoload/tweetvim/buffer.vim (201 : 0)
     2 : ea5bd9f882c1b6583d1fd2b60c202a05b324ca5f | basyura | Sat Jun 1 13:44:03 2013
             2  autoload/tweetvim.vim (2 : 2)
   127 : af84f6ab7b2ec3c3e85ed3f5b29207f0b629f5d8 | basyura | Sat Jun 1 13:41:39 2013
           127  autoload/tweetvim.vim (127 : 0)
   994 : d6919e13db1e4526eee01f8b76041bf3cea62c03 | basyura | Sat Jun 1 13:00:37 2013
           874  autoload/tweetvim.vim (874 : 89)
           120  autoload/tweetvim/buffer.vim (120 : 31)
    20 : b72932ffc1cca657d55a2f63626f12a0115a1a22 | basyura | Fri May 31 22:12:26 2013
            20  autoload/tweetvim/say.vim (20 : 0)
   342 : b49a3d790af20634976f6174c5215dfbcfd172aa | basyura | Fri May 31 15:04:08 2013
           278  autoload/tweetvim.vim (278 : 0)
            64  plugin/tweetvim.vim (64 : 0)
    42 : 4e5ea018cb749043eabd6dc437376fd0c53bda62 | basyura | Fri May 31 14:49:55 2013
            42  autoload/unite/sources/tweetvim_switch_account.vim (42 : 0)
   165 : 14ad026f1bb20772f0b6c0e0f07945383c86185f | basyura | Fri May 31 14:43:37 2013
           165  autoload/tweetvim.vim (165 : 9)
    85 : b59b383b84ef1f6d5b33c165d8f58d8a6315aba8 | basyura | Fri May 31 13:14:20 2013
            85  autoload/tweetvim.vim (85 : 0)
   282 : cb36ad9215ab41f71868e5e382e1f56c2e8e27a3 | basyura | Fri May 31 12:56:31 2013
           282  autoload/tweetvim/buffer.vim (282 : 0)
   348 : b5d22239afc4927050f0a2c40bcbb2c83fde841c | basyura | Fri May 31 12:34:27 2013
             2  autoload/tweetvim.vim (2 : 2)
           346  autoload/tweetvim/buffer.vim (346 : 251)
   582 : 384c2603b43fc3952838ce6e1c84582224226a80 | basyura | Fri May 31 11:27:38 2013
           158  autoload/tweetvim.vim (158 : 158)

結構それっぽく出てる。vital の更新はさすがにでかい。

気が向いたらユーザとか日付指定で出せるようにしてみる。