From: Felipe Contreras <felipe.contreras@gmail.com>
To: git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>,
Ramkumar Ramachandra <artagnon@gmail.com>,
Duy Nguyen <pclouds@gmail.com>,
Felipe Contreras <felipe.contreras@gmail.com>
Subject: [PATCH v6] Add new git-related helper to contrib
Date: Sun, 19 May 2013 10:53:43 -0500 [thread overview]
Message-ID: <1368978823-18247-1-git-send-email-felipe.contreras@gmail.com> (raw)
This script find people that might be interested in a patch, by going
back through the history for each single hunk modified, and finding
people that reviewed, acknowledge, signed, or authored the code the
patch is modifying.
It does this by running 'git blame' incrementally on each hunk, and then
parsing the commit message. After gathering all the relevant people, it
groups them to show what exactly was their role when the participated in
the development of the relevant commit, and on how many relevant commits
they participated. They are only displayed if they pass a minimum
threshold of participation.
For example:
% git related 0001-remote-hg-trivial-cleanups.patch
Felipe Contreras <felipe.contreras@gmail.com>
Jeff King <peff@peff.net>
Max Horn <max@quendi.de>
Junio C Hamano <gitster@pobox.com>
Thus it can be used for 'git send-email' as a cc-cmd.
There might be some other related functions to this script, not just to
be used as a cc-cmd.
Comments-by: Ramkumar Ramachandra <artagnon@gmail.com>
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
Sames as v5, with a few tiny modifications. I'm tired of sending the whole
series multiple times over the years, only to get stuck at the first patch, so
I'll send only the first one.
contrib/related/git-related | 124 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 124 insertions(+)
create mode 100755 contrib/related/git-related
diff --git a/contrib/related/git-related b/contrib/related/git-related
new file mode 100755
index 0000000..b96dcdd
--- /dev/null
+++ b/contrib/related/git-related
@@ -0,0 +1,124 @@
+#!/usr/bin/env ruby
+
+# This script finds people that might be interested in a patch
+# usage: git related <file>
+
+$since = '5-years-ago'
+$min_percent = 10
+
+def fmt_person(name, email)
+ '%s <%s>' % [name, email]
+end
+
+class Commit
+
+ attr_reader :persons
+
+ def initialize(id)
+ @id = id
+ @persons = []
+ end
+
+ def parse(data)
+ msg = nil
+ data.each_line do |line|
+ if not msg
+ case line
+ when /^author ([^<>]+) <(\S+)> (.+)$/
+ @persons << fmt_person($1, $2)
+ when /^$/
+ msg = true
+ end
+ else
+ if line =~ /^(Signed-off|Reviewed|Acked)-by: ([^<>]+) <(\S+?)>$/
+ @persons << fmt_person($2, $3)
+ end
+ end
+ end
+ @persons.uniq!
+ end
+
+end
+
+class Commits
+
+ def initialize
+ @items = {}
+ end
+
+ def size
+ @items.size
+ end
+
+ def each(&block)
+ @items.each(&block)
+ end
+
+ def import
+ return if @items.empty?
+ File.popen(%w[git cat-file --batch], 'r+') do |p|
+ p.write(@items.keys.join("\n"))
+ p.close_write
+ p.each do |line|
+ if line =~ /^(\h{40}) commit (\d+)/
+ id, len = $1, $2
+ data = p.read($2.to_i)
+ @items[id].parse(data)
+ end
+ end
+ end
+ end
+
+ def get_blame(source, start, len, from)
+ return if len == 0
+ len ||= 1
+ File.popen(['git', 'blame', '--incremental', '-CCC',
+ '-L', '%u,+%u' % [start, len],
+ '--since', $since, from + '^',
+ '--', source]) do |p|
+ p.each do |line|
+ if line =~ /^(\h{40})/
+ id = $&
+ @items[id] = Commit.new(id)
+ end
+ end
+ end
+ end
+
+ def from_patch(file)
+ from = source = nil
+ File.open(file) do |f|
+ f.each do |line|
+ case line
+ when /^From (\h+) (.+)$/
+ from = $1
+ when /^---\s+(\S+)/
+ source = $1 != '/dev/null' ? $1[2..-1] : nil
+ when /^@@ -(\d+)(?:,(\d+))?/
+ get_blame(source, $1, $2, from)
+ end
+ end
+ end
+ end
+
+end
+
+exit 1 if ARGV.size != 1
+
+commits = Commits.new
+commits.from_patch(ARGV[0])
+commits.import
+
+count_per_person = Hash.new(0)
+
+commits.each do |id, commit|
+ commit.persons.each do |person|
+ count_per_person[person] += 1
+ end
+end
+
+count_per_person.each do |person, count|
+ percent = count.to_f * 100 / commits.size
+ next if percent < $min_percent
+ puts person
+end
--
1.8.3.rc3.286.g3d43083
next reply other threads:[~2013-05-19 15:55 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-19 15:53 Felipe Contreras [this message]
2013-05-20 1:47 ` [PATCH v6] Add new git-related helper to contrib Eric Sunshine
2013-05-22 19:23 ` Junio C Hamano
2013-05-22 19:54 ` Junio C Hamano
2013-05-22 22:23 ` Felipe Contreras
2013-05-22 22:38 ` Junio C Hamano
2013-05-22 22:43 ` Felipe Contreras
2013-05-22 22:53 ` Junio C Hamano
2013-05-22 22:58 ` Junio C Hamano
2013-05-22 23:42 ` Junio C Hamano
2013-05-22 23:57 ` Felipe Contreras
2013-05-23 0:08 ` Junio C Hamano
2013-05-23 4:07 ` Felipe Contreras
2013-05-23 5:22 ` Felipe Contreras
2013-05-23 16:54 ` Junio C Hamano
2013-05-23 18:34 ` Junio C Hamano
2013-05-23 21:33 ` Felipe Contreras
2013-05-23 21:52 ` Junio C Hamano
2013-05-23 21:58 ` Felipe Contreras
2013-05-23 22:44 ` Junio C Hamano
2013-05-23 22:59 ` Felipe Contreras
2013-05-23 23:47 ` Junio C Hamano
2013-05-24 0:22 ` Felipe Contreras
2013-05-23 3:23 ` Felipe Contreras
2013-05-23 3:50 ` Felipe Contreras
2013-05-23 17:05 ` Junio C Hamano
2013-05-22 23:19 ` Felipe Contreras
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1368978823-18247-1-git-send-email-felipe.contreras@gmail.com \
--to=felipe.contreras@gmail.com \
--cc=artagnon@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=pclouds@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox