@@ -26,9 +26,8 @@ def initialize(repo_path)
26
26
@repo_path = repo_path
27
27
end
28
28
29
- # TODO: should we generate info for each revision between oldrev and newrev?
30
- def build ( _oldrev , newrev , refname )
31
- diffs = build_diffs ( newrev )
29
+ def build ( oldrev , newrev , refname )
30
+ diffs = build_diffs ( oldrev , newrev )
32
31
33
32
info = CommitEmailInfo . new
34
33
info . author = git_show ( newrev , format : '%an' )
@@ -81,14 +80,13 @@ def find_files(diffs, status:)
81
80
# }
82
81
# }
83
82
# }
84
- def build_diffs ( revision )
83
+ def build_diffs ( oldrev , newrev )
85
84
diffs = { }
86
85
87
- # Using "#{revision}^" instead of oldrev to exclude diff from unrelated revision
88
- numstats = git ( 'diff' , '--numstat' , "#{ revision } ^" , revision ) . lines . map { |l | l . strip . split ( "\t " , 3 ) }
89
- git ( 'diff' , '--name-status' , "#{ revision } ^" , revision ) . each_line do |line |
86
+ numstats = git ( 'diff' , '--numstat' , oldrev , newrev ) . lines . map { |l | l . strip . split ( "\t " , 3 ) }
87
+ git ( 'diff' , '--name-status' , oldrev , newrev ) . each_line do |line |
90
88
status , path , _newpath = line . strip . split ( "\t " , 3 )
91
- diff = build_diff ( revision , path , numstats )
89
+ diff = build_diff ( path , numstats )
92
90
93
91
case status
94
92
when 'A'
@@ -109,7 +107,7 @@ def build_diffs(revision)
109
107
diffs
110
108
end
111
109
112
- def build_diff ( revision , path , numstats )
110
+ def build_diff ( path , numstats )
113
111
diff = { added : 0 , deleted : 0 } # :body not implemented because not used
114
112
line = numstats . find { |( _added , _deleted , file , *) | file == path }
115
113
return diff if line . nil?
@@ -468,9 +466,11 @@ def main(repo_path, to, rest)
468
466
end
469
467
]
470
468
when "git"
471
- infos = args . each_slice ( 3 ) . map do |oldrev , newrev , refname |
472
- p [ oldrev , newrev , refname ]
473
- GitInfoBuilder . new ( repo_path ) . build ( oldrev , newrev , refname )
469
+ infos = args . each_slice ( 3 ) . flat_map do |oldrev , newrev , refname |
470
+ revisions = IO . popen ( [ 'git' , 'log' , '--pretty=%H' , "#{ oldrev } ^..#{ newrev } " ] , &:read ) . lines . map ( &:strip )
471
+ revisions [ 0 ..-2 ] . zip ( revisions [ 1 ..-1 ] ) . map do |old , new |
472
+ GitInfoBuilder . new ( repo_path ) . build ( old , new , refname )
473
+ end
474
474
end
475
475
else
476
476
raise "unsupported vcs #{ options . vcs . inspect } is specified"
@@ -483,6 +483,8 @@ def main(repo_path, to, rest)
483
483
}
484
484
to = [ to , *options . to ]
485
485
infos . each do |info |
486
+ puts "#{ info . branches . join ( ', ' ) } : #{ info . revision } (#{ info . author } )"
487
+
486
488
from = options . from || info . author_email
487
489
sendmail ( to , from , make_mail ( to , from , info , params ) )
488
490
0 commit comments