Add options to git_changelog for use in major release note creation:
authorBruce Momjian <bruce@momjian.us>
Fri, 27 Apr 2012 21:15:41 +0000 (17:15 -0400)
committerBruce Momjian <bruce@momjian.us>
Fri, 27 Apr 2012 21:15:41 +0000 (17:15 -0400)
--details-after
--master-only
--oldest-first

src/tools/git_changelog

index 7276c11a5f6fe06cb7f5e753d53111f8c1dee55b..ee27764ae60ed7698e78ca818846092713874e26 100755 (executable)
@@ -40,10 +40,19 @@ my @BRANCHES = qw(master
 # Might want to make this parameter user-settable.
 my $timestamp_slop = 600;
 
+my $details_after = 0;
 my $post_date = 0;
+my $master_only = 0;
+my $oldest_first = 0;
 my $since;
-Getopt::Long::GetOptions('post-date' => \$post_date,
-                         'since=s' => \$since) || usage();
+my @output_buffer;
+my $output_line = '';
+
+Getopt::Long::GetOptions('details-after' => \$details_after,
+                        'master-only' => \$master_only,
+                        'post-date' => \$post_date,
+                        'oldest-first' => \$oldest_first,
+                        'since=s' => \$since) || usage();
 usage() if @ARGV;
 
 my @git = qw(git log --format=fuller --date=iso);
@@ -179,17 +188,17 @@ while (1) {
        last if !defined $best_branch;
        my $winner =
                $all_commits_by_branch{$best_branch}->[$position{$best_branch}];
-       printf "Author: %s\n", $winner->{'author'};
-       foreach my $c (@{$winner->{'commits'}}) {
-           printf "Branch: %s", $c->{'branch'};
-           if (defined $c->{'last_tag'}) {
-               printf " Release: %s", $c->{'last_tag'};
-           }
-           printf " [%s] %s\n", substr($c->{'commit'}, 0, 9), $c->{'date'};
+
+       # check for master-only
+       if (! $master_only || ($winner->{'commits'}[0]->{'branch'} eq 'master' &&
+           @{$winner->{'commits'}} == 1)) {
+               output_details($winner) if (! $details_after);
+               output_str("%s", $winner->{'message'} . "\n");
+               output_details($winner) if ($details_after);
+               unshift(@output_buffer, $output_line) if ($oldest_first);
+               $output_line = '';
        }
-       print "\n";
-       print $winner->{'message'};
-       print "\n";
+
        $winner->{'done'} = 1;
        for my $branch (@BRANCHES) {
                my $leader = $all_commits_by_branch{$branch}->[$position{$branch}];
@@ -200,6 +209,8 @@ while (1) {
        }
 }
 
+print @output_buffer if ($oldest_first);
+
 sub push_commit {
        my ($c) = @_;
        my $ht = hash_commit($c);
@@ -258,11 +269,38 @@ sub parse_datetime {
        return $gm - $tzoffset;
 }
 
+sub output_str {
+       ($oldest_first) ? ($output_line .= sprintf(shift, @_)) : printf(@_);
+}
+
+sub output_details {
+       my $item = shift;
+
+       if ($details_after) {
+               $item->{'author'} =~ m{^(.*?)\s*<[^>]*>$};
+               # output only author name, not email address
+               output_str("(%s)\n", $1);
+       } else {
+               output_str("Author: %s\n", $item->{'author'});
+       }
+       foreach my $c (@{$item->{'commits'}}) {
+           output_str("Branch: %s ", $c->{'branch'}) if (! $master_only);
+           if (defined $c->{'last_tag'}) {
+               output_str("Release: %s ", $c->{'last_tag'});
+           }
+           output_str("[%s] %s\n", substr($c->{'commit'}, 0, 9), $c->{'date'});
+       }
+       output_str("\n");
+}
+
 sub usage {
        print STDERR <<EOM;
-Usage: git_changelog [--post-date/-p] [--since=SINCE]
-    --post-date Show branches made after a commit occurred
-    --since     Print only commits dated since SINCE
+Usage: git_changelog [--details-after/-d] [--master-only/-m] [--oldest-first/-o] [--post-date/-p] [--since=SINCE]
+    --details-after Show branch and author info after the commit description
+    --master-only   Show commits made exclusively to the master branch
+    --oldest-first  Show oldest commits first
+    --post-date     Show branches made after a commit occurred
+    --since         Print only commits dated since SINCE
 EOM
        exit 1;
 }