Lower bound of the git log

git-gather will inspect the git log from the most recent of those three points:

The last change in the NEXT release having a commit property.
The last tagged version.
The beginning of time.

Change-like git message

Git messages are compared to the regular expression configured at `project.commit_regex`. If none is found, it defaults to

^(?<type>[^: ]+):(?<desc>.*?)(\[(?<ticket>[^\]]+)\])?$

The regular expression must capture a desc field, and may capture a type and ticket as well.

END_POD

use Path::Tiny;

with 'App::Changelord::Role::Changelog'; with 'App::Changelord::Role::Versions'; with 'App::Changelord::Role::ChangeTypes'; with 'App::Changelord::Role::GitRepo';

has commit_regex => ( is => 'lazy' );

sub _build_commit_regex($self) { my $regex = $self->changelog->{project}{commit_regex}; my $default = '^(?<type>[^: ]+):(?<desc>.*?)(\[(?<ticket>[^\]]+)\])?$'; if(!$regex) { warn "project.commit_regex not configured, using the default /$default/\n"; $regex = $default; } return $regex; }

sub lower_bound($self) { # either the most recent commit in the current release my @sha1s = grep { $_ } map { $_->{commit} } grep { ref } $self->next_release->{changes}->@*;

return pop @sha1s if @sha1s;

return $self->latest_version;
}

sub get_commits($self,$since=undef) { return reverse $self->repo->run( 'log', '--pretty=format:%H %s', $since ? "$since.." : () ); }

sub munge_message($self,$message) { my $regex = $self->commit_regex;

$message =~ s/(\S+) //;
my $commit = $1;

return () unless $message =~ qr/$regex/;

return { %+, commit => $commit };
}

sub save_changelog($self) { my $src = $self->source;

path($src)->spew( App::Changelord::Command::Init::serialize_changelog($self) );
}

sub run ($self) {

say "let's check those git logs...";

# figure out lower bound
my $from = $self->lower_bound;

say "checking since ", ( $from || 'the dawn of time' );

my @messages = map { $self->munge_message($_) } $self->get_commits($from);

unless(@messages) {
    say "\nno change detected";
    return;
}

print "\n";
say "  * ", $_->{desc} for @messages;
print "\n";

push $self->next_release->{changes}->@*, @messages;

$self->save_changelog;

say $self->source, " updated";
}

1;

__END__

NAME

App::Changelord::Command::GitGather

VERSION

version 0.0.2

AUTHOR

Yanick Champoux <yanick@babyl.ca>

COPYRIGHT AND LICENSE

This software is copyright (c) 2022 by Yanick Champoux.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.