my @choices = ( $self->section_choices, $self->action_choices );
$self->_iterate_commits(
sub {
- my $log = shift;
- say "";
+ my ($log, $i, $count) = @_;
+ say "\n### Commit @{[$i+1]} of $count ###";
say "-" x 75;
$self->show_header($log);
$self->show_body($log, 1);
+ $self->show_files($log);
say "-" x 75;
return $self->dispatch( $self->prompt( @choices ), $log);
}
my @choices = ( $self->review_choices, $self->action_choices );
$self->_iterate_commits(
sub {
- my $log = shift;
- say "";
+ my ($log, $i, $count) = @_;
+ say "\n### Commit @{[$i+1]} of $count ###";
say "-" x 75;
$self->show_header($log);
$self->show_notes($log, 1);
my ($self, $fcn) = @_;
my $type = $self->opt('type');
say STDERR "Scanning for $type commits since " . $self->last_tag . "...";
- for my $log ( $self->find_commits($type) ) {
- redo unless $fcn->($log);
+ my $list = [ $self->find_commits($type) ];
+ my $count = @$list;
+ while ( my ($i,$log) = each @$list ) {
+ redo unless $fcn->($log, $i, $count);
}
return 1;
}
else {
warn("No VISUAL or EDITOR defined");
}
- $tempfh->seek(0,0);
- return do { local $/; <$tempfh> };
+ return do { local (@ARGV,$/) = "$tempfh"; <> };
}
sub find_commits {
my ($self, $type) = @_;
$type //= 'new';
my @commits = $self->git->log($self->last_tag . "..HEAD");
- $_ = Git::Wrapper::XLog->from_log($_) for @commits;
+ $_ = Git::Wrapper::XLog->from_log($_, $self->git) for @commits;
my @list;
if ( $type eq 'new' ) {
@list = grep { ! $_->notes } @commits;
return;
}
+sub show_files {
+ my ($self, $log) = @_;
+ my @files = $self->git->diff_tree({r => 1, abbrev => 1}, $log->id);
+ shift @files; # throw away commit line
+ return unless @files;
+ say "\nChanged:";
+ say join("\n", map { " * $_" } sort map { /.*\s+(\S+)/; $1 } @files);
+ return;
+}
+
sub show_header {
my ($self, $log) = @_;
my $header = $log->short_id;
$header .= " " . $log->subject if length $log->subject;
+ $header .= sprintf(' (%s)', $log->author) if $log->author;
say colored( $header, "yellow");
return;
}
sub subject { shift->attr->{subject} }
sub body { shift->attr->{body} }
sub short_id { shift->attr->{short_id} }
+sub author { shift->attr->{author} }
sub from_log {
- my ($class, $log) = @_;
+ my ($class, $log, $git) = @_;
my $msg = $log->message;
my ($subject, $body) = $msg =~ m{^([^\n]+)\n*(.*)}ms;
$body //= '';
$body =~ s/[\r\n]*\z//ms;
- my ($short) = Git::Wrapper->new(".")->rev_parse({short => 1}, $log->id);
+ my ($short) = $git->rev_parse({short => 1}, $log->id);
$log->attr->{subject} = $subject;
$log->attr->{body} = $body;