From: Junio C Hamano <gitster@pobox.com>
To: Felipe Contreras <felipe.contreras@gmail.com>
Cc: git@vger.kernel.org, Ramkumar Ramachandra <artagnon@gmail.com>,
Duy Nguyen <pclouds@gmail.com>
Subject: Re: [PATCH v6] Add new git-related helper to contrib
Date: Wed, 22 May 2013 12:23:21 -0700 [thread overview]
Message-ID: <7vr4gyizti.fsf@alter.siamese.dyndns.org> (raw)
In-Reply-To: <1368978823-18247-1-git-send-email-felipe.contreras@gmail.com> (Felipe Contreras's message of "Sun, 19 May 2013 10:53:43 -0500")
Felipe Contreras <felipe.contreras@gmail.com> writes:
> 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
Micronit. I suspect you do not need this helper, unless later
patches start using it.
> + 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',
I am torn on the hardcoded use of "-CCC" here.
Depending on the nature of the change in question, it may match well
or worse to what you are trying to find out. When you are trying to
say "What were you smoking when you implemented this broken logic?",
using -C may be good, but when your question is "Even though all the
callers of this function live in that other file, somebody moved
this function that used to be file static in that file to here and
made it public. Why?", you do not want to use -C.
I am reasonably sure that in the finished code later in the series
it will become configurable, but a fallback default is better to be
not so expensive one.
> + '-L', '%u,+%u' % [start, len],
> + '--since', $since, from + '^',
Is "from" unconditionally set?
Perhaps that nil + '^' magically disappear and this code is relying
on that, but it smells like a too much magic to me.
> + '--', 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
Makes sense to start from the preimage so that you can find out who
wrote the original block of lines your patch is removing.
But then if source is /dev/null, wouldn't you be able to stop
without running blame at all? You know the patch is creating a new
file at that point and there is nobody to point a finger at.
> + 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
next prev parent reply other threads:[~2013-05-22 19:23 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-19 15:53 [PATCH v6] Add new git-related helper to contrib Felipe Contreras
2013-05-20 1:47 ` Eric Sunshine
2013-05-22 19:23 ` Junio C Hamano [this message]
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=7vr4gyizti.fsf@alter.siamese.dyndns.org \
--to=gitster@pobox.com \
--cc=artagnon@gmail.com \
--cc=felipe.contreras@gmail.com \
--cc=git@vger.kernel.org \
--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