git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v5 05/15] contrib: related: add helper Person classes

From
Felipe Contreras <felipe.contreras@gmail.com>
Date
May 18, 2013, 11:46 UTC
Message-ID
<1368877615-9563-6-git-send-email-felipe.contreras@gmail.com>
In-Reply-To
<1368877615-9563-1-git-send-email-felipe.contreras@gmail.com>
No functional changes.
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/related/git-related | 80 +++++++++++++++++++++++++++++++--------------
 1 file changed, 56 insertions(+), 24 deletions(-)
diff --git a/contrib/related/git-related b/contrib/related/git-related
index 7be2829..df13148 100755
--- a/contrib/related/git-related
+++ b/contrib/related/git-related
@@ -8,10 +8,6 @@ require 'optparse'
 $since = '5-years-ago'
 $min_percent = 10
 
-def fmt_person(name, email)
-  name ? '%s <%s>' % [name, email] : email
-end
-
 begin
   OptionParser.new do |opts|
     opts.program_name = 'git related'
@@ -27,13 +23,59 @@ begin
 rescue OptionParser::InvalidOption
 end
 
-class Commit
+class Person
+
+  attr_reader :roles
+
+  def initialize(name, email)
+    @name = name
+    @email = email
+    @commits = {}
+  end
+
+  def add_role(commit)
+    @commits[commit] = true
+  end
+
+  def <=>(b)
+    self.size <=> b.size
+  end
+
+  def size
+    @commits.size
+  end
+
+  def to_s
+    @name ? '%s <%s>' % [@name, @email] : @email
+  end
+
+end
 
-  attr_reader :persons
+class Persons
+
+  @@index = {}
+
+  include Enumerable
+
+  def each(&block)
+    @@index.values.each(&block)
+  end
+
+  def self.get(name, email)
+    id = [name, email]
+    person = @@index[id]
+    if not person
+      person = @@index[id] = Person.new(name, email)
+    end
+    person
+  end
+
+end
+
+class Commit
 
   def initialize(id)
     @id = id
-    @persons = []
   end
 
   def parse(data)
@@ -42,17 +84,18 @@ class Commit
       if not msg
         case line
         when /^author ([^<>]+) <(\S+)> (.+)$/
-          @persons << fmt_person($1, $2)
+          author = Persons.get($1, $2)
+          author.add_role(@id)
         when /^$/
           msg = true
         end
       else
         if line =~ /^(Signed-off|Reviewed|Acked)-by: ([^<>]+) <(\S+?)>$/
-          @persons << fmt_person($2, $3)
+          person = Persons.get($2, $3)
+          person.add_role(@id)
         end
       end
     end
-    @persons.uniq!
   end
 
 end
@@ -126,21 +169,10 @@ 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
-
-# sort by number of participations
-count_sort = lambda do |a, b|
-  b[1] <=> a[1]
-end
+persons = Persons.new
 
-count_per_person.sort(&count_sort).each do |person, count|
-  percent = count.to_f * 100 / commits.size
+persons.sort.reverse.each do |person|
+  percent = person.size.to_f * 100 / commits.size
   next if percent < $min_percent
   puts '%s (involved: %u%%)' % [person, percent]
 end
-- 
1.8.3.rc2.542.g24820ba
Previous: Felipe ContrerasNext: Felipe Contreras
Message 18 of 28 in “New git-related helper”
  1. 00/15 New git-related helperFelipe Contreras, May 18, 2013
  2. 01/15 Add new git-related helper to contribFelipe Contreras, May 18, 2013
  3. Felipe ContrerasMay 18, 2013
  4. Junio C HamanoMay 19, 2013
  5. Felipe ContrerasMay 19, 2013
  6. Ramkumar RamachandraMay 19, 2013
  7. Felipe ContrerasMay 19, 2013
  8. Ramkumar RamachandraMay 19, 2013
  9. Felipe ContrerasMay 19, 2013
  10. David AguilarMay 19, 2013
  11. Ramkumar RamachandraMay 19, 2013
  12. Ramkumar RamachandraMay 19, 2013
  13. Felipe ContrerasMay 19, 2013
  14. Felipe ContrerasMay 19, 2013
  15. 02/15 contrib: related: add option parsingFelipe Contreras, May 18, 2013
  16. 03/15 contrib: related: sort by amount of involvementFelipe Contreras, May 18, 2013
  17. 04/15 contrib: related: print the amount of involvementFelipe Contreras, May 18, 2013
  18. 05/15 contrib: related: add helper Person classesFelipe Contreras, May 18, 2013
  19. 06/15 contrib: related: show role countFelipe Contreras, May 18, 2013
  20. 07/15 contrib: related: add support for more rolesFelipe Contreras, May 18, 2013
  21. 08/15 contrib: related: group persons with same emailFelipe Contreras, May 18, 2013
  22. 09/15 contrib: related: add mailmap supportFelipe Contreras, May 18, 2013
  23. 10/15 contrib: related: allow usage on other directoriesFelipe Contreras, May 18, 2013
  24. 11/15 contrib: related: add support for multiple patchesFelipe Contreras, May 18, 2013
  25. 12/15 contrib: related: add option to show commitsFelipe Contreras, May 18, 2013
  26. 13/15 contrib: related: add option to parse from committishFelipe Contreras, May 18, 2013
  27. 14/15 contrib: related: parse committish like format-patchFelipe Contreras, May 18, 2013
  28. 15/15 contrib: related: fix parsing of rev-list argsFelipe Contreras, May 18, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.