mirror of
git://sourceware.org/git/lvm2.git
synced 2025-01-03 05:18:29 +03:00
81 lines
1.8 KiB
Ruby
Executable File
81 lines
1.8 KiB
Ruby
Executable File
#! /usr/bin/env ruby
|
|
|
|
require 'date'
|
|
require 'pp'
|
|
|
|
REGEX = /(\w+)\s+'(.+)'\s+(.*)/
|
|
|
|
Commit = Struct.new(:hash, :time, :author, :stats)
|
|
CommitStats = Struct.new(:nr_files, :nr_added, :nr_deleted)
|
|
|
|
def calc_stats(diff)
|
|
changed = 0
|
|
added = 0
|
|
deleted = 0
|
|
|
|
diff.lines.each do |l|
|
|
case l
|
|
when /^\+\+\+/
|
|
changed = changed + 1
|
|
when /^\+/
|
|
added = added + 1
|
|
when /^---/
|
|
# do nothing
|
|
when /^\-/
|
|
deleted = deleted + 1
|
|
end
|
|
end
|
|
|
|
CommitStats.new(changed, added, deleted)
|
|
end
|
|
|
|
def select_commits(&block)
|
|
commits = []
|
|
|
|
input = `git log --format="%h '%aI' %an"`
|
|
input.lines.each do |l|
|
|
m = REGEX.match(l)
|
|
|
|
raise "couldn't parse: ${l}" unless m
|
|
|
|
hash = m[1]
|
|
time = DateTime.iso8601(m[2])
|
|
author = m[3]
|
|
|
|
if block.call(hash, time, author)
|
|
diff = `git log -1 -p #{hash} | filterdiff -X configure`
|
|
commits << Commit.new(hash, time, author, calc_stats(diff))
|
|
end
|
|
end
|
|
|
|
commits
|
|
end
|
|
|
|
def since(date)
|
|
lambda do |hash, time, author|
|
|
time >= date
|
|
end
|
|
end
|
|
|
|
def pad(str, col)
|
|
str + (' ' * (col - str.size))
|
|
end
|
|
|
|
#-----------------------------------
|
|
|
|
commits = select_commits(&since(DateTime.now - 14))
|
|
|
|
authors = Hash.new {|hash, key| hash[key] = CommitStats.new(0, 0, 0)}
|
|
|
|
commits.each do |c|
|
|
author_stats = authors[c.author]
|
|
author_stats.nr_files = author_stats.nr_files + c.stats.nr_files
|
|
author_stats.nr_added = author_stats.nr_added + c.stats.nr_added
|
|
author_stats.nr_deleted = author_stats.nr_deleted + c.stats.nr_deleted
|
|
end
|
|
|
|
puts "#{pad("Author", 20)}\tChanged files\tInsertions\tDeletions"
|
|
authors.each_pair do |k, v|
|
|
puts "#{pad(k, 20)}\t#{v.nr_files}\t\t#{v.nr_added}\t\t#{v.nr_deleted}"
|
|
end
|