summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--bin/git-comment.pl37
-rw-r--r--bin/man1/git-comment.131
2 files changed, 44 insertions, 24 deletions
diff --git a/bin/git-comment.pl b/bin/git-comment.pl
index f7d288ca..a46f43fe 100644
--- a/bin/git-comment.pl
+++ b/bin/git-comment.pl
@@ -28,6 +28,7 @@ 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,
@@ -36,13 +37,14 @@ GetOptions(
 	'min-group=i' => \$minGroup,
 	'min-repeat=i' => \$minRepeat,
 	'no-repeat' => \$noRepeat,
+	'pretty=s' => \$pretty,
 ) or die;
 
 sub printComment {
-	my ($indent, $abbrev, $summary, @body) = @_;
-	print "$indent$commentStart $abbrev $summary";
+	my ($indent, $summary, @body) = @_;
+	print "$indent$commentStart $summary";
 	if (@body) {
-		print "\n$indent$commentLead\n";
+		print "\n";
 		foreach (@body) {
 			print "$indent$commentLead";
 			print " $_" if $_;
@@ -56,37 +58,32 @@ sub printComment {
 
 my ($pipe, $ctx) = $repo->command_output_pipe('blame', '--porcelain', @ARGV);
 
-my ($commit, $nr, $group, $printed, %abbrev, %summary, %body, %nrs);
+my ($commit, $nr, $group, $printed, %message, %nrs);
 while (<$pipe>) {
 	chomp;
 	if (/^([[:xdigit:]]+) \d+ (\d+) (\d+)/) {
 		($commit, $nr, $group, $printed) = ($1, $2, $3, 0);
-		$abbrev{$commit} = 'dirty' if $commit =~ /^0+$/;
-		next if $abbrev{$commit};
-		my @body = $repo->command(
-			'show', '--no-patch', '--pretty=format:%h%n%b', $commit
+		next if $message{$commit};
+		if ($commit =~ /^0+$/) {
+			$message{$commit} = ['Not committed yet'];
+			next;
+		}
+		my @message = $repo->command(
+			'show', '--no-patch', "--pretty=$pretty", $commit
 		);
-		$abbrev{$commit} = shift @body;
-		$body{$commit} = \@body;
-
-	} elsif (/^summary (.*)/) {
-		$summary{$commit} = $1;
-
+		$message{$commit} = \@message;
 	} elsif (/^\t(\s*)(.*)/) {
 		my ($indent, $line) = ($1, $2);
-		unless ($printed || $line =~ /^}?$/) {
+		unless ($printed || $line =~ /^}?;?$/) {
 			$printed = 1;
 			if (
 				$group >= $minGroup &&
 				!($noRepeat && $nrs{$commit}) &&
 				!($nrs{$commit} && $nr < $nrs{$commit} + $minRepeat) &&
-				($all || @{$body{$commit}})
+				($all || @{$message{$commit}} > 1)
 			) {
 				$nrs{$commit} = $nr;
-				printComment(
-					$indent, $abbrev{$commit}, $summary{$commit},
-					@{$body{$commit}}
-				);
+				printComment($indent, @{$message{$commit}});
 			}
 		}
 		print "$indent$line\n";
diff --git a/bin/man1/git-comment.1 b/bin/man1/git-comment.1
index a981f839..8e958f30 100644
--- a/bin/man1/git-comment.1
+++ b/bin/man1/git-comment.1
@@ -1,4 +1,4 @@
-.Dd September  8, 2021
+.Dd September 10, 2021
 .Dt GIT-COMMENT 1
 .Os
 .
@@ -15,16 +15,26 @@
 .Op Fl \-min-group Ar lines
 .Op Fl \-min-repeat Ar lines
 .Op Fl \-no-repeat
+.Op Fl \-pretty Ar format
 .Op Ar options ...
 .Op Fl \-
 .Ar file
 .
 .Sh DESCRIPTION
-Annotates the given file with comments
-containing the commit messages
-of the revisions
+The
+.Nm
+command
+adds comments to a file
+showing the commit messages
 which last modified
 each group of lines.
+By default only commit messages with bodies
+and which modified groups of at least 2 lines
+are added.
+Each comment contains
+the abbreviated commit hash
+and the commit summary,
+followed by the commit body.
 .
 .Pp
 .Nm
@@ -75,6 +85,16 @@ The default is 30 lines.
 .
 .It Fl \-no-repeat
 Avoid repeating comments entirely.
+.
+.It Fl \-pretty Ar format
+Set the pretty-print format
+to use for commit messages.
+The default is the value of
+.Cm comment.pretty
+or
+.Ql format:%h\ %s%n%n%-b .
+See
+.Xr git-show 1 .
 .El
 .
 .Sh EXAMPLES
@@ -92,3 +112,6 @@ Add as many comments as possible:
 .Bd -literal -offset indent
 git comment --all --min-group 1 --min-repeat 1
 .Ed
+.
+.Sh SEE ALSO
+.Xr git-blame 1