Patch to git_changelog for release note creation - Mailing list pgsql-hackers

From Bruce Momjian
Subject Patch to git_changelog for release note creation
Date
Msg-id 201103150226.p2F2QVT17350@momjian.us
Whole thread Raw
Responses Re: Patch to git_changelog for release note creation
List pgsql-hackers
I would like to apply the attached patch to git_changelog for use in
creating the major release notes.  I specifically added these flags:

    --author-after  Show author after the commit
    --master-only   Show commits made exclusively to the master branch
    --reverse-order Show commits in reverse date order

The default output is unaffected.

--
  Bruce Momjian  <bruce@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +
diff --git a/src/tools/git_changelog b/src/tools/git_changelog
new file mode 100755
index af76f6d..3cd5af4
*** a/src/tools/git_changelog
--- b/src/tools/git_changelog
*************** my @BRANCHES = qw(master REL9_0_STABLE R
*** 43,51 ****
  # Might want to make this parameter user-settable.
  my $timestamp_slop = 600;

  my $post_date = 0;
  my $since;
! Getopt::Long::GetOptions('post-date' => \$post_date,
                           'since=s' => \$since) || usage();
  usage() if @ARGV;

--- 43,60 ----
  # Might want to make this parameter user-settable.
  my $timestamp_slop = 600;

+ my $author_after = 0;
  my $post_date = 0;
+ my $master_only = 0;
+ my $reverse_order = 0;
  my $since;
! my @output_buffer;
! my $output_line = '';
!
! Getopt::Long::GetOptions('author-after' => \$author_after,
!              'master-only' => \$master_only,
!              'post-date' => \$post_date,
!              'reverse-order' => \$reverse_order,
                           'since=s' => \$since) || usage();
  usage() if @ARGV;

*************** while (1) {
*** 193,211 ****
      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'};
      }
!     print "Commit-Order-Inversions: $best_inversions\n"
!         if $best_inversions != 0;
!     print "\n";
!     print $winner->{'message'};
!     print "\n";
      $winner->{'done'} = 1;
      for my $branch (@BRANCHES) {
          my $leader = $all_commits_by_branch{$branch}->[$position{$branch}];
--- 202,229 ----
      last if !defined $best_branch;
      my $winner =
          $all_commits_by_branch{$best_branch}->[$position{$best_branch}];
!
!     # check for master-only
!     if (! $master_only || ($winner->{'commits'}[0]->{'branch'} eq 'master' &&
!         @{$winner->{'commits'}} == 1)) {
!         output_entry("Author: %s\n", $winner->{'author'}) if (! $author_after);
!         foreach my $c (@{$winner->{'commits'}}) {
!             output_entry("Branch: %s ", $c->{'branch'}) if (! $master_only);
!             if (defined $c->{'last_tag'}) {
!             output_entry("Release: %s ", $c->{'last_tag'});
!             }
!             output_entry("[%s] %s\n", substr($c->{'commit'}, 0, 9), $c->{'date'});
!         }
!         output_entry("Commit-Order-Inversions: $best_inversions\n")
!             if $best_inversions != 0;
!         output_entry("\n");
!         output_entry("%s", $winner->{'message'});
!         output_entry("%s\n", $winner->{'author'}) if ($author_after);
!         output_entry("\n");
!         unshift(@output_buffer, $output_line) if ($reverse_order);
!         $output_line = '';
      }
!
      $winner->{'done'} = 1;
      for my $branch (@BRANCHES) {
          my $leader = $all_commits_by_branch{$branch}->[$position{$branch}];
*************** while (1) {
*** 216,221 ****
--- 234,241 ----
      }
  }

+ print @output_buffer if ($reverse_order);
+
  sub push_commit {
      my ($c) = @_;
      my $ht = hash_commit($c);
*************** sub parse_datetime {
*** 274,284 ****
      return $gm - $tzoffset;
  }

  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
  EOM
      exit 1;
  }
--- 294,316 ----
      return $gm - $tzoffset;
  }

+ sub output_entry {
+     if (! $reverse_order) {
+         printf(@_);
+     } else {
+         my $fmt = shift;
+         $output_line .= sprintf($fmt, @_);
+     }
+ }
+
  sub usage {
      print STDERR <<EOM;
! Usage: git_changelog [--author-after/-a] [--master-only/-m] [--post-date/-p] [--reverse-order/-r] [--since=SINCE]
!     --author-after  Show author after the commit
!     --master-only   Show commits made exclusively to the master branch
!     --post-date     Show branches made after a commit occurred
!     --reverse-order Show commits in reverse date order
!     --since         Print only commits dated since SINCE
  EOM
      exit 1;
  }

pgsql-hackers by date:

Previous
From: Josh Berkus
Date:
Subject: Re: Better estimates of index correlation
Next
From: Robert Haas
Date:
Subject: Re: really lazy vacuums?