For example master..feature-a. Signed-off-by: Felipe Contreras <felipe.contreras@xxxxxxxxx> --- contrib/related/git-related | 57 +++++++++++++++++++++++++++++++----------- contrib/related/test-related.t | 10 ++++++++ 2 files changed, 53 insertions(+), 14 deletions(-) diff --git a/contrib/related/git-related b/contrib/related/git-related index 7e79d78..4f78304 100755 --- a/contrib/related/git-related +++ b/contrib/related/git-related @@ -1,10 +1,12 @@ #!/usr/bin/env ruby # This script finds people that might be interested in a patch -# usage: git related <files> +# usage: git related <files | rev-list options> $since = '5-years-ago' $min_percent = 10 +$files = [] +$rev_args = [] class Commit @@ -82,21 +84,36 @@ class Commits end end - def from_patches(files) + def scan_patch(f, id = nil) source = nil + f.each do |line| + case line + when /^From (\h+) (.+)$/ + id = $1 + @main_commits[id] = true + when /^---\s+(\S+)/ + source = $1 != '/dev/null' ? $1[2..-1] : nil + when /^@@ -(\d+)(?:,(\d+))?/ + get_blame(source, $1, $2, id) if source and id + end + end + end + + def from_patches(files) files.each do |file| - from = nil File.open(file) do |f| - f.each do |line| - case line - when /^From (\h+) (.+)$/ - from = $1 - @main_commits[from] = true - when /^---\s+(\S+)/ - source = $1 != '/dev/null' ? $1[2..-1] : nil - when /^@@ -(\d+)(?:,(\d+))?/ - get_blame(source, $1, $2, from) if source and from - end + scan_patch(f) + end + end + end + + def from_rev_args(args) + File.popen(%w[git rev-list --reverse] + args) do |p| + p.each do |e| + id = e.chomp + @main_commits[id] = true + File.popen(%w[git show -C --oneline] + [id]) do |p| + scan_patch(p, id) end end end @@ -104,8 +121,20 @@ class Commits end +ARGV.each do |e| + if File.exists?(e) + $files << e + else + $rev_args << e + end +end + commits = Commits.new -commits.from_patches(ARGV) +if $files.empty? + commits.from_rev_args($rev_args) +else + commits.from_patches($files) +end commits.import count_per_person = Hash.new(0) diff --git a/contrib/related/test-related.t b/contrib/related/test-related.t index 8102b3c..b623d69 100755 --- a/contrib/related/test-related.t +++ b/contrib/related/test-related.t @@ -64,4 +64,14 @@ test_expect_success "multiple patches" " test_cmp expected actual " +test_expect_success "from committish" " + git related -1 master | sort > actual && + cat > expected <<-EOF && + John Doe <john@xxxxxxx> + John Poppins <john@xxxxxxx> + Jon Stewart <jon@xxxxxxxxxxx> + EOF + test_cmp expected actual +" + test_done -- 1.8.4-fc -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html