Thread (1 message) 1 message, 1 author, 2016-06-15

Re: [PATCH v3 01/11] Add new git-cc-cmd helper to contrib

From: Junio C Hamano <hidden>
Date: 2016-06-15 22:56:55

Felipe Contreras [off-list ref] writes:
This script find people that might be interesting 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 cc-cmd 0001-remote-hg-trivial-cleanups.patch
  Felipe Contreras [off-list ref] (author: 100%)
  Jeff King [off-list ref] (signer: 83%)
  Max Horn [off-list ref] (signer: 16%)
  Junio C Hamano [off-list ref] (signer: 16%)
Should the contribution weight for each role add up to (close to)
100% if there were no minimum cut-off?

In general, it is not all that clear what these numbers mean.  Does
a sign/review on a single commit, no matter what kind of commit it
is or how big it is, count as contribution with the same weight?

I am not saying that the counting criteria needs to be configurable.
It just needs to be explainable to the end users.
+commits = Commits.new
+commits.from_patch(ARGV[0])
+commits.import
+
+# hash of hashes
+persons = Hash.new { |hash, key| hash[key] = {} }
+
+commits.items.values.each do |commit|
+  commit.roles.each do |person, role|
+    persons[person][role] ||= 0
+    persons[person][role] += 1
+  end
+end
+
+persons.each do |person, roles|
+  roles = roles.map do |role, count|
+    percent = count.to_f * 100 / commits.size
+    next if percent < $min_percent
+    '%s: %u%%' % [role, percent]
+  end.compact
+  next if roles.empty?
+
+  name, email = person
+  # must quote chars?
+  name = '"%s"' % name if name =~ /[^\w \-]/i
+  person = name ? '%s <%s>' % [name, email] : email
+  puts '%s (%s)' % [person, roles.join(', ')]
+end
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help