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