mirror of https://github.com/postgres/postgres
Reported-by: jian he Discussion: https://postgr.es/m/ZuYsS5XdA7hVcV9l@momjian.us Backpatch-through: 12REL_14_STABLE
parent
7721fff06c
commit
a499f79fd0
@ -0,0 +1,136 @@ |
||||
#! /usr/bin/perl |
||||
|
||||
################################################################# |
||||
# add_commit_links.pl -- add commit links to the release notes |
||||
# |
||||
# Copyright (c) 2024, PostgreSQL Global Development Group |
||||
# |
||||
# src/tools/add_commit_links.pl |
||||
################################################################# |
||||
|
||||
# |
||||
# This script adds commit links to the release notes. |
||||
# |
||||
# Usage: cd to top of source tree and issue |
||||
# src/tools/add_commit_links.pl release_notes_file |
||||
# |
||||
# The script can add links for release note items that lack them, and update |
||||
# those that have them. The script is sensitive to the release note file being |
||||
# in a specific format: |
||||
# |
||||
# * File name contains the major version number preceded by a dash |
||||
# and followed by a period |
||||
# * Commit text is generated by src/tools/git_changelog |
||||
# * SGML comments around commit text start in the first column |
||||
# * The commit item title ends with an attribution that ends with |
||||
# a closing parentheses |
||||
# * previously added URL link text is unmodified |
||||
# * a "<para>" follows the commit item title |
||||
# |
||||
# The major version number is used to select the commit hash for minor |
||||
# releases. An error will be generated if valid commits are found but |
||||
# no proper location for the commit links is found. |
||||
|
||||
use strict; |
||||
use warnings FATAL => 'all'; |
||||
|
||||
sub process_file |
||||
{ |
||||
my $file = shift; |
||||
|
||||
my $in_comment = 0; |
||||
my $prev_line_ended_with_paren = 0; |
||||
my $prev_leading_space = ''; |
||||
my $lineno = 0; |
||||
|
||||
my @hashes = (); |
||||
|
||||
my $tmpfile = $file . '.tmp'; |
||||
|
||||
# Get major version number from the file name. |
||||
$file =~ m/-(\d+)\./; |
||||
my $major_version = $1; |
||||
|
||||
open(my $fh, '<', $file) || die "could not open file %s: $!\n", $file; |
||||
open(my $tfh, '>', $tmpfile) || die "could not open file %s: $!\n", |
||||
$tmpfile; |
||||
|
||||
while (<$fh>) |
||||
{ |
||||
$lineno++; |
||||
|
||||
$in_comment = 1 if (m/^<!--/); |
||||
|
||||
# skip over commit links because we will add them below |
||||
next |
||||
if (!$in_comment && |
||||
m{^\s*<ulink url="&commit_baseurl;[\da-f]+">§</ulink>\s*$}); |
||||
|
||||
if ($in_comment && m/\[([\da-f]+)\]/) |
||||
{ |
||||
my $hash = $1; |
||||
|
||||
# major release item |
||||
(!m/^Branch:/) && push(@hashes, $hash); |
||||
|
||||
# minor release item |
||||
m/^Branch:/ && |
||||
defined($major_version) && |
||||
m/_${major_version}_/ && |
||||
push(@hashes, $hash); |
||||
} |
||||
|
||||
if (!$in_comment && m{</para>}) |
||||
{ |
||||
if (@hashes) |
||||
{ |
||||
if ($prev_line_ended_with_paren) |
||||
{ |
||||
for my $hash (@hashes) |
||||
{ |
||||
print({$tfh} |
||||
"$prev_leading_space<ulink url=\"&commit_baseurl;$hash\">§</ulink>\n" |
||||
); |
||||
} |
||||
@hashes = (); |
||||
} |
||||
else |
||||
{ |
||||
printf( |
||||
"hashes found but no matching text found for placement on line %s\n", |
||||
$lineno); |
||||
exit(1); |
||||
} |
||||
} |
||||
} |
||||
|
||||
print({$tfh} $_); |
||||
|
||||
$prev_line_ended_with_paren = m/\)\s*$/; |
||||
|
||||
m/^(\s*)/; |
||||
$prev_leading_space = $1; |
||||
|
||||
$in_comment = 0 if (m/^-->/); |
||||
} |
||||
|
||||
close($fh); |
||||
close($tfh); |
||||
|
||||
rename($tmpfile, $file) || die "could not rename %s to %s: $!\n", |
||||
$tmpfile, |
||||
$file; |
||||
|
||||
return; |
||||
} |
||||
|
||||
if (@ARGV == 0) |
||||
{ |
||||
printf(STDERR "Usage: %s release_notes_file [...]\n", $0); |
||||
exit(1); |
||||
} |
||||
|
||||
for my $file (@ARGV) |
||||
{ |
||||
process_file($file); |
||||
} |
Loading…
Reference in new issue