<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.postgresql.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bmomjian</id>
	<title>PostgreSQL wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.postgresql.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bmomjian"/>
	<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/wiki/Special:Contributions/Bmomjian"/>
	<updated>2026-06-10T02:28:54Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43711</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43711"/>
		<updated>2026-06-08T14:10:56Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: adjust order&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The major release notes attempt to document every user-visible and user-impactful change.  Performance improvements are not mentioned unless they are user-visible (e.g., new syntax) or significant enough to enable new workloads.  Similarly, while the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers or Postgres forks because doing so would include too many items that would be uninteresting to the general audience.  &lt;br /&gt;
&lt;br /&gt;
0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_18_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        cmd = &amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | wc -l&amp;quot;;&lt;br /&gt;
                        cmd | getline lines;&lt;br /&gt;
                        close(cmd);&lt;br /&gt;
&lt;br /&gt;
                        cmd = &amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -c \&amp;quot;^doc/\&amp;quot;&amp;quot;;&lt;br /&gt;
                        cmd | getline doc_lines;&lt;br /&gt;
                        close(cmd);&lt;br /&gt;
&lt;br /&gt;
                        if (doc_lines &amp;gt; 0)&lt;br /&gt;
                        {&lt;br /&gt;
                                # skip commit subject line&lt;br /&gt;
                                if (doc_lines &amp;lt; lines - 1)&lt;br /&gt;
                                        doc = &amp;quot;[DOC &amp;amp; CODE]&amp;quot;;&lt;br /&gt;
                                else&lt;br /&gt;
                                        doc = &amp;quot;[DOC ONLY]&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
                I use MicroEmacs 4 [https://momjian.us/download/uemacs4_pg.mac macros] to do this.&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC &amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC //&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of sections&lt;br /&gt;
                most important item first in section&lt;br /&gt;
                   if none, then largest group first&lt;br /&gt;
                group similar items together&lt;br /&gt;
                order group by item importance&lt;br /&gt;
                ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. To show commits that were excluded, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usage:  command git_changelog_output release_notes&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;quot;!=&amp;quot; string to compare all commit hashes in the release notes.&lt;br /&gt;
PATTERN=$(awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {first = &amp;quot;Y&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (first != &amp;quot;Y&amp;quot;)&lt;br /&gt;
                                printf(&amp;quot; &amp;amp;&amp;amp; &amp;quot;);&lt;br /&gt;
                        first=&amp;quot;N&amp;quot;;&lt;br /&gt;
                        printf(&amp;quot;$2 != \&amp;quot;&amp;quot; $2 &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&#039; &amp;quot;$2&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^Author: /)&lt;br /&gt;
                        save_author=$0;&lt;br /&gt;
                else if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (&#039;&amp;quot;$PATTERN&amp;quot;&#039;)&lt;br /&gt;
                        {&lt;br /&gt;
                                print save_author;&lt;br /&gt;
                                print $0;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                                save_author=&amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else if (save_author != &amp;quot;&amp;quot;)&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and then run the script in #2 to add &amp;quot;[DOC&amp;quot; markers;  email to pgsql-hackers@lists.postgresql.org.&lt;br /&gt;
&lt;br /&gt;
13. Do the following after community feedbackscript, hopefully before beta1&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
14.  Do this near the final release date so diff analysis is easier&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43710</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43710"/>
		<updated>2026-06-08T13:40:50Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: grouping details&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The major release notes attempt to document every user-visible and user-impactful change.  Performance improvements are not mentioned unless they are user-visible (e.g., new syntax) or significant enough to enable new workloads.  Similarly, while the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers or Postgres forks because doing so would include too many items that would be uninteresting to the general audience.  &lt;br /&gt;
&lt;br /&gt;
0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_18_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        cmd = &amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | wc -l&amp;quot;;&lt;br /&gt;
                        cmd | getline lines;&lt;br /&gt;
                        close(cmd);&lt;br /&gt;
&lt;br /&gt;
                        cmd = &amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -c \&amp;quot;^doc/\&amp;quot;&amp;quot;;&lt;br /&gt;
                        cmd | getline doc_lines;&lt;br /&gt;
                        close(cmd);&lt;br /&gt;
&lt;br /&gt;
                        if (doc_lines &amp;gt; 0)&lt;br /&gt;
                        {&lt;br /&gt;
                                # skip commit subject line&lt;br /&gt;
                                if (doc_lines &amp;lt; lines - 1)&lt;br /&gt;
                                        doc = &amp;quot;[DOC &amp;amp; CODE]&amp;quot;;&lt;br /&gt;
                                else&lt;br /&gt;
                                        doc = &amp;quot;[DOC ONLY]&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
                I use MicroEmacs 4 [https://momjian.us/download/uemacs4_pg.mac macros] to do this.&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC &amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC //&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of sections&lt;br /&gt;
        most important item first in section&lt;br /&gt;
           if none, then largest group first&lt;br /&gt;
        most important items first in each group&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. To show commits that were excluded, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usage:  command git_changelog_output release_notes&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;quot;!=&amp;quot; string to compare all commit hashes in the release notes.&lt;br /&gt;
PATTERN=$(awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {first = &amp;quot;Y&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (first != &amp;quot;Y&amp;quot;)&lt;br /&gt;
                                printf(&amp;quot; &amp;amp;&amp;amp; &amp;quot;);&lt;br /&gt;
                        first=&amp;quot;N&amp;quot;;&lt;br /&gt;
                        printf(&amp;quot;$2 != \&amp;quot;&amp;quot; $2 &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&#039; &amp;quot;$2&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^Author: /)&lt;br /&gt;
                        save_author=$0;&lt;br /&gt;
                else if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (&#039;&amp;quot;$PATTERN&amp;quot;&#039;)&lt;br /&gt;
                        {&lt;br /&gt;
                                print save_author;&lt;br /&gt;
                                print $0;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                                save_author=&amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else if (save_author != &amp;quot;&amp;quot;)&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and then run the script in #2 to add &amp;quot;[DOC&amp;quot; markers;  email to pgsql-hackers@lists.postgresql.org.&lt;br /&gt;
&lt;br /&gt;
13. Do the following after community feedbackscript, hopefully before beta1&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
14.  Do this near the final release date so diff analysis is easier&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43649</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43649"/>
		<updated>2026-06-01T14:22:12Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: move section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The major release notes attempt to document every user-visible and user-impactful change.  Performance improvements are not mentioned unless they are user-visible (e.g., new syntax) or significant enough to enable new workloads.  Similarly, while the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers or Postgres forks because doing so would include too many items that would be uninteresting to the general audience.  &lt;br /&gt;
&lt;br /&gt;
0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_18_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        cmd = &amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | wc -l&amp;quot;;&lt;br /&gt;
                        cmd | getline lines;&lt;br /&gt;
                        close(cmd);&lt;br /&gt;
&lt;br /&gt;
                        cmd = &amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -c \&amp;quot;^doc/\&amp;quot;&amp;quot;;&lt;br /&gt;
                        cmd | getline doc_lines;&lt;br /&gt;
                        close(cmd);&lt;br /&gt;
&lt;br /&gt;
                        if (doc_lines &amp;gt; 0)&lt;br /&gt;
                        {&lt;br /&gt;
                                # skip commit subject line&lt;br /&gt;
                                if (doc_lines &amp;lt; lines - 1)&lt;br /&gt;
                                        doc = &amp;quot;[DOC &amp;amp; CODE]&amp;quot;;&lt;br /&gt;
                                else&lt;br /&gt;
                                        doc = &amp;quot;[DOC ONLY]&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
                I use MicroEmacs 4 [https://momjian.us/download/uemacs4_pg.mac macros] to do this.&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC &amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC //&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. To show commits that were excluded, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usage:  command git_changelog_output release_notes&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;quot;!=&amp;quot; string to compare all commit hashes in the release notes.&lt;br /&gt;
PATTERN=$(awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {first = &amp;quot;Y&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (first != &amp;quot;Y&amp;quot;)&lt;br /&gt;
                                printf(&amp;quot; &amp;amp;&amp;amp; &amp;quot;);&lt;br /&gt;
                        first=&amp;quot;N&amp;quot;;&lt;br /&gt;
                        printf(&amp;quot;$2 != \&amp;quot;&amp;quot; $2 &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&#039; &amp;quot;$2&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^Author: /)&lt;br /&gt;
                        save_author=$0;&lt;br /&gt;
                else if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (&#039;&amp;quot;$PATTERN&amp;quot;&#039;)&lt;br /&gt;
                        {&lt;br /&gt;
                                print save_author;&lt;br /&gt;
                                print $0;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                                save_author=&amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else if (save_author != &amp;quot;&amp;quot;)&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and then run the script in #2 to add &amp;quot;[DOC&amp;quot; markers;  email to pgsql-hackers@lists.postgresql.org.&lt;br /&gt;
&lt;br /&gt;
13. Do the following after community feedbackscript, hopefully before beta1&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
14.  Do this near the final release date so diff analysis is easier&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43648</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43648"/>
		<updated>2026-06-01T14:12:49Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: add 14.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_18_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        cmd = &amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | wc -l&amp;quot;;&lt;br /&gt;
                        cmd | getline lines;&lt;br /&gt;
                        close(cmd);&lt;br /&gt;
&lt;br /&gt;
                        cmd = &amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -c \&amp;quot;^doc/\&amp;quot;&amp;quot;;&lt;br /&gt;
                        cmd | getline doc_lines;&lt;br /&gt;
                        close(cmd);&lt;br /&gt;
&lt;br /&gt;
                        if (doc_lines &amp;gt; 0)&lt;br /&gt;
                        {&lt;br /&gt;
                                # skip commit subject line&lt;br /&gt;
                                if (doc_lines &amp;lt; lines - 1)&lt;br /&gt;
                                        doc = &amp;quot;[DOC &amp;amp; CODE]&amp;quot;;&lt;br /&gt;
                                else&lt;br /&gt;
                                        doc = &amp;quot;[DOC ONLY]&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
                I use MicroEmacs 4 [https://momjian.us/download/uemacs4_pg.mac macros] to do this.&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC &amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC //&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. To show commits that were excluded, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usage:  command git_changelog_output release_notes&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;quot;!=&amp;quot; string to compare all commit hashes in the release notes.&lt;br /&gt;
PATTERN=$(awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {first = &amp;quot;Y&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (first != &amp;quot;Y&amp;quot;)&lt;br /&gt;
                                printf(&amp;quot; &amp;amp;&amp;amp; &amp;quot;);&lt;br /&gt;
                        first=&amp;quot;N&amp;quot;;&lt;br /&gt;
                        printf(&amp;quot;$2 != \&amp;quot;&amp;quot; $2 &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&#039; &amp;quot;$2&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^Author: /)&lt;br /&gt;
                        save_author=$0;&lt;br /&gt;
                else if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (&#039;&amp;quot;$PATTERN&amp;quot;&#039;)&lt;br /&gt;
                        {&lt;br /&gt;
                                print save_author;&lt;br /&gt;
                                print $0;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                                save_author=&amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else if (save_author != &amp;quot;&amp;quot;)&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and then run the script in #2 to add &amp;quot;[DOC&amp;quot; markers;  email to pgsql-hackers@lists.postgresql.org.&lt;br /&gt;
&lt;br /&gt;
13. Do the following after community feedbackscript, hopefully before beta1&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
14.  Do this near the final release date so diff analysis is easier&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
The major release notes attempt to document every user-visible and user-impactful change.  While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers or Postgres forks because doing so would include too many items that would be uninteresting to the general audience.  Similarly, performance improvements are not mentioned in the release notes unless they are user-visible (e.g., new syntax) or significant enough to enable new workloads.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43602</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43602"/>
		<updated>2026-05-26T22:21:33Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: add goal of major release notes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_18_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        cmd = &amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | wc -l&amp;quot;;&lt;br /&gt;
                        cmd | getline lines;&lt;br /&gt;
                        close(cmd);&lt;br /&gt;
&lt;br /&gt;
                        cmd = &amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -c \&amp;quot;^doc/\&amp;quot;&amp;quot;;&lt;br /&gt;
                        cmd | getline doc_lines;&lt;br /&gt;
                        close(cmd);&lt;br /&gt;
&lt;br /&gt;
                        if (doc_lines &amp;gt; 0)&lt;br /&gt;
                        {&lt;br /&gt;
                                # skip commit subject line&lt;br /&gt;
                                if (doc_lines &amp;lt; lines - 1)&lt;br /&gt;
                                        doc = &amp;quot;[DOC &amp;amp; CODE]&amp;quot;;&lt;br /&gt;
                                else&lt;br /&gt;
                                        doc = &amp;quot;[DOC ONLY]&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
                I use MicroEmacs 4 [https://momjian.us/download/uemacs4_pg.mac macros] to do this.&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC &amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC //&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. To show commits that were excluded, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usage:  command git_changelog_output release_notes&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;quot;!=&amp;quot; string to compare all commit hashes in the release notes.&lt;br /&gt;
PATTERN=$(awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {first = &amp;quot;Y&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (first != &amp;quot;Y&amp;quot;)&lt;br /&gt;
                                printf(&amp;quot; &amp;amp;&amp;amp; &amp;quot;);&lt;br /&gt;
                        first=&amp;quot;N&amp;quot;;&lt;br /&gt;
                        printf(&amp;quot;$2 != \&amp;quot;&amp;quot; $2 &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&#039; &amp;quot;$2&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^Author: /)&lt;br /&gt;
                        save_author=$0;&lt;br /&gt;
                else if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (&#039;&amp;quot;$PATTERN&amp;quot;&#039;)&lt;br /&gt;
                        {&lt;br /&gt;
                                print save_author;&lt;br /&gt;
                                print $0;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                                save_author=&amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else if (save_author != &amp;quot;&amp;quot;)&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and then run the script in #2 to add &amp;quot;[DOC&amp;quot; markers;  email to pgsql-hackers@lists.postgresql.org.&lt;br /&gt;
&lt;br /&gt;
13. Do the following after community feedbackscript, hopefully before beta1&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
The major release notes attempt to document every user-visible and user-impactful change.  While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers or Postgres forks because doing so would include too many items that would be uninteresting to the general audience.  Similarly, performance improvements are not mentioned in the release notes unless they are user-visible (e.g., new syntax) or significant enough to enable new workloads.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43601</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43601"/>
		<updated>2026-05-26T20:41:51Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: mention beta 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_18_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        cmd = &amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | wc -l&amp;quot;;&lt;br /&gt;
                        cmd | getline lines;&lt;br /&gt;
                        close(cmd);&lt;br /&gt;
&lt;br /&gt;
                        cmd = &amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -c \&amp;quot;^doc/\&amp;quot;&amp;quot;;&lt;br /&gt;
                        cmd | getline doc_lines;&lt;br /&gt;
                        close(cmd);&lt;br /&gt;
&lt;br /&gt;
                        if (doc_lines &amp;gt; 0)&lt;br /&gt;
                        {&lt;br /&gt;
                                # skip commit subject line&lt;br /&gt;
                                if (doc_lines &amp;lt; lines - 1)&lt;br /&gt;
                                        doc = &amp;quot;[DOC &amp;amp; CODE]&amp;quot;;&lt;br /&gt;
                                else&lt;br /&gt;
                                        doc = &amp;quot;[DOC ONLY]&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
                I use MicroEmacs 4 [https://momjian.us/download/uemacs4_pg.mac macros] to do this.&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC &amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC //&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. To show commits that were excluded, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usage:  command git_changelog_output release_notes&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;quot;!=&amp;quot; string to compare all commit hashes in the release notes.&lt;br /&gt;
PATTERN=$(awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {first = &amp;quot;Y&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (first != &amp;quot;Y&amp;quot;)&lt;br /&gt;
                                printf(&amp;quot; &amp;amp;&amp;amp; &amp;quot;);&lt;br /&gt;
                        first=&amp;quot;N&amp;quot;;&lt;br /&gt;
                        printf(&amp;quot;$2 != \&amp;quot;&amp;quot; $2 &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&#039; &amp;quot;$2&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^Author: /)&lt;br /&gt;
                        save_author=$0;&lt;br /&gt;
                else if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (&#039;&amp;quot;$PATTERN&amp;quot;&#039;)&lt;br /&gt;
                        {&lt;br /&gt;
                                print save_author;&lt;br /&gt;
                                print $0;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                                save_author=&amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else if (save_author != &amp;quot;&amp;quot;)&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and then run the script in #2 to add &amp;quot;[DOC&amp;quot; markers;  email to pgsql-hackers@lists.postgresql.org.&lt;br /&gt;
&lt;br /&gt;
13. Do the following after community feedbackscript, hopefully before beta1&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers or Postgres forks because doing so would include too many items that would be uninteresting to the general audience.  Similarly, performance improvements are not mentioned in the release notes unless they are user-visible (e.g., new syntax) or significant enough to enable new workloads.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43530</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43530"/>
		<updated>2026-05-20T21:17:23Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: DOC marker&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_18_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        cmd = &amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | wc -l&amp;quot;;&lt;br /&gt;
                        cmd | getline lines;&lt;br /&gt;
                        close(cmd);&lt;br /&gt;
&lt;br /&gt;
                        cmd = &amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -c \&amp;quot;^doc/\&amp;quot;&amp;quot;;&lt;br /&gt;
                        cmd | getline doc_lines;&lt;br /&gt;
                        close(cmd);&lt;br /&gt;
&lt;br /&gt;
                        if (doc_lines &amp;gt; 0)&lt;br /&gt;
                        {&lt;br /&gt;
                                # skip commit subject line&lt;br /&gt;
                                if (doc_lines &amp;lt; lines - 1)&lt;br /&gt;
                                        doc = &amp;quot;[DOC &amp;amp; CODE]&amp;quot;;&lt;br /&gt;
                                else&lt;br /&gt;
                                        doc = &amp;quot;[DOC ONLY]&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
                I use MicroEmacs 4 [https://momjian.us/download/uemacs4_pg.mac macros] to do this.&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC &amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC //&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. To show commits that were excluded, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usage:  command git_changelog_output release_notes&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;quot;!=&amp;quot; string to compare all commit hashes in the release notes.&lt;br /&gt;
PATTERN=$(awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {first = &amp;quot;Y&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (first != &amp;quot;Y&amp;quot;)&lt;br /&gt;
                                printf(&amp;quot; &amp;amp;&amp;amp; &amp;quot;);&lt;br /&gt;
                        first=&amp;quot;N&amp;quot;;&lt;br /&gt;
                        printf(&amp;quot;$2 != \&amp;quot;&amp;quot; $2 &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&#039; &amp;quot;$2&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^Author: /)&lt;br /&gt;
                        save_author=$0;&lt;br /&gt;
                else if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (&#039;&amp;quot;$PATTERN&amp;quot;&#039;)&lt;br /&gt;
                        {&lt;br /&gt;
                                print save_author;&lt;br /&gt;
                                print $0;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                                save_author=&amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else if (save_author != &amp;quot;&amp;quot;)&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and then run the script in #2 to add &amp;quot;[DOC&amp;quot; markers;  email to pgsql-hackers@lists.postgresql.org.&lt;br /&gt;
&lt;br /&gt;
13. Do the following after community feedbackscript above to add&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers or Postgres forks because doing so would include too many items that would be uninteresting to the general audience.  Similarly, performance improvements are not mentioned in the release notes unless they are user-visible (e.g., new syntax) or significant enough to enable new workloads.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43529</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43529"/>
		<updated>2026-05-20T21:16:32Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: update doc&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_18_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        cmd = &amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | wc -l&amp;quot;;&lt;br /&gt;
                        cmd | getline lines;&lt;br /&gt;
                        close(cmd);&lt;br /&gt;
&lt;br /&gt;
                        cmd = &amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -c \&amp;quot;^doc/\&amp;quot;&amp;quot;;&lt;br /&gt;
                        cmd | getline doc_lines;&lt;br /&gt;
                        close(cmd);&lt;br /&gt;
&lt;br /&gt;
                        if (doc_lines &amp;gt; 0)&lt;br /&gt;
                        {&lt;br /&gt;
                                # skip commit subject line&lt;br /&gt;
                                if (doc_lines &amp;lt; lines - 1)&lt;br /&gt;
                                        doc = &amp;quot;[DOC &amp;amp; CODE]&amp;quot;;&lt;br /&gt;
                                else&lt;br /&gt;
                                        doc = &amp;quot;[DOC ONLY]&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
                I use MicroEmacs 4 [https://momjian.us/download/uemacs4_pg.mac macros] to do this.&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC .*&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC //&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. To show commits that were excluded, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usage:  command git_changelog_output release_notes&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;quot;!=&amp;quot; string to compare all commit hashes in the release notes.&lt;br /&gt;
PATTERN=$(awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {first = &amp;quot;Y&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (first != &amp;quot;Y&amp;quot;)&lt;br /&gt;
                                printf(&amp;quot; &amp;amp;&amp;amp; &amp;quot;);&lt;br /&gt;
                        first=&amp;quot;N&amp;quot;;&lt;br /&gt;
                        printf(&amp;quot;$2 != \&amp;quot;&amp;quot; $2 &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&#039; &amp;quot;$2&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^Author: /)&lt;br /&gt;
                        save_author=$0;&lt;br /&gt;
                else if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (&#039;&amp;quot;$PATTERN&amp;quot;&#039;)&lt;br /&gt;
                        {&lt;br /&gt;
                                print save_author;&lt;br /&gt;
                                print $0;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                                save_author=&amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else if (save_author != &amp;quot;&amp;quot;)&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and then run the script in #2 to add &amp;quot;[DOC&amp;quot; markers;  email to pgsql-hackers@lists.postgresql.org.&lt;br /&gt;
&lt;br /&gt;
13. Do the following after community feedbackscript above to add&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers or Postgres forks because doing so would include too many items that would be uninteresting to the general audience.  Similarly, performance improvements are not mentioned in the release notes unless they are user-visible (e.g., new syntax) or significant enough to enable new workloads.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43528</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43528"/>
		<updated>2026-05-20T21:16:16Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: update doc&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_18_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        cmd = &amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | wc -l&amp;quot;;&lt;br /&gt;
                        cmd | getline lines;&lt;br /&gt;
                        close(cmd);&lt;br /&gt;
&lt;br /&gt;
                        cmd = &amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -c \&amp;quot;^doc/\&amp;quot;&amp;quot;;&lt;br /&gt;
                        cmd | getline doc_lines;&lt;br /&gt;
                        close(cmd);&lt;br /&gt;
&lt;br /&gt;
                        if (doc_lines &amp;gt; 0)&lt;br /&gt;
                        {&lt;br /&gt;
                                # skip commit subject line&lt;br /&gt;
                                if (doc_lines &amp;lt; lines - 1)&lt;br /&gt;
                                        doc = &amp;quot;[DOC &amp;amp; CODE]&amp;quot;;&lt;br /&gt;
                                else&lt;br /&gt;
                                        doc = &amp;quot;[DOC ONLY]&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
                I use MicroEmacs 4 [https://momjian.us/download/uemacs4_pg.mac macros] to do this.&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC .*&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC //&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. To show commits that were excluded, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usage:  command git_changelog_output release_notes&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;quot;!=&amp;quot; string to compare all commit hashes in the release notes.&lt;br /&gt;
PATTERN=$(awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {first = &amp;quot;Y&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (first != &amp;quot;Y&amp;quot;)&lt;br /&gt;
                                printf(&amp;quot; &amp;amp;&amp;amp; &amp;quot;);&lt;br /&gt;
                        first=&amp;quot;N&amp;quot;;&lt;br /&gt;
                        printf(&amp;quot;$2 != \&amp;quot;&amp;quot; $2 &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&#039; &amp;quot;$2&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^Author: /)&lt;br /&gt;
                        save_author=$0;&lt;br /&gt;
                else if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (&#039;&amp;quot;$PATTERN&amp;quot;&#039;)&lt;br /&gt;
                        {&lt;br /&gt;
                                print save_author;&lt;br /&gt;
                                print $0;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                                save_author=&amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else if (save_author != &amp;quot;&amp;quot;)&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and then run the script in #2 to add &amp;quot;[DOC&amp;quot; markers;  email to pgsql-hackers@lists.postgresql.org.&lt;br /&gt;
&lt;br /&gt;
13. Do the following after community feedbackscript above to add&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers or Postgres forks because doing so would include too many items that would be uninteresting to the general audience.  Similarly, performance improvements are not mentioned in the release notes unless they are user-visible (e.g., new syntax) or significant enough to enable new workloads.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43527</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43527"/>
		<updated>2026-05-20T21:15:48Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: add DOC ONLY, DOC &amp;amp; CODE&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_18_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        cmd = &amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | wc -l&amp;quot;;&lt;br /&gt;
                        cmd | getline lines;&lt;br /&gt;
                        close(cmd);&lt;br /&gt;
&lt;br /&gt;
                        cmd = &amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -c \&amp;quot;^doc/\&amp;quot;&amp;quot;;&lt;br /&gt;
                        cmd | getline doc_lines;&lt;br /&gt;
                        close(cmd);&lt;br /&gt;
&lt;br /&gt;
                        if (doc_lines &amp;gt; 0)&lt;br /&gt;
                        {&lt;br /&gt;
                                # skip commit subject line&lt;br /&gt;
                                if (doc_lines &amp;lt; lines - 1)&lt;br /&gt;
                                        doc = &amp;quot;[DOC &amp;amp; CODE]&amp;quot;;&lt;br /&gt;
                                else&lt;br /&gt;
                                        doc = &amp;quot;[DOC ONLY]&amp;quot;;&lt;br /&gt;
                        }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
                I use MicroEmacs 4 [https://momjian.us/download/uemacs4_pg.mac macros] to do this.&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC .*&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC //&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. To show commits that were excluded, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usage:  command git_changelog_output release_notes&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;quot;!=&amp;quot; string to compare all commit hashes in the release notes.&lt;br /&gt;
PATTERN=$(awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {first = &amp;quot;Y&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (first != &amp;quot;Y&amp;quot;)&lt;br /&gt;
                                printf(&amp;quot; &amp;amp;&amp;amp; &amp;quot;);&lt;br /&gt;
                        first=&amp;quot;N&amp;quot;;&lt;br /&gt;
                        printf(&amp;quot;$2 != \&amp;quot;&amp;quot; $2 &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&#039; &amp;quot;$2&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^Author: /)&lt;br /&gt;
                        save_author=$0;&lt;br /&gt;
                else if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (&#039;&amp;quot;$PATTERN&amp;quot;&#039;)&lt;br /&gt;
                        {&lt;br /&gt;
                                print save_author;&lt;br /&gt;
                                print $0;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                                save_author=&amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else if (save_author != &amp;quot;&amp;quot;)&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and then run the script in #2 to add &amp;quot;[DOC]&amp;quot; markers;  email to pgsql-hackers@lists.postgresql.org.&lt;br /&gt;
&lt;br /&gt;
13. Do the following after community feedbackscript above to add&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers or Postgres forks because doing so would include too many items that would be uninteresting to the general audience.  Similarly, performance improvements are not mentioned in the release notes unless they are user-visible (e.g., new syntax) or significant enough to enable new workloads.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43524</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43524"/>
		<updated>2026-05-20T20:32:26Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: add hacker email&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_18_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] / &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
                I use MicroEmacs 4 [https://momjian.us/download/uemacs4_pg.mac macros] to do this.&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. To show commits that were excluded, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usage:  command git_changelog_output release_notes&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;quot;!=&amp;quot; string to compare all commit hashes in the release notes.&lt;br /&gt;
PATTERN=$(awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {first = &amp;quot;Y&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (first != &amp;quot;Y&amp;quot;)&lt;br /&gt;
                                printf(&amp;quot; &amp;amp;&amp;amp; &amp;quot;);&lt;br /&gt;
                        first=&amp;quot;N&amp;quot;;&lt;br /&gt;
                        printf(&amp;quot;$2 != \&amp;quot;&amp;quot; $2 &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&#039; &amp;quot;$2&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^Author: /)&lt;br /&gt;
                        save_author=$0;&lt;br /&gt;
                else if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (&#039;&amp;quot;$PATTERN&amp;quot;&#039;)&lt;br /&gt;
                        {&lt;br /&gt;
                                print save_author;&lt;br /&gt;
                                print $0;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                                save_author=&amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else if (save_author != &amp;quot;&amp;quot;)&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and then run the script in #2 to add &amp;quot;[DOC]&amp;quot; markers;  email to pgsql-hackers@lists.postgresql.org.&lt;br /&gt;
&lt;br /&gt;
13. Do the following after community feedbackscript above to add&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers or Postgres forks because doing so would include too many items that would be uninteresting to the general audience.  Similarly, performance improvements are not mentioned in the release notes unless they are user-visible (e.g., new syntax) or significant enough to enable new workloads.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43361</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43361"/>
		<updated>2026-04-30T04:12:21Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: wording&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_18_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] / &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
                I use MicroEmacs 4 [https://momjian.us/download/uemacs4_pg.mac macros] to do this.&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. To show commits that were excluded, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usage:  command git_changelog_output release_notes&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;quot;!=&amp;quot; string to compare all commit hashes in the release notes.&lt;br /&gt;
PATTERN=$(awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {first = &amp;quot;Y&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (first != &amp;quot;Y&amp;quot;)&lt;br /&gt;
                                printf(&amp;quot; &amp;amp;&amp;amp; &amp;quot;);&lt;br /&gt;
                        first=&amp;quot;N&amp;quot;;&lt;br /&gt;
                        printf(&amp;quot;$2 != \&amp;quot;&amp;quot; $2 &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&#039; &amp;quot;$2&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^Author: /)&lt;br /&gt;
                        save_author=$0;&lt;br /&gt;
                else if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (&#039;&amp;quot;$PATTERN&amp;quot;&#039;)&lt;br /&gt;
                        {&lt;br /&gt;
                                print save_author;&lt;br /&gt;
                                print $0;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                                save_author=&amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else if (save_author != &amp;quot;&amp;quot;)&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and then run the script in #2 to add &amp;quot;[DOC]&amp;quot; markers.&lt;br /&gt;
&lt;br /&gt;
13. Do the following after community feedbackscript above to add&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers or Postgres forks because doing so would include too many items that would be uninteresting to the general audience.  Similarly, performance improvements are not mentioned in the release notes unless they are user-visible (e.g., new syntax) or significant enough to enable new workloads.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43360</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43360"/>
		<updated>2026-04-30T04:11:40Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: add editor macro link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_18_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] / &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
                I used MicroEmacs 4 [https://momjian.us/download/uemacs4_pg.mac macros]&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. To show commits that were excluded, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usage:  command git_changelog_output release_notes&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;quot;!=&amp;quot; string to compare all commit hashes in the release notes.&lt;br /&gt;
PATTERN=$(awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {first = &amp;quot;Y&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (first != &amp;quot;Y&amp;quot;)&lt;br /&gt;
                                printf(&amp;quot; &amp;amp;&amp;amp; &amp;quot;);&lt;br /&gt;
                        first=&amp;quot;N&amp;quot;;&lt;br /&gt;
                        printf(&amp;quot;$2 != \&amp;quot;&amp;quot; $2 &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&#039; &amp;quot;$2&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^Author: /)&lt;br /&gt;
                        save_author=$0;&lt;br /&gt;
                else if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (&#039;&amp;quot;$PATTERN&amp;quot;&#039;)&lt;br /&gt;
                        {&lt;br /&gt;
                                print save_author;&lt;br /&gt;
                                print $0;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                                save_author=&amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else if (save_author != &amp;quot;&amp;quot;)&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and then run the script in #2 to add &amp;quot;[DOC]&amp;quot; markers.&lt;br /&gt;
&lt;br /&gt;
13. Do the following after community feedbackscript above to add&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers or Postgres forks because doing so would include too many items that would be uninteresting to the general audience.  Similarly, performance improvements are not mentioned in the release notes unless they are user-visible (e.g., new syntax) or significant enough to enable new workloads.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43331</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43331"/>
		<updated>2026-04-23T15:08:07Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: wording&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_18_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] / &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. To show commits that were excluded, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usage:  command git_changelog_output release_notes&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;quot;!=&amp;quot; string to compare all commit hashes in the release notes.&lt;br /&gt;
PATTERN=$(awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {first = &amp;quot;Y&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (first != &amp;quot;Y&amp;quot;)&lt;br /&gt;
                                printf(&amp;quot; &amp;amp;&amp;amp; &amp;quot;);&lt;br /&gt;
                        first=&amp;quot;N&amp;quot;;&lt;br /&gt;
                        printf(&amp;quot;$2 != \&amp;quot;&amp;quot; $2 &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&#039; &amp;quot;$2&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^Author: /)&lt;br /&gt;
                        save_author=$0;&lt;br /&gt;
                else if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (&#039;&amp;quot;$PATTERN&amp;quot;&#039;)&lt;br /&gt;
                        {&lt;br /&gt;
                                print save_author;&lt;br /&gt;
                                print $0;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                                save_author=&amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else if (save_author != &amp;quot;&amp;quot;)&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and then run the script in #2 to add &amp;quot;[DOC]&amp;quot; markers.&lt;br /&gt;
&lt;br /&gt;
13. Do the following after community feedbackscript above to add&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers or Postgres forks because doing so would include too many items that would be uninteresting to the general audience.  Similarly, performance improvements are not mentioned in the release notes unless they are user-visible (e.g., new syntax) or significant enough to enable new workloads.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43330</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43330"/>
		<updated>2026-04-23T15:06:53Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: Add shell comment&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_18_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] / &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. To show commits that were excluded, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usage:  command git_changelog_output release_notes&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;quot;!=&amp;quot; string to check against all commit hashes in the release notes.&lt;br /&gt;
PATTERN=$(awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {first = &amp;quot;Y&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (first != &amp;quot;Y&amp;quot;)&lt;br /&gt;
                                printf(&amp;quot; &amp;amp;&amp;amp; &amp;quot;);&lt;br /&gt;
                        first=&amp;quot;N&amp;quot;;&lt;br /&gt;
                        printf(&amp;quot;$2 != \&amp;quot;&amp;quot; $2 &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&#039; &amp;quot;$2&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^Author: /)&lt;br /&gt;
                        save_author=$0;&lt;br /&gt;
                else if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (&#039;&amp;quot;$PATTERN&amp;quot;&#039;)&lt;br /&gt;
                        {&lt;br /&gt;
                                print save_author;&lt;br /&gt;
                                print $0;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                                save_author=&amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else if (save_author != &amp;quot;&amp;quot;)&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and then run the script in #2 to add &amp;quot;[DOC]&amp;quot; markers.&lt;br /&gt;
&lt;br /&gt;
13. Do the following after community feedbackscript above to add&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers or Postgres forks because doing so would include too many items that would be uninteresting to the general audience.  Similarly, performance improvements are not mentioned in the release notes unless they are user-visible (e.g., new syntax) or significant enough to enable new workloads.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43320</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43320"/>
		<updated>2026-04-22T11:55:39Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: add hex commit hash pattern&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_18_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] / &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. To show commits that were excluded, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usage:  command git_changelog_output release_notes&lt;br /&gt;
&lt;br /&gt;
PATTERN=$(awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {first = &amp;quot;Y&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (first != &amp;quot;Y&amp;quot;)&lt;br /&gt;
                                printf(&amp;quot; &amp;amp;&amp;amp; &amp;quot;);&lt;br /&gt;
                        first=&amp;quot;N&amp;quot;;&lt;br /&gt;
                        printf(&amp;quot;$2 != \&amp;quot;&amp;quot; $2 &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&#039; &amp;quot;$2&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^Author: /)&lt;br /&gt;
                        save_author=$0;&lt;br /&gt;
                else if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[[[:xdigit:]]+\] /)&lt;br /&gt;
                {&lt;br /&gt;
                        if (&#039;&amp;quot;$PATTERN&amp;quot;&#039;)&lt;br /&gt;
                        {&lt;br /&gt;
                                print save_author;&lt;br /&gt;
                                print $0;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                                save_author=&amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else if (save_author != &amp;quot;&amp;quot;)&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and then run the script in #2 to add &amp;quot;[DOC]&amp;quot; markers.&lt;br /&gt;
&lt;br /&gt;
13. Do the following after community feedbackscript above to add&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers or Postgres forks because doing so would include too many items that would be uninteresting to the general audience.  Similarly, performance improvements are not mentioned in the release notes unless they are user-visible (e.g., new syntax) or significant enough to enable new workloads.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43319</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43319"/>
		<updated>2026-04-22T09:24:08Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: &amp;quot;excluded&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_18_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. To show commits that were excluded, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usage:  command git_changelog_output release_notes&lt;br /&gt;
&lt;br /&gt;
PATTERN=$(awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {first = &amp;quot;Y&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/)&lt;br /&gt;
                {&lt;br /&gt;
                        if (first != &amp;quot;Y&amp;quot;)&lt;br /&gt;
                                printf(&amp;quot; &amp;amp;&amp;amp; &amp;quot;);&lt;br /&gt;
                        first=&amp;quot;N&amp;quot;;&lt;br /&gt;
                        printf(&amp;quot;$2 != \&amp;quot;&amp;quot; $2 &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&#039; &amp;quot;$2&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^Author: /)&lt;br /&gt;
                        save_author=$0;&lt;br /&gt;
                else if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/)&lt;br /&gt;
                {&lt;br /&gt;
                        if (&#039;&amp;quot;$PATTERN&amp;quot;&#039;)&lt;br /&gt;
                        {&lt;br /&gt;
                                print save_author;&lt;br /&gt;
                                print $0;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                                save_author=&amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else if (save_author != &amp;quot;&amp;quot;)&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and then run the script in #2 to add &amp;quot;[DOC]&amp;quot; markers.&lt;br /&gt;
&lt;br /&gt;
13. Do the following after community feedbackscript above to add&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers or Postgres forks because doing so would include too many items that would be uninteresting to the general audience.  Similarly, performance improvements are not mentioned in the release notes unless they are user-visible (e.g., new syntax) or significant enough to enable new workloads.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43318</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43318"/>
		<updated>2026-04-22T07:23:38Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: add &amp;quot;missing&amp;quot; script&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_18_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. To show commits that were not included, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usage:  command git_changelog_output release_notes&lt;br /&gt;
&lt;br /&gt;
PATTERN=$(awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {first = &amp;quot;Y&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/)&lt;br /&gt;
                {&lt;br /&gt;
                        if (first != &amp;quot;Y&amp;quot;)&lt;br /&gt;
                                printf(&amp;quot; &amp;amp;&amp;amp; &amp;quot;);&lt;br /&gt;
                        first=&amp;quot;N&amp;quot;;&lt;br /&gt;
                        printf(&amp;quot;$2 != \&amp;quot;&amp;quot; $2 &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&#039; &amp;quot;$2&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^Author: /)&lt;br /&gt;
                        save_author=$0;&lt;br /&gt;
                else if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/)&lt;br /&gt;
                {&lt;br /&gt;
                        if (&#039;&amp;quot;$PATTERN&amp;quot;&#039;)&lt;br /&gt;
                        {&lt;br /&gt;
                                print save_author;&lt;br /&gt;
                                print $0;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                                save_author=&amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else if (save_author != &amp;quot;&amp;quot;)&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and then run the script in #2 to add &amp;quot;[DOC]&amp;quot; markers.&lt;br /&gt;
&lt;br /&gt;
13. Do the following after community feedbackscript above to add&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers or Postgres forks because doing so would include too many items that would be uninteresting to the general audience.  Similarly, performance improvements are not mentioned in the release notes unless they are user-visible (e.g., new syntax) or significant enough to enable new workloads.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43314</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43314"/>
		<updated>2026-04-21T21:11:32Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: PG 18 stable&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_18_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. Do the following after community feedback&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers or Postgres forks because doing so would include too many items that would be uninteresting to the general audience.  Similarly, performance improvements are not mentioned in the release notes unless they are user-visible (e.g., new syntax) or significant enough to enable new workloads.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43295</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43295"/>
		<updated>2026-04-19T18:44:46Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: update &amp;quot;not included&amp;quot; text&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. Do the following after community feedback&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers or Postgres forks because doing so would include too many items that would be uninteresting to the general audience.  Similarly, performance improvements are not mentioned in the release notes unless they are user-visible (e.g., new syntax) or significant enough to enable new workloads.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43294</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43294"/>
		<updated>2026-04-19T18:08:42Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: merge sentences&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. Do the following after community feedback&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers or Postgres forks because doing so would include too many items that would be uninteresting to the general audience.  Performance improvements are mentioned in the release notes if they are user-visible (e.g., new syntax) or significant enough to enable new workloads.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43283</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43283"/>
		<updated>2026-04-16T16:29:21Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: add forks&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. Do the following after community feedback&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers or Postgres forks because doing so would include too many items that would be uninteresting to the general audience.&lt;br /&gt;
&lt;br /&gt;
Performance improvements are mentioned in the release notes if they are user-visible (e.g., new syntax) or significant enough to enable new workloads.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43282</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43282"/>
		<updated>2026-04-16T15:55:25Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: add performance mention&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. Do the following after community feedback&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers because doing so would include too many items that would be uninteresting to the general audience.&lt;br /&gt;
&lt;br /&gt;
Performance improvements are mentioned in the release notes if they are user-visible (e.g., new syntax) or significant enough to enable new workloads.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43278</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43278"/>
		<updated>2026-04-15T14:19:33Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: append&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        append 05tags&lt;br /&gt;
                cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. Do the following after community feedback&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers because doing so would include too many items that would be uninteresting to the general audience.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43277</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43277"/>
		<updated>2026-04-15T14:18:13Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: trailing spaces&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove trailing spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. Do the following after community feedback&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers because doing so would include too many items that would be uninteresting to the general audience.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43276</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43276"/>
		<updated>2026-04-15T14:16:26Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: git command&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(git merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove lines with only spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. Do the following after community feedback&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers because doing so would include too many items that would be uninteresting to the general audience.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43275</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43275"/>
		<updated>2026-04-15T14:16:11Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: update git command&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        git show --summary $(pggit merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove lines with only spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. Do the following after community feedback&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers because doing so would include too many items that would be uninteresting to the general audience.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43274</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43274"/>
		<updated>2026-04-15T14:15:42Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: no number on last item&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        pggit show --summary $(pggit merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove lines with only spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. Do the following after community feedback&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers because doing so would include too many items that would be uninteresting to the general audience.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43273</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43273"/>
		<updated>2026-04-15T14:05:36Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        pggit show --summary $(pggit merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I use)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove lines with only spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. Do the following after community feedback&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
13. While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers because doing so would include too many items that would be uninteresting to the general audience.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43272</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43272"/>
		<updated>2026-04-15T14:05:20Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: file name mention&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        pggit show --summary $(pggit merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw (&amp;quot;01raw&amp;quot; is the file name I used)&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove lines with only spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. Do the following after community feedback&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
13. While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers because doing so would include too many items that would be uninteresting to the general audience.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43271</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43271"/>
		<updated>2026-04-15T14:03:32Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: PDF title&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        pggit show --summary $(pggit merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove lines with only spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. Do the following after community feedback&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
13. While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers because doing so would include too many items that would be uninteresting to the general audience.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43270</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43270"/>
		<updated>2026-04-15T14:01:56Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: number items&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0. Find branch date with query&lt;br /&gt;
        pggit show --summary $(pggit merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
1. 01raw&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
2. 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use text editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items and incompatibilities&lt;br /&gt;
&lt;br /&gt;
3. 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading space on commit text&lt;br /&gt;
&lt;br /&gt;
4. 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
5. 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove lines with only spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix &amp;lt;/para&amp;gt;&amp;lt;para for double-paras&lt;br /&gt;
&lt;br /&gt;
6. 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using text editor&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown file for gedit access&lt;br /&gt;
&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
7. 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
8. 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in text editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        checck names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
&lt;br /&gt;
9. PDF output&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
10. Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
11. Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
12. Do the following after community feedback&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
13. While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers because doing so would include too many items that would be uninteresting to the general audience.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43269</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43269"/>
		<updated>2026-04-15T12:15:40Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: Add bullets&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Find branch date with query&lt;br /&gt;
        pggit show --summary $(pggit merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
* 01raw&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
* 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items&lt;br /&gt;
        check for missed incompatibilities&lt;br /&gt;
&lt;br /&gt;
* 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading spaces on commit text&lt;br /&gt;
&lt;br /&gt;
* 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
* 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove lines with only spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix double-paras&lt;br /&gt;
&lt;br /&gt;
* 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using ema&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown&lt;br /&gt;
        cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
* 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
* 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
* 09links&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
* Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
&lt;br /&gt;
* Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
* Do the following after community feedback&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
* While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers because doing so would include too many items that would be uninteresting to the general audience.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43268</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43268"/>
		<updated>2026-04-15T12:15:01Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: add bullets&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Find branch date with query&lt;br /&gt;
        pggit show --summary $(pggit merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
* 01raw&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
* 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items&lt;br /&gt;
        check for missed incompatibilities&lt;br /&gt;
&lt;br /&gt;
* 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading spaces on commit text&lt;br /&gt;
&lt;br /&gt;
* 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
* 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove lines with only spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix double-paras&lt;br /&gt;
&lt;br /&gt;
* 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using ema&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown&lt;br /&gt;
        cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
* 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
* 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
* 09links&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
* Do the following after community feedback&lt;br /&gt;
        delayed because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers because doing so would include too many items that would be uninteresting to the general audience.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43267</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43267"/>
		<updated>2026-04-15T12:02:31Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: mention blog&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* find branch date with query&lt;br /&gt;
        pggit show --summary $(pggit merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
* 01raw&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
* 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items&lt;br /&gt;
        check for missed incompatibilities&lt;br /&gt;
&lt;br /&gt;
* 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading spaces on commit text&lt;br /&gt;
&lt;br /&gt;
* 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
* 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove lines with only spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix double-paras&lt;br /&gt;
&lt;br /&gt;
* 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using ema&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown&lt;br /&gt;
        cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
* 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
* 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
* 09links&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
Post release note URL to pgsql-hackers@lists.postgresql.org&lt;br /&gt;
Post blog after a few days of feedback&lt;br /&gt;
&lt;br /&gt;
DO THIS AFTER COMMUNITY FEEDBACK&lt;br /&gt;
        because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers because doing so would include too many items that would be uninteresting to the general audience.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43266</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43266"/>
		<updated>2026-04-15T11:51:19Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: add text about extensions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* find branch date with query&lt;br /&gt;
        pggit show --summary $(pggit merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
* 01raw&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
* 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items&lt;br /&gt;
        check for missed incompatibilities&lt;br /&gt;
&lt;br /&gt;
* 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading spaces on commit text&lt;br /&gt;
&lt;br /&gt;
* 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
* 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove lines with only spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix double-paras&lt;br /&gt;
&lt;br /&gt;
* 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using ema&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown&lt;br /&gt;
        cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
* 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
* 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
* 09links&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
Post release note URL to pgblog&lt;br /&gt;
&lt;br /&gt;
DO THIS AFTER COMMUNITY FEEDBACK&lt;br /&gt;
        because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;br /&gt;
&lt;br /&gt;
While the major release notes include changes to the documented extension interface, it does not include all changes of interest to extension developers because doing so would include too many items that would be uninteresting to the general audience.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43265</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43265"/>
		<updated>2026-04-15T11:47:56Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: indent&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* find branch date with query&lt;br /&gt;
        pggit show --summary $(pggit merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
* 01raw&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
* 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items&lt;br /&gt;
        check for missed incompatibilities&lt;br /&gt;
&lt;br /&gt;
* 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading spaces on commit text&lt;br /&gt;
&lt;br /&gt;
* 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
* 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove lines with only spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix double-paras&lt;br /&gt;
&lt;br /&gt;
* 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using ema&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown&lt;br /&gt;
        cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
* 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
* 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
* 09links&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
Post release note URL to pgblog&lt;br /&gt;
&lt;br /&gt;
DO THIS AFTER COMMUNITY FEEDBACK&lt;br /&gt;
        because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43264</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43264"/>
		<updated>2026-04-15T11:46:46Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: update git syntax&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* find branch date with query&lt;br /&gt;
        pggit show --summary $(pggit merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
* 01raw&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
* 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                        system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items&lt;br /&gt;
        check for missed incompatibilities&lt;br /&gt;
&lt;br /&gt;
* 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading spaces on commit text&lt;br /&gt;
&lt;br /&gt;
* 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
* 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove lines with only spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix double-paras&lt;br /&gt;
&lt;br /&gt;
* 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using ema&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown&lt;br /&gt;
        cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
* 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
* 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
* 09links&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
Post release note URL to pgblog&lt;br /&gt;
&lt;br /&gt;
DO THIS AFTER COMMUNITY FEEDBACK&lt;br /&gt;
        because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43263</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43263"/>
		<updated>2026-04-15T11:43:05Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: update git syntax&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* find branch date with query&lt;br /&gt;
        pggit show --summary $(pggit merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
* 01raw&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
* 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                    system(&amp;quot;git show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^diff.*/doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items&lt;br /&gt;
        check for missed incompatibilities&lt;br /&gt;
&lt;br /&gt;
* 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading spaces on commit text&lt;br /&gt;
&lt;br /&gt;
* 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
* 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove lines with only spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix double-paras&lt;br /&gt;
&lt;br /&gt;
* 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using ema&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown&lt;br /&gt;
        cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
* 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
* 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
* 09links&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
Post release note URL to pgblog&lt;br /&gt;
&lt;br /&gt;
DO THIS AFTER COMMUNITY FEEDBACK&lt;br /&gt;
        because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43262</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43262"/>
		<updated>2026-04-15T01:55:49Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: &amp;quot;editor&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* find branch date with query&lt;br /&gt;
        pggit show --summary $(pggit merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
* 01raw&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
* 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                    system(&amp;quot;aspg pggit show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^diff.*/doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items&lt;br /&gt;
        check for missed incompatibilities&lt;br /&gt;
&lt;br /&gt;
* 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading spaces on commit text&lt;br /&gt;
&lt;br /&gt;
* 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
* 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove lines with only spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix double-paras&lt;br /&gt;
&lt;br /&gt;
* 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using ema&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown&lt;br /&gt;
        cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
* 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
* 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in editor, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
* 09links&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
Post release note URL to pgblog&lt;br /&gt;
&lt;br /&gt;
DO THIS AFTER COMMUNITY FEEDBACK&lt;br /&gt;
        because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43261</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43261"/>
		<updated>2026-04-15T01:55:15Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: Update URL&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* find branch date with query&lt;br /&gt;
        pggit show --summary $(pggit merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
* 01raw&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
* 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                    system(&amp;quot;aspg pggit show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^diff.*/doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items&lt;br /&gt;
        check for missed incompatibilities&lt;br /&gt;
&lt;br /&gt;
* 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading spaces on commit text&lt;br /&gt;
&lt;br /&gt;
* 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
* 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove lines with only spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix double-paras&lt;br /&gt;
&lt;br /&gt;
* 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using ema&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown&lt;br /&gt;
        cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
* 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
* 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in ema, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in doc/src/sgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
* 09links&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
Post release note URL to pgblog&lt;br /&gt;
&lt;br /&gt;
DO THIS AFTER COMMUNITY FEEDBACK&lt;br /&gt;
        because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43260</id>
		<title>Creating Major Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Creating_Major_Release_Notes&amp;diff=43260"/>
		<updated>2026-04-15T01:53:25Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: first version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* find branch date with query&lt;br /&gt;
        pggit show --summary $(pggit merge-base REL_19_STABLE master)&lt;br /&gt;
&lt;br /&gt;
* 01raw&lt;br /&gt;
        read src/tools/git_changelog&lt;br /&gt;
        run src/tools/git_changelog&lt;br /&gt;
        src/tools/git_changelog --master-only --brief --oldest-first --since=&#039;start-date&#039;&lt;br /&gt;
&lt;br /&gt;
* 02trim&lt;br /&gt;
        add &amp;quot;[DOC]&amp;quot; text to indicate commits that changed documentation using:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
awk -F&#039;[\\[\\]]&#039; &#039;&lt;br /&gt;
        BEGIN {doc = &amp;quot;&amp;quot;;}&lt;br /&gt;
        {&lt;br /&gt;
                if ($0 ~ /^20[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2} \[/ &amp;amp;&amp;amp;&lt;br /&gt;
                    system(&amp;quot;aspg pggit show --name-only --oneline &amp;quot; $2 &amp;quot; | grep -q \&amp;quot;^diff.*/doc/\&amp;quot;&amp;quot;) == 0)&lt;br /&gt;
                        doc = &amp;quot;[DOC]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                # Put label on empty line so the first commit text is always in&lt;br /&gt;
                # the same place.&lt;br /&gt;
                if (doc != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $0 == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                        print doc;&lt;br /&gt;
                        doc = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                        print $0;&lt;br /&gt;
        }&#039; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        load relnote macro&lt;br /&gt;
                ESC-X, source pg.mac&lt;br /&gt;
        use editor macro F7 to delete each commit&lt;br /&gt;
                F3/F4 for back/forward commits  |  F7 delete commit  |  F8 delete commit detail below cursor&lt;br /&gt;
        delete commit with cursor anywhere in the commit text&lt;br /&gt;
        check 01raw for missing items&lt;br /&gt;
        check for missed incompatibilities&lt;br /&gt;
&lt;br /&gt;
* 03comments&lt;br /&gt;
        replace &amp;quot;[DOC]&amp;quot; with a blank line&lt;br /&gt;
                sed &#039;s/^\[DOC\] *$//&#039;&lt;br /&gt;
        add comments around commit tags&lt;br /&gt;
        remove leading spaces on commit text&lt;br /&gt;
&lt;br /&gt;
* 04reword&lt;br /&gt;
        reword items&lt;br /&gt;
&lt;br /&gt;
* 05tags&lt;br /&gt;
        update for current git&lt;br /&gt;
        spellcheck&lt;br /&gt;
        remove &amp;lt;&amp;gt;&amp;amp;&lt;br /&gt;
                grep &#039;^[^&amp;lt;-][^:]*[&amp;lt;&amp;gt;&amp;amp;]&#039;&lt;br /&gt;
        remove lines with only spaces&lt;br /&gt;
        remove double-blank lines&lt;br /&gt;
        add &amp;lt;/listitem&amp;gt;&amp;lt;listitem&amp;gt;&lt;br /&gt;
        add &amp;lt;/para&amp;gt;&amp;lt;para&amp;gt;&lt;br /&gt;
        fix double-paras&lt;br /&gt;
&lt;br /&gt;
* 06groups&lt;br /&gt;
        copy previous major release notes to 06groups&lt;br /&gt;
        Release date YYYY-??-??&lt;br /&gt;
        add &amp;quot;AS OF&amp;quot; date&lt;br /&gt;
        make groups using ema&lt;br /&gt;
        remove text between &amp;lt;listitem&amp;gt;&lt;br /&gt;
        remove acknowledgement &amp;lt;member&amp;gt;&lt;br /&gt;
        chown&lt;br /&gt;
        cat 05tags &amp;gt;&amp;gt; 06groups&lt;br /&gt;
        use gedit text editor&lt;br /&gt;
                add line numbers in editor&lt;br /&gt;
                use Colbalt colors so current line is clearly highlighted&lt;br /&gt;
                display overview map&lt;br /&gt;
                ^G to go to last search, search for &amp;quot;-----&amp;quot;&lt;br /&gt;
                use triple-click to select whole lines&lt;br /&gt;
        move items into groups&lt;br /&gt;
        move items into incompatibilities&lt;br /&gt;
&lt;br /&gt;
* 07order&lt;br /&gt;
        order inside of groups&lt;br /&gt;
        most important items first in each section&lt;br /&gt;
        group similar items together&lt;br /&gt;
        ideally the last item in a group will relate to the first item in the next group&lt;br /&gt;
&lt;br /&gt;
* 08spell&lt;br /&gt;
        2nd pass of spellcheck&lt;br /&gt;
                remove HTML comments, authors&lt;br /&gt;
                cat 08spell | grep -Ev &#039;^(20[12][0-9]-|Author: )|commit_baseurl;[0-9a-f]*&#039; | sed &#039;s/ (.\+//g&#039; &amp;gt; /tmp/x;  ispell -H /tmp/x&lt;br /&gt;
        add space between double dashes in XML comments&lt;br /&gt;
                in ema, search for &#039;^202.*--&#039;&lt;br /&gt;
        check contributor names for consistency&lt;br /&gt;
                grep &#039;([^(]*)$&#039; 08spell | sed &#039;s/^[^(]*(//&#039; | tr -d &#039;)&#039;| sed &#039;s/,/\n/g&#039; | sed &#039;s/^[( ]\+//g&#039; | sort -u &amp;gt; /tmp/first&lt;br /&gt;
        names spelled first/last and last/first&lt;br /&gt;
                awk &#039;{print $1,$2; print $2,$1}&#039; /tmp/first | sort | uniq -c | sort -nr | awk &#039;$1&amp;gt;1&#039; &amp;gt; /tmp/last&lt;br /&gt;
        install in /pgsgml&lt;br /&gt;
        run src/tools/add_commit_links.pl&lt;br /&gt;
        check PDF output for invalid characters&lt;br /&gt;
* 09links&lt;br /&gt;
        run make postgres-US.pdf and look for non-output character warning&lt;br /&gt;
&lt;br /&gt;
Post release note URL to pgblog&lt;br /&gt;
&lt;br /&gt;
DO THIS AFTER COMMUNITY FEEDBACK&lt;br /&gt;
        because&lt;br /&gt;
                editing text with markup is hard&lt;br /&gt;
                finding text with markup is hard&lt;br /&gt;
                only the first mention gets a link, and reordering would mess that up&lt;br /&gt;
        add markup, see doc/src/sgml/release.sgml&lt;br /&gt;
        add links by tag&lt;br /&gt;
                add only to first mention in adjacent item list&lt;br /&gt;
                get tag list from release.sgml&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for varname, applications&lt;br /&gt;
                use &amp;quot;&amp;lt;xref&amp;quot; for command where text is only the command name&lt;br /&gt;
                        the rest need &amp;quot;&amp;lt;link linkend&amp;quot;&lt;br /&gt;
                use &amp;quot;&amp;lt;link linkend&amp;quot; for struct&lt;br /&gt;
                go over all items for general links&lt;br /&gt;
                check invalid for &amp;quot;section&amp;quot;, &amp;quot;chapter&amp;quot;, and &amp;quot;???&amp;quot; text&lt;br /&gt;
        use pipe to mark commit paras&lt;br /&gt;
        indentation&lt;br /&gt;
                &amp;lt;sect4 is indented by four spaces&lt;br /&gt;
                use pipe to prefix &amp;lt;ulink&amp;gt; &amp;amp; &amp;lt;/para&amp;gt;&lt;br /&gt;
        indent itemizedlist&lt;br /&gt;
        use ESC-tab to indent paras and word wrap&lt;br /&gt;
        outdent para tags&lt;br /&gt;
        word wrap&lt;br /&gt;
        recheck contributor names for consistency&lt;br /&gt;
        update TODO list&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Commit_Message_Guidance&amp;diff=43177</id>
		<title>Commit Message Guidance</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Commit_Message_Guidance&amp;diff=43177"/>
		<updated>2026-04-06T16:45:56Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: /* Tags: &amp;quot;:&amp;quot; */ update wording to say author and co-author are similar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following is a DRAFT Request for Comment version of general guidance for PostgreSQL commit messages. The intent is:&lt;br /&gt;
&lt;br /&gt;
# Keep it simple and stay reasonably consistent with past practice.&lt;br /&gt;
# Mirror similar guidance used by other open source projects, while maintaining the unique style of PGDG.&lt;br /&gt;
# Enhance the ability to machine-parse the commit messages for the purposes of acknowledgement (release notes, contributor recognition, various efforts to recognize contribution, etc.)&lt;br /&gt;
&lt;br /&gt;
== General layout of commit message ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;commit message&amp;gt;&lt;br /&gt;
 &amp;lt;summary line&amp;gt;&lt;br /&gt;
 &amp;lt;blank line&amp;gt;&lt;br /&gt;
 &amp;lt;narrative&amp;gt;&lt;br /&gt;
  &amp;lt;para&amp;gt;&amp;lt;/para&amp;gt;&lt;br /&gt;
  &amp;lt;blank line&amp;gt;&lt;br /&gt;
  &amp;lt;para&amp;gt;&amp;lt;/para&amp;gt;&lt;br /&gt;
  &amp;lt;blank line&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/narrative&amp;gt;&lt;br /&gt;
 &amp;lt;tags&amp;gt;&lt;br /&gt;
  &amp;lt;tag&amp;gt;&lt;br /&gt;
  &amp;lt;tag&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/tags&amp;gt;&lt;br /&gt;
&amp;lt;/commit message&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* The Postgres email subject has only 64 characters, so try to stay under this limit.  For a template, use:&lt;br /&gt;
   &amp;lt;code&amp;gt;|-- email subject length limit --------------------------------|&amp;lt;/code&amp;gt;&lt;br /&gt;
* When possible, the &amp;lt;attribution&amp;gt; should be a cut-and-paste of the attributed person&#039;s list email &amp;quot;From:&amp;quot; field, with no alterations.&lt;br /&gt;
* The format of tagged lines should always be the following, and should begin at the start of a new line:&lt;br /&gt;
  &amp;lt;tag&amp;gt;: &amp;lt;attribution&amp;gt; [(optional additional context in parenthesis)]&lt;br /&gt;
* If there are more than one attributed people for any given Tag type the &amp;quot;multiple tag lines&amp;quot; format should be used.&lt;br /&gt;
   multiple tag lines:&lt;br /&gt;
   &amp;lt;tag&amp;gt;: &amp;lt;attribution&amp;gt;&lt;br /&gt;
   &amp;lt;tag&amp;gt;: &amp;lt;attribution&amp;gt;&lt;br /&gt;
* The ordering of the &amp;lt;attribution&amp;gt; data should be approximately from &amp;quot;most significant participant&amp;quot; to &amp;quot;least significant participant&amp;quot;.&lt;br /&gt;
* Tagged lines should be after the narrative portion of the commit message.&lt;br /&gt;
* Verbose extra context regarding the tagged items should be included in the narrative portion. Short context may go in parenthesis on the tag line as shown.&lt;br /&gt;
* If the committer is also the sole Author, the &amp;quot;Author:&amp;quot; tag may be omitted and the committer is therefore assumed to be the Author.&lt;br /&gt;
* When including themself in an &amp;lt;attribution&amp;gt;, the committer should spell out their attribution exactly as it appears on the &amp;quot;From:&amp;quot; field of their emails to the list, as they would for any other attributed person. The use of &amp;quot;by me&amp;quot; or other references to themself as &amp;quot;me&amp;quot; is discouraged in the tags section, but is fine in the narrative section of the commit message.&lt;br /&gt;
* When referring to themself in the first person in the commit message of a commit authored or co-authored by someone else, the committer should include a reference to their own name following the personal pronoun.&lt;br /&gt;
&lt;br /&gt;
== Tags: &amp;quot;&amp;lt;tag&amp;gt;:&amp;quot; ==&lt;br /&gt;
; Reported-by&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Suggested-by&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: Used to credit someone who found the bug that the patch attempts to fix or suggested the feature that it adds.&lt;br /&gt;
; Diagnosed-by&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
:  Helped determine the root cause, but stopped short of authoring the patch.&lt;br /&gt;
; Author&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Co-authored-by&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: Used to indicate the patch authors.  If no &amp;quot;Author&amp;quot; or &amp;quot;Co-authored-by&amp;quot; is listed, the committer is assumed to be the author.&lt;br /&gt;
; Reviewed-by&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: Reviewers of the patch that performed a detailed analysis.&lt;br /&gt;
; Tested-by&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: Applied the patch and found it to have the desired effect.&lt;br /&gt;
; Bug&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
:  Bug number with number sign&lt;br /&gt;
; Discussion&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: A URL pointing to the mailing list discussion resulting in the patch. Ideally should point to a relevant message using the &amp;lt;code&amp;gt;https://postgr.es/m/MESSAGE_ID&amp;lt;/code&amp;gt; URL format.&lt;br /&gt;
; Backpatch-through&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: Omit this tag for master-only commits.  In the typical back-patching case where the patch goes into all branches from some oldest branch through master, write just the oldest branch&#039;s major version number, e.g. &amp;quot;15&amp;quot; (without the quotes).  When patching a range of branches that doesn&#039;t include master, write oldest and newest branches, e.g., &amp;quot;13-15&amp;quot;;  a single branch should specify &amp;quot;only&amp;quot;, e.g., &amp;quot;15 only&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Git]]&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Commit_Message_Guidance&amp;diff=43176</id>
		<title>Commit Message Guidance</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Commit_Message_Guidance&amp;diff=43176"/>
		<updated>2026-04-06T13:18:56Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: /* Tags: &amp;quot;:&amp;quot; */ add &amp;quot;committer mention&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following is a DRAFT Request for Comment version of general guidance for PostgreSQL commit messages. The intent is:&lt;br /&gt;
&lt;br /&gt;
# Keep it simple and stay reasonably consistent with past practice.&lt;br /&gt;
# Mirror similar guidance used by other open source projects, while maintaining the unique style of PGDG.&lt;br /&gt;
# Enhance the ability to machine-parse the commit messages for the purposes of acknowledgement (release notes, contributor recognition, various efforts to recognize contribution, etc.)&lt;br /&gt;
&lt;br /&gt;
== General layout of commit message ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;commit message&amp;gt;&lt;br /&gt;
 &amp;lt;summary line&amp;gt;&lt;br /&gt;
 &amp;lt;blank line&amp;gt;&lt;br /&gt;
 &amp;lt;narrative&amp;gt;&lt;br /&gt;
  &amp;lt;para&amp;gt;&amp;lt;/para&amp;gt;&lt;br /&gt;
  &amp;lt;blank line&amp;gt;&lt;br /&gt;
  &amp;lt;para&amp;gt;&amp;lt;/para&amp;gt;&lt;br /&gt;
  &amp;lt;blank line&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/narrative&amp;gt;&lt;br /&gt;
 &amp;lt;tags&amp;gt;&lt;br /&gt;
  &amp;lt;tag&amp;gt;&lt;br /&gt;
  &amp;lt;tag&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/tags&amp;gt;&lt;br /&gt;
&amp;lt;/commit message&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* The Postgres email subject has only 64 characters, so try to stay under this limit.  For a template, use:&lt;br /&gt;
   &amp;lt;code&amp;gt;|-- email subject length limit --------------------------------|&amp;lt;/code&amp;gt;&lt;br /&gt;
* When possible, the &amp;lt;attribution&amp;gt; should be a cut-and-paste of the attributed person&#039;s list email &amp;quot;From:&amp;quot; field, with no alterations.&lt;br /&gt;
* The format of tagged lines should always be the following, and should begin at the start of a new line:&lt;br /&gt;
  &amp;lt;tag&amp;gt;: &amp;lt;attribution&amp;gt; [(optional additional context in parenthesis)]&lt;br /&gt;
* If there are more than one attributed people for any given Tag type the &amp;quot;multiple tag lines&amp;quot; format should be used.&lt;br /&gt;
   multiple tag lines:&lt;br /&gt;
   &amp;lt;tag&amp;gt;: &amp;lt;attribution&amp;gt;&lt;br /&gt;
   &amp;lt;tag&amp;gt;: &amp;lt;attribution&amp;gt;&lt;br /&gt;
* The ordering of the &amp;lt;attribution&amp;gt; data should be approximately from &amp;quot;most significant participant&amp;quot; to &amp;quot;least significant participant&amp;quot;.&lt;br /&gt;
* Tagged lines should be after the narrative portion of the commit message.&lt;br /&gt;
* Verbose extra context regarding the tagged items should be included in the narrative portion. Short context may go in parenthesis on the tag line as shown.&lt;br /&gt;
* If the committer is also the sole Author, the &amp;quot;Author:&amp;quot; tag may be omitted and the committer is therefore assumed to be the Author.&lt;br /&gt;
* When including themself in an &amp;lt;attribution&amp;gt;, the committer should spell out their attribution exactly as it appears on the &amp;quot;From:&amp;quot; field of their emails to the list, as they would for any other attributed person. The use of &amp;quot;by me&amp;quot; or other references to themself as &amp;quot;me&amp;quot; is discouraged in the tags section, but is fine in the narrative section of the commit message.&lt;br /&gt;
* When referring to themself in the first person in the commit message of a commit authored or co-authored by someone else, the committer should include a reference to their own name following the personal pronoun.&lt;br /&gt;
&lt;br /&gt;
== Tags: &amp;quot;&amp;lt;tag&amp;gt;:&amp;quot; ==&lt;br /&gt;
; Reported-by&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Suggested-by&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: Used to credit someone who found the bug that the patch attempts to fix or suggested the feature that it adds.&lt;br /&gt;
; Diagnosed-by&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
:  Helped determine the root cause, but stopped short of authoring the patch.&lt;br /&gt;
; Author&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Co-authored-by&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: Used to indicate the patch authors.  &amp;quot;Co-authored-by:&amp;quot; should list individuals, particularly committers, who modified the patch but should not be listed as authors in the release notes.&lt;br /&gt;
; Reviewed-by&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: Reviewers of the patch that performed a detailed analysis.&lt;br /&gt;
; Tested-by&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: Applied the patch and found it to have the desired effect.&lt;br /&gt;
; Bug&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
:  Bug number with number sign&lt;br /&gt;
; Discussion&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: A URL pointing to the mailing list discussion resulting in the patch. Ideally should point to a relevant message using the &amp;lt;code&amp;gt;https://postgr.es/m/MESSAGE_ID&amp;lt;/code&amp;gt; URL format.&lt;br /&gt;
; Backpatch-through&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: Omit this tag for master-only commits.  In the typical back-patching case where the patch goes into all branches from some oldest branch through master, write just the oldest branch&#039;s major version number, e.g. &amp;quot;15&amp;quot; (without the quotes).  When patching a range of branches that doesn&#039;t include master, write oldest and newest branches, e.g., &amp;quot;13-15&amp;quot;;  a single branch should specify &amp;quot;only&amp;quot;, e.g., &amp;quot;15 only&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Git]]&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Commit_Message_Guidance&amp;diff=43159</id>
		<title>Commit Message Guidance</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Commit_Message_Guidance&amp;diff=43159"/>
		<updated>2026-04-05T13:40:20Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: /* Tags: &amp;quot;:&amp;quot; */ adjust Co-authored-by:&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following is a DRAFT Request for Comment version of general guidance for PostgreSQL commit messages. The intent is:&lt;br /&gt;
&lt;br /&gt;
# Keep it simple and stay reasonably consistent with past practice.&lt;br /&gt;
# Mirror similar guidance used by other open source projects, while maintaining the unique style of PGDG.&lt;br /&gt;
# Enhance the ability to machine-parse the commit messages for the purposes of acknowledgement (release notes, contributor recognition, various efforts to recognize contribution, etc.)&lt;br /&gt;
&lt;br /&gt;
== General layout of commit message ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;commit message&amp;gt;&lt;br /&gt;
 &amp;lt;summary line&amp;gt;&lt;br /&gt;
 &amp;lt;blank line&amp;gt;&lt;br /&gt;
 &amp;lt;narrative&amp;gt;&lt;br /&gt;
  &amp;lt;para&amp;gt;&amp;lt;/para&amp;gt;&lt;br /&gt;
  &amp;lt;blank line&amp;gt;&lt;br /&gt;
  &amp;lt;para&amp;gt;&amp;lt;/para&amp;gt;&lt;br /&gt;
  &amp;lt;blank line&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/narrative&amp;gt;&lt;br /&gt;
 &amp;lt;tags&amp;gt;&lt;br /&gt;
  &amp;lt;tag&amp;gt;&lt;br /&gt;
  &amp;lt;tag&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/tags&amp;gt;&lt;br /&gt;
&amp;lt;/commit message&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* The Postgres email subject has only 64 characters, so try to stay under this limit.  For a template, use:&lt;br /&gt;
   &amp;lt;code&amp;gt;|-- email subject length limit --------------------------------|&amp;lt;/code&amp;gt;&lt;br /&gt;
* When possible, the &amp;lt;attribution&amp;gt; should be a cut-and-paste of the attributed person&#039;s list email &amp;quot;From:&amp;quot; field, with no alterations.&lt;br /&gt;
* The format of tagged lines should always be the following, and should begin at the start of a new line:&lt;br /&gt;
  &amp;lt;tag&amp;gt;: &amp;lt;attribution&amp;gt; [(optional additional context in parenthesis)]&lt;br /&gt;
* If there are more than one attributed people for any given Tag type the &amp;quot;multiple tag lines&amp;quot; format should be used.&lt;br /&gt;
   multiple tag lines:&lt;br /&gt;
   &amp;lt;tag&amp;gt;: &amp;lt;attribution&amp;gt;&lt;br /&gt;
   &amp;lt;tag&amp;gt;: &amp;lt;attribution&amp;gt;&lt;br /&gt;
* The ordering of the &amp;lt;attribution&amp;gt; data should be approximately from &amp;quot;most significant participant&amp;quot; to &amp;quot;least significant participant&amp;quot;.&lt;br /&gt;
* Tagged lines should be after the narrative portion of the commit message.&lt;br /&gt;
* Verbose extra context regarding the tagged items should be included in the narrative portion. Short context may go in parenthesis on the tag line as shown.&lt;br /&gt;
* If the committer is also the sole Author, the &amp;quot;Author:&amp;quot; tag may be omitted and the committer is therefore assumed to be the Author.&lt;br /&gt;
* When including themself in an &amp;lt;attribution&amp;gt;, the committer should spell out their attribution exactly as it appears on the &amp;quot;From:&amp;quot; field of their emails to the list, as they would for any other attributed person. The use of &amp;quot;by me&amp;quot; or other references to themself as &amp;quot;me&amp;quot; is discouraged in the tags section, but is fine in the narrative section of the commit message.&lt;br /&gt;
* When referring to themself in the first person in the commit message of a commit authored or co-authored by someone else, the committer should include a reference to their own name following the personal pronoun.&lt;br /&gt;
&lt;br /&gt;
== Tags: &amp;quot;&amp;lt;tag&amp;gt;:&amp;quot; ==&lt;br /&gt;
; Reported-by&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Suggested-by&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: Used to credit someone who found the bug that the patch attempts to fix or suggested the feature that it adds.&lt;br /&gt;
; Diagnosed-by&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
:  Helped determine the root cause, but stopped short of authoring the patch.&lt;br /&gt;
; Author&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Co-authored-by&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: Used to indicate the patch authors.  &amp;quot;Co-authored-by:&amp;quot; should list individuals who modified the patch but should not be listed as authors in the release notes.&lt;br /&gt;
; Reviewed-by&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: Reviewers of the patch that performed a detailed analysis.&lt;br /&gt;
; Tested-by&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: Applied the patch and found it to have the desired effect.&lt;br /&gt;
; Bug&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
:  Bug number with number sign&lt;br /&gt;
; Discussion&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: A URL pointing to the mailing list discussion resulting in the patch. Ideally should point to a relevant message using the &amp;lt;code&amp;gt;https://postgr.es/m/MESSAGE_ID&amp;lt;/code&amp;gt; URL format.&lt;br /&gt;
; Backpatch-through&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: Omit this tag for master-only commits.  In the typical back-patching case where the patch goes into all branches from some oldest branch through master, write just the oldest branch&#039;s major version number, e.g. &amp;quot;15&amp;quot; (without the quotes).  When patching a range of branches that doesn&#039;t include master, write oldest and newest branches, e.g., &amp;quot;13-15&amp;quot;;  a single branch should specify &amp;quot;only&amp;quot;, e.g., &amp;quot;15 only&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Git]]&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Job_postings&amp;diff=42189</id>
		<title>Job postings</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Job_postings&amp;diff=42189"/>
		<updated>2025-11-09T21:40:51Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: /* Job Description */ simplify&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Our job posting platform is a public, global mailing list.  Once you send an email to the email address [mailto:pgsql-jobs@postgresql.org pgsql-jobs@postgresql.org], and a moderator approves it, your email will be sent to all subscribers of the mailing list.  You should then start receiving private email replies to your job posting.  (Replies should not go to the group email address.)&lt;br /&gt;
&lt;br /&gt;
Additionally, a copy of your email is archived in the web at http://www.postgresql.org/list/pgsql-jobs.  You can also use that link to view previous job postings to get ideas.&lt;br /&gt;
&lt;br /&gt;
When crafting your email, clearly state the employment location in the subject line because this is a global email list.  If remote work is possible, mention that in your email subject too. Attachments such as Microsoft Word or PDF files documents are discouraged; it&#039;s better to include the details of the job position in the email itself.  You can, of course, include links to external sites in your email.&lt;br /&gt;
&lt;br /&gt;
This is how your email should look:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 From: Joan Recruiter &amp;lt;recruiter@company.example.com&amp;gt;&lt;br /&gt;
 To: pgsql-jobs@postgresql.org&lt;br /&gt;
 Subject: Penguin DBA in Willsonville, WI &lt;br /&gt;
 &lt;br /&gt;
 Worldwide Acme Inc. is looking for DBAs and is willing to relocate&lt;br /&gt;
 penguins currently living in the Arctic.&lt;br /&gt;
 &lt;br /&gt;
 Please send your resume and we will send helicopters to pick you up.&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Job Description ======&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A few sentences or short paragraph describing your needs and the skills and experience you are seeking and optionally any urgency you are facing.&lt;br /&gt;
&lt;br /&gt;
====== Required Skills ======&lt;br /&gt;
&lt;br /&gt;
Skills absolutely required.  If you specify a number of years experience in particular products/versions, please be sure to check and make sure that product/version has actually existed for that long.&lt;br /&gt;
&lt;br /&gt;
====== Optional Skills ======&lt;br /&gt;
&lt;br /&gt;
Nice-to-have skills&lt;br /&gt;
&lt;br /&gt;
====== Location ======&lt;br /&gt;
&lt;br /&gt;
Must the work be preformed at a specific location? If so are relocation costs covered?&lt;br /&gt;
&lt;br /&gt;
====== Term ======&lt;br /&gt;
&lt;br /&gt;
Permanent or temporary? If contract, how long?&lt;br /&gt;
&lt;br /&gt;
====== Compensation ======&lt;br /&gt;
&lt;br /&gt;
Annual salary for permanent positions. Hourly rate or fixed amount for contracts.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Job_postings&amp;diff=42188</id>
		<title>Job postings</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Job_postings&amp;diff=42188"/>
		<updated>2025-11-09T21:39:26Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: /* Optional Skills */ simplify text&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Our job posting platform is a public, global mailing list.  Once you send an email to the email address [mailto:pgsql-jobs@postgresql.org pgsql-jobs@postgresql.org], and a moderator approves it, your email will be sent to all subscribers of the mailing list.  You should then start receiving private email replies to your job posting.  (Replies should not go to the group email address.)&lt;br /&gt;
&lt;br /&gt;
Additionally, a copy of your email is archived in the web at http://www.postgresql.org/list/pgsql-jobs.  You can also use that link to view previous job postings to get ideas.&lt;br /&gt;
&lt;br /&gt;
When crafting your email, clearly state the employment location in the subject line because this is a global email list.  If remote work is possible, mention that in your email subject too. Attachments such as Microsoft Word or PDF files documents are discouraged; it&#039;s better to include the details of the job position in the email itself.  You can, of course, include links to external sites in your email.&lt;br /&gt;
&lt;br /&gt;
This is how your email should look:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 From: Joan Recruiter &amp;lt;recruiter@company.example.com&amp;gt;&lt;br /&gt;
 To: pgsql-jobs@postgresql.org&lt;br /&gt;
 Subject: Penguin DBA in Willsonville, WI &lt;br /&gt;
 &lt;br /&gt;
 Worldwide Acme Inc. is looking for DBAs and is willing to relocate&lt;br /&gt;
 penguins currently living in the Arctic.&lt;br /&gt;
 &lt;br /&gt;
 Please send your resume and we will send helicopters to pick you up.&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Job Description ======&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A few sentences or short paragraph describing your needs and the skills and experience you are seeking and optionally the hiring time-frame or urgency you are facing.&lt;br /&gt;
&lt;br /&gt;
====== Required Skills ======&lt;br /&gt;
&lt;br /&gt;
Skills absolutely required.  If you specify a number of years experience in particular products/versions, please be sure to check and make sure that product/version has actually existed for that long.&lt;br /&gt;
&lt;br /&gt;
====== Optional Skills ======&lt;br /&gt;
&lt;br /&gt;
Nice-to-have skills&lt;br /&gt;
&lt;br /&gt;
====== Location ======&lt;br /&gt;
&lt;br /&gt;
Must the work be preformed at a specific location? If so are relocation costs covered?&lt;br /&gt;
&lt;br /&gt;
====== Term ======&lt;br /&gt;
&lt;br /&gt;
Permanent or temporary? If contract, how long?&lt;br /&gt;
&lt;br /&gt;
====== Compensation ======&lt;br /&gt;
&lt;br /&gt;
Annual salary for permanent positions. Hourly rate or fixed amount for contracts.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Job_postings&amp;diff=42187</id>
		<title>Job postings</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Job_postings&amp;diff=42187"/>
		<updated>2025-11-09T21:38:56Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: /* Location */ more text removal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Our job posting platform is a public, global mailing list.  Once you send an email to the email address [mailto:pgsql-jobs@postgresql.org pgsql-jobs@postgresql.org], and a moderator approves it, your email will be sent to all subscribers of the mailing list.  You should then start receiving private email replies to your job posting.  (Replies should not go to the group email address.)&lt;br /&gt;
&lt;br /&gt;
Additionally, a copy of your email is archived in the web at http://www.postgresql.org/list/pgsql-jobs.  You can also use that link to view previous job postings to get ideas.&lt;br /&gt;
&lt;br /&gt;
When crafting your email, clearly state the employment location in the subject line because this is a global email list.  If remote work is possible, mention that in your email subject too. Attachments such as Microsoft Word or PDF files documents are discouraged; it&#039;s better to include the details of the job position in the email itself.  You can, of course, include links to external sites in your email.&lt;br /&gt;
&lt;br /&gt;
This is how your email should look:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 From: Joan Recruiter &amp;lt;recruiter@company.example.com&amp;gt;&lt;br /&gt;
 To: pgsql-jobs@postgresql.org&lt;br /&gt;
 Subject: Penguin DBA in Willsonville, WI &lt;br /&gt;
 &lt;br /&gt;
 Worldwide Acme Inc. is looking for DBAs and is willing to relocate&lt;br /&gt;
 penguins currently living in the Arctic.&lt;br /&gt;
 &lt;br /&gt;
 Please send your resume and we will send helicopters to pick you up.&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Job Description ======&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A few sentences or short paragraph describing your needs and the skills and experience you are seeking and optionally the hiring time-frame or urgency you are facing.&lt;br /&gt;
&lt;br /&gt;
====== Required Skills ======&lt;br /&gt;
&lt;br /&gt;
Skills absolutely required.  If you specify a number of years experience in particular products/versions, please be sure to check and make sure that product/version has actually existed for that long.&lt;br /&gt;
&lt;br /&gt;
====== Optional Skills ======&lt;br /&gt;
&lt;br /&gt;
Nice-to-haves. These skills and experiences will differentiate the most competitive prospective applicants and improve their likelihood of successfully securing an offer.&lt;br /&gt;
&lt;br /&gt;
====== Location ======&lt;br /&gt;
&lt;br /&gt;
Must the work be preformed at a specific location? If so are relocation costs covered?&lt;br /&gt;
&lt;br /&gt;
====== Term ======&lt;br /&gt;
&lt;br /&gt;
Permanent or temporary? If contract, how long?&lt;br /&gt;
&lt;br /&gt;
====== Compensation ======&lt;br /&gt;
&lt;br /&gt;
Annual salary for permanent positions. Hourly rate or fixed amount for contracts.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Job_postings&amp;diff=42186</id>
		<title>Job postings</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Job_postings&amp;diff=42186"/>
		<updated>2025-11-09T21:38:19Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: /* Required Skills */ more text removal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Our job posting platform is a public, global mailing list.  Once you send an email to the email address [mailto:pgsql-jobs@postgresql.org pgsql-jobs@postgresql.org], and a moderator approves it, your email will be sent to all subscribers of the mailing list.  You should then start receiving private email replies to your job posting.  (Replies should not go to the group email address.)&lt;br /&gt;
&lt;br /&gt;
Additionally, a copy of your email is archived in the web at http://www.postgresql.org/list/pgsql-jobs.  You can also use that link to view previous job postings to get ideas.&lt;br /&gt;
&lt;br /&gt;
When crafting your email, clearly state the employment location in the subject line because this is a global email list.  If remote work is possible, mention that in your email subject too. Attachments such as Microsoft Word or PDF files documents are discouraged; it&#039;s better to include the details of the job position in the email itself.  You can, of course, include links to external sites in your email.&lt;br /&gt;
&lt;br /&gt;
This is how your email should look:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 From: Joan Recruiter &amp;lt;recruiter@company.example.com&amp;gt;&lt;br /&gt;
 To: pgsql-jobs@postgresql.org&lt;br /&gt;
 Subject: Penguin DBA in Willsonville, WI &lt;br /&gt;
 &lt;br /&gt;
 Worldwide Acme Inc. is looking for DBAs and is willing to relocate&lt;br /&gt;
 penguins currently living in the Arctic.&lt;br /&gt;
 &lt;br /&gt;
 Please send your resume and we will send helicopters to pick you up.&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Job Description ======&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A few sentences or short paragraph describing your needs and the skills and experience you are seeking and optionally the hiring time-frame or urgency you are facing.&lt;br /&gt;
&lt;br /&gt;
====== Required Skills ======&lt;br /&gt;
&lt;br /&gt;
Skills absolutely required.  If you specify a number of years experience in particular products/versions, please be sure to check and make sure that product/version has actually existed for that long.&lt;br /&gt;
&lt;br /&gt;
====== Optional Skills ======&lt;br /&gt;
&lt;br /&gt;
Nice-to-haves. These skills and experiences will differentiate the most competitive prospective applicants and improve their likelihood of successfully securing an offer.&lt;br /&gt;
&lt;br /&gt;
====== Location ======&lt;br /&gt;
&lt;br /&gt;
Must the work be preformed at a specific location? If so are relocation costs fully covered or not? Be specific.&lt;br /&gt;
&lt;br /&gt;
====== Term ======&lt;br /&gt;
&lt;br /&gt;
Permanent or temporary? If contract, how long?&lt;br /&gt;
&lt;br /&gt;
====== Compensation ======&lt;br /&gt;
&lt;br /&gt;
Annual salary for permanent positions. Hourly rate or fixed amount for contracts.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Job_postings&amp;diff=42185</id>
		<title>Job postings</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Job_postings&amp;diff=42185"/>
		<updated>2025-11-09T21:37:30Z</updated>

		<summary type="html">&lt;p&gt;Bmomjian: Trim unnecessary text&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Our job posting platform is a public, global mailing list.  Once you send an email to the email address [mailto:pgsql-jobs@postgresql.org pgsql-jobs@postgresql.org], and a moderator approves it, your email will be sent to all subscribers of the mailing list.  You should then start receiving private email replies to your job posting.  (Replies should not go to the group email address.)&lt;br /&gt;
&lt;br /&gt;
Additionally, a copy of your email is archived in the web at http://www.postgresql.org/list/pgsql-jobs.  You can also use that link to view previous job postings to get ideas.&lt;br /&gt;
&lt;br /&gt;
When crafting your email, clearly state the employment location in the subject line because this is a global email list.  If remote work is possible, mention that in your email subject too. Attachments such as Microsoft Word or PDF files documents are discouraged; it&#039;s better to include the details of the job position in the email itself.  You can, of course, include links to external sites in your email.&lt;br /&gt;
&lt;br /&gt;
This is how your email should look:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 From: Joan Recruiter &amp;lt;recruiter@company.example.com&amp;gt;&lt;br /&gt;
 To: pgsql-jobs@postgresql.org&lt;br /&gt;
 Subject: Penguin DBA in Willsonville, WI &lt;br /&gt;
 &lt;br /&gt;
 Worldwide Acme Inc. is looking for DBAs and is willing to relocate&lt;br /&gt;
 penguins currently living in the Arctic.&lt;br /&gt;
 &lt;br /&gt;
 Please send your resume and we will send helicopters to pick you up.&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Job Description ======&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A few sentences or short paragraph describing your needs and the skills and experience you are seeking and optionally the hiring time-frame or urgency you are facing.&lt;br /&gt;
&lt;br /&gt;
====== Required Skills ======&lt;br /&gt;
&lt;br /&gt;
Skills absolutely required. “Required” means show-stopping: Prospective applicants not presenting this background will not be considered under any circumstances and should not inquire further. &lt;br /&gt;
&lt;br /&gt;
Note: If you specify a number of years experience in particular products/versions, please be sure to check and make sure that product/version has actually existed for that long. Really, it&#039;s embarrassing and insulting if you don&#039;t.&lt;br /&gt;
&lt;br /&gt;
====== Optional Skills ======&lt;br /&gt;
&lt;br /&gt;
Nice-to-haves. These skills and experiences will differentiate the most competitive prospective applicants and improve their likelihood of successfully securing an offer.&lt;br /&gt;
&lt;br /&gt;
====== Location ======&lt;br /&gt;
&lt;br /&gt;
Must the work be preformed at a specific location? If so are relocation costs fully covered or not? Be specific.&lt;br /&gt;
&lt;br /&gt;
====== Term ======&lt;br /&gt;
&lt;br /&gt;
Permanent or temporary? If contract, how long?&lt;br /&gt;
&lt;br /&gt;
====== Compensation ======&lt;br /&gt;
&lt;br /&gt;
Annual salary for permanent positions. Hourly rate or fixed amount for contracts.&lt;/div&gt;</summary>
		<author><name>Bmomjian</name></author>
	</entry>
</feed>