summary refs log tree commit diff
path: root/bin/git-comment.pl
blob: 64361a605412357a5cf3a1639c294e7cfb70ba1f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#!/usr/bin/env perl
# Copyright (C) 2021  C. McEnroe <june@causal.agency>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# MacPorts is strange.
use lib (split(/:/, $ENV{GITPERLLIB} || '/opt/local/share/perl5'));

use strict;
use warnings;
use Getopt::Long qw(:config pass_through);
use Git;

my $repo = Git->repository();

my ($all, $minGroup, $minRepeat, $noRepeat) = (0, 2, 30, 0);
my $commentStart = $repo->config('comment.start') // "/*";
my $commentLead = $repo->config('comment.lead') // " *";
my $commentEnd = $repo->config('comment.end') // " */";
my $pretty = $repo->config('comment.pretty') // 'format:%h %s%n%n%-b';
GetOptions(
	'all' => \$all,
	'comment-start=s' => \$commentStart,
	'comment-lead=s' => \$commentLead,
	'comment-end:s' => \$commentEnd,
	'min-group=i' => \$minGroup,
	'min-repeat=i' => \$minRepeat,
	'no-repeat' => \$noRepeat,
	'pretty=s' => \$pretty,
) or die;

sub printComment {
	my ($indent, $summary, @body) = @_;
	print "$indent$commentStart $summary";
	if (@body) {
		print "\n";
		foreach (@body) {
			print "$indent$commentLead";
			print " $_" if $_;
			print "\n";
		}
		print "$indent$commentEnd\n" if $commentEnd;
	} else {
		print "$commentEnd\n";
	}
}

my ($pipe, $ctx) = $repo->command_output_pipe('blame', '--porcelain', @ARGV);

my ($commit, $nr, $group, $printed, %message, %nrs);
while (<$pipe>) {
	chomp;
	if (/^([[:xdigit:]]+) \d+ (\d+) (\d+)/) {
		($commit, $nr, $group, $printed) = ($1, $2, $3, 0);
		next if $message{$commit};
		if ($commit =~ /^0+$/) {
			$message{$commit} = ['Not committed yet'];
			next;
		}
		my @message = $repo->command(
			'show', '--no-patch', "--pretty=$pretty", $commit
		);
		$message{$commit} = \@message;
	} elsif (/^\t(\s*)(.*)/) {
		my ($indent, $line) = ($1, $2);
		unless ($printed || $line =~ /^[})]?;?$/) {
			$printed = 1;
			if (
				$group >= $minGroup &&
				!($noRepeat && $nrs{$commit}) &&
				!($nrs{$commit} && $nr < $nrs{$commit} + $minRepeat) &&
				($all || @{$message{$commit}} > 1)
			) {
				$nrs{$commit} = $nr;
				printComment($indent, @{$message{$commit}});
			}
		}
		print "$indent$line\n";
	}
}

$repo->command_close_pipe($pipe, $ctx);
ible Life of Addie LaRueJune McEnroe So good, but so long. Reminded me of The Ten Thousand Doors of January at the beginning, and more of that N. K. Jemisin series about gods later. I like this interacting with gods and becoming something like one sort of thing. God, it took me a whole month (more?) to read and this is only my third book of the year :( I need some more novellas to read, but the other books I have from the library currently are also thick. 2022-03-22Source ~/.profile.local if it existsJune McEnroe 2022-03-18Publish "Addendum 2021"June McEnroe 2022-03-16Remove wcwidth portJune McEnroe DYLD_FORCE_FLAT_NAMESPACE no longer exists in macOS 12 so this approach doesn't work anymore. Moved to <https://git.causal.agency/jorts/tree/wcwidth> and compiled into <https://git.causal.agency/jorts/tree/ncurses>. 2022-03-16Remove -j4 from ./PlanJune McEnroe Plan learned to set this automatically! 2022-03-15Rewrite Linux install.sh for DebianJune McEnroe 2022-03-15Remove dashJune McEnroe