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

Re: [PATCH v7] Add new git-related helper to contrib

From
Ramkumar Ramachandra <artagnon@gmail.com>
Date
May 30, 2013, 09:01 UTC
Message-ID
<CALkWK0=ZbOy6sXOvnTNAqz_UBsUymY1CR_WczT-O3Q+18HJjzQ@mail.gmail.com>
In-Reply-To
<1369884777-7227-1-git-send-email-felipe.contreras@gmail.com>
Let's do one more review.
Felipe Contreras wrote:
Show 17 quoted lines
> diff --git a/contrib/related/git-related b/contrib/related/git-related
> new file mode 100755
> index 0000000..1b9b1e7
> --- /dev/null
> +++ b/contrib/related/git-related
> @@ -0,0 +1,120 @@
> +#!/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
> +
> +class Commit
> +
> +  attr_reader :persons

Unless you plan to introduce many more fields (I haven't looked at the later patches), you might as well implement an #each, like in Commits.

Show 7 quoted lines
> +  def initialize(id)
> +    @id = id
> +    @persons = []
> +  end
> +
> +  def parse(data)
> +    msg = nil
msg = false, to indicate that it is a boolean.
Show 5 quoted lines
> +    data.each_line do |line|
> +      if not msg
> +        case line
> +        when /^author ([^<>]+) <(\S+)> (.+)$/
> +          @persons << '%s <%s>' % [$1, $2]
Why capture the third group when $3 is unused?
Show 6 quoted lines
> +        when /^$/
> +          msg = true
> +        end
> +      else
> +        if line =~ /^(Signed-off|Reviewed|Acked)-by: ([^<>]+) <(\S+?)>$/
> +          @persons << '%s <%s>' % [$2, $3]
Why capture the first group when $1 is unused?
Show 25 quoted lines
> +        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|
Don't you need rb+ to suppress the CRLF nonsense on Windows?
> +      p.write(@items.keys.join("\n"))

As you might have realized, the parentheses are optional everywhere (except when it is required for disambiguation). I'm merely pointing it out here, because this line looks especially ugly.

> +      p.close_write
> +      p.each do |line|
> +        if line =~ /^(\h{40}) commit (\d+)/
> +          id, len = $1, $2
id, len = $1, Integer $2.  And drop the .to_i on the next line.
Show 10 quoted lines
> +          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
I asked you to use 'len =1 if not len' for clarity, but you didn't like it.
Show 17 quoted lines
> +    File.popen(['git', 'blame', '--incremental', '-C', '-C',
> +               '-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|
File.readlines(file).each do |line|.
> +        case line
> +        when /^From (\h+) (.+)$/
> +          from = $1
Useless capture.
> +        when /^---\s+(\S+)/
> +          source = $1 != '/dev/null' ? $1[2..-1] : nil
> +        when /^@@ -(\d+)(?:,(\d+))?/
> +          get_blame(source, $1, $2, from) if source and from
Useless capture.  When is len ($2) going to be nil?
Show 16 quoted lines
> +        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|
commits.each do |_, commit|, since you're not using id.
Show 7 quoted lines
> +  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
I prefer 'Float count' over count.to_f, but that's just a matter of taste.
Show 5 quoted lines
> +  next if percent < $min_percent
> +  puts person
> +end
> --
> 1.8.3.rc3.312.g47657de
Previous: Felipe ContrerasNext: Felipe Contreras
Message 2 of 9 in “Add new git-related helper to contrib”
  1. Add new git-related helper to contribFelipe Contreras, May 30, 2013
  2. Ramkumar RamachandraMay 30, 2013
  3. Felipe ContrerasMay 30, 2013
  4. Ramkumar RamachandraMay 30, 2013
  5. Felipe ContrerasMay 30, 2013
  6. Felipe ContrerasMay 31, 2013
  7. Ramkumar RamachandraMay 31, 2013
  8. Felipe ContrerasMay 31, 2013
  9. Ramkumar RamachandraMay 31, 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.