Advertisement
Guest User

Untitled

a guest
Jul 1st, 2016
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.30 KB | None | 0 0
  1. #! /usr/bin/ruby -w
  2.  
  3. require 'date'
  4. require 'find'
  5.  
  6. # TODO
  7. # - make work with -p option
  8.  
  9. def main
  10. logopts = "--color=always --since=#{Date.today - 3} #{ARGV.join(' ')}"
  11. puts merged_commits('.', logopts: logopts).join("\n")
  12. end
  13.  
  14. def usage
  15. # TODO
  16. end
  17.  
  18. def repositories(path)
  19. Enumerator.new do |yielder|
  20. Find.find(path) do |f|
  21. if File.basename(f) == '.git'
  22. yielder.yield File.dirname(f)
  23. Find.prune
  24. end
  25. end
  26. end
  27. end
  28.  
  29. def commits(repo, options = {})
  30. Dir.chdir(repo) do
  31. `git log -z --stat #{options[:logopts]}`.split("\0").tap do
  32. st = $?.exitstatus
  33. raise "git error: #{st}" unless st == 0
  34. end
  35. end
  36. end
  37.  
  38. def commits_by_date(repo, options = {})
  39. Hash.new { |h, d| h[d] = [] }.tap do |by_date|
  40. commits(repo, options).each do |commit|
  41. date = DateTime.parse(commit[/^Date:\s*(.+)$/, 1])
  42. by_date[date] << commit
  43. end
  44. end
  45. end
  46.  
  47. def insert_prefix(enum, prefix)
  48. enum.map { |e| prefix + e }
  49. end
  50.  
  51. def merged_commits(path, options = {})
  52. merged = Hash.new { |h, d| h[d] = [] }
  53.  
  54. repositories(path).each do |repo|
  55. banner = "\e[01;34mRepository: #{repo}\e[0m\n"
  56.  
  57. commits_by_date(repo, options).each do |date, commits|
  58. merged[date] += insert_prefix(commits, banner)
  59. end
  60. end
  61.  
  62. merged.sort_by(&:first).map(&:last).reverse
  63. end
  64.  
  65.  
  66. main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement