Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-blurb for openSUSE:Factory 
checked in at 2022-05-21 19:06:00
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-blurb (Old)
 and      /work/SRC/openSUSE:Factory/.python-blurb.new.1538 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-blurb"

Sat May 21 19:06:00 2022 rev:3 rq:978315 version:1.1.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-blurb/python-blurb.changes        
2021-05-18 18:27:30.142686778 +0200
+++ /work/SRC/openSUSE:Factory/.python-blurb.new.1538/python-blurb.changes      
2022-05-21 19:06:15.763305662 +0200
@@ -1,0 +2,8 @@
+Fri May 20 15:26:45 UTC 2022 - Matej Cepl <mc...@suse.com>
+
+- Update to 1.1.0:
+  - Support GitHub Issues in addition to b.p.o
+    (bugs.python.org). If "gh-issue" is in the metadata, then the
+    filename will contain "gh-issue-<number>" instead of "bpo-".
+
+-------------------------------------------------------------------

Old:
----
  blurb-1.0.8.tar.gz

New:
----
  blurb-1.1.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-blurb.spec ++++++
--- /var/tmp/diff_new_pack.8LFBKK/_old  2022-05-21 19:06:16.355306520 +0200
+++ /var/tmp/diff_new_pack.8LFBKK/_new  2022-05-21 19:06:16.359306526 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package python-blurb
 #
-# Copyright (c) 2021 SUSE LLC
+# Copyright (c) 2022 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -19,43 +19,60 @@
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 %define skip_python2 1
 Name:           python-blurb
-Version:        1.0.8
+Version:        1.1.0
 Release:        0
 Summary:        Command-line tool to manage CPython Misc/NEWS.d entries
 License:        BSD-3-Clause
 Group:          Development/Languages/Python
 URL:            https://github.com/python/core-workflow/tree/master/blurb
 Source:         
https://files.pythonhosted.org/packages/source/b/blurb/blurb-%{version}.tar.gz
-BuildRequires:  %{python_module base >= 3.5}
-BuildRequires:  %{python_module devel}
+BuildRequires:  %{python_module base >= 3.7}
+BuildRequires:  %{python_module flit-core}
+BuildRequires:  %{python_module pip}
 BuildRequires:  %{python_module pytest}
 BuildRequires:  %{python_module setuptools}
+BuildRequires:  %{python_module wheel}
 BuildRequires:  fdupes
 BuildRequires:  python-rpm-macros
 BuildArch:      noarch
+Requires(post): update-alternatives
+Requires(postun):update-alternatives
 %python_subpackages
 
 %description
 Command-line tool to manage CPython Misc/NEWS.d entries.
 
 %prep
-%setup -q -n blurb-%{version}
+%autosetup -p1 -n blurb-%{version}
+
+sed -i '1{\,^#!%{_bindir}/env python,d}' blurb.py
+chmod -x blurb.py
 
 %build
-%python_build
+%pyproject_wheel
+
+%install
+%pyproject_install
+%python_clone -a %{buildroot}%{_bindir}/blurb
+%python_expand %fdupes %{buildroot}%{$python_sitelib}
 
 %check
 mkdir blurb
 mv tests blurb
 %pytest blurb.py
 
-%install
-%python_install
-%python_expand %fdupes %{buildroot}%{$python_sitelib}
+%post
+%python_install_alternative blurb
+
+%postun
+%python_uninstall_alternative blurb
 
 %files %{python_files}
 %doc README.rst
 %license LICENSE.txt
-%{python_sitelib}/*
+%python_alternative %{_bindir}/blurb
+%{python_sitelib}/blurb.py
+%pycache_only %{python_sitelib}/__pycache__/blurb*.pyc
+%{python_sitelib}/blurb-%{version}*-info
 
 %changelog

++++++ blurb-1.0.8.tar.gz -> blurb-1.1.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/blurb-1.0.8/PKG-INFO new/blurb-1.1.0/PKG-INFO
--- old/blurb-1.0.8/PKG-INFO    1970-01-01 01:00:00.000000000 +0100
+++ new/blurb-1.1.0/PKG-INFO    1970-01-01 01:00:00.000000000 +0100
@@ -1,7 +1,286 @@
-Metadata-Version: 1.1
+Metadata-Version: 2.1
 Name: blurb
-Version: 1.0.8
+Version: 1.1.0
 Summary: Command-line tool to manage CPython Misc/NEWS.d entries.
 Home-page: https://github.com/python/core-workflow/tree/master/blurb
 Author: Larry Hastings
 Author-email: la...@hastings.org
+Maintainer: Python Core Developers
+Maintainer-email: core-workf...@mail.python.org
+Requires-Python: >=3.7
+Description-Content-Type: text/x-rst
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Programming Language :: Python :: 3 :: Only
+
+blurb
+=====
+
+.. image:: https://img.shields.io/pypi/v/blurb.svg
+    :target: https://pypi.org/project/blurb/
+
+Overview
+--------
+
+**blurb** is a tool designed to rid CPython core development
+of the scourge of ``Misc/NEWS`` conflicts.
+
+The core concept: split ``Misc/NEWS`` into many
+separate files that, when concatenated back together
+in sorted order, reconstitute the original ``Misc/NEWS`` file.
+After that, ``Misc/NEWS`` could be deleted from the CPython
+repo and thereafter rendered on demand (e.g. when building
+a release).  When checking in a change to CPython, the checkin
+process will write out a new file that sorts into the correct place,
+using a filename unlikely to have a merge conflict.
+
+**blurb** is a single command with a number of subcommands.
+It's designed  to be run inside a valid CPython (git) repo,
+and automatically uses the correct file paths.
+
+You can install **blurb** from PyPI using ``pip``.  Alternatively,
+simply add ``blurb`` to a directory on your path.
+**blurb**'s only dependency is Python 3.7+.
+
+
+Files used by blurb
+-------------------
+
+**blurb** uses a new directory tree called ``Misc/NEWS.d``.
+Everything it does is in there, except for possibly
+modifying ``Misc/NEWS``.
+
+Under ``Misc/NEWS.d`` you'll find the following:
+
+* A single file for all news entries per previous revision,
+  named for the exact version number, with the extension ``.rst``.
+  Example: ``Misc/NEWS.d/3.6.0b2.rst``.
+
+* The ``next`` directory, which contains subdirectories representing
+  the various ``Misc/NEWS`` categories.  Inside these subdirectories
+  are more ``.rst`` files with long, uninteresting, computer-generated
+  names.  Example:
+  ``Misc/NEWS.d/next/Library/2017-05-04-12-24-06.gh-issue-25458.Yl4gI2.rst``
+
+
+blurb subcommands
+-----------------
+
+Like many modern utilities, **blurb** has only one executable
+(called ``blurb``), but provides a diverse set of functionality
+through subcommands.  The subcommand is the first argument specified
+on the command-line.
+
+If you're a CPython core developer, you probably don't need to use
+anything except ``blurb add``--and you don't even need to specify
+the ``add`` part.
+(If no subcommand is specified, **blurb** assumes you meant ``blurb add``.)
+The other commands are only expected to be useful for CPython release
+managers.
+
+
+
+blurb help
+~~~~~~~~~~
+
+**blurb** is self-documenting through the ``blurb help`` subcommand.
+Run without any further arguments, it prints a list of all subcommands,
+with a one-line summary of the functionality of each.  Run with a
+third argument, it prints help on that subcommand (e.g. ``blurb help 
release``).
+
+
+blurb add
+~~~~~~~~~
+
+``blurb add`` adds a new Misc/NEWS entry for you.
+It opens a text editor on a template; you edit the
+file, save, and exit.  **blurb** then stores the file
+in the correct place, and stages it in ``git`` for you.
+
+The template for the ``blurb add`` message looks like this::
+
+    #
+    # Please enter the relevant GitHub issue number here:
+    #
+    .. gh-issue:
+
+    #
+    # Uncomment one of these "section:" lines to specify which section
+    # this entry should go in in Misc/NEWS.
+    #
+    #.. section: Security
+    #.. section: Core and Builtins
+    #.. section: Library
+    #.. section: Documentation
+    #.. section: Tests
+    #.. section: Build
+    #.. section: Windows
+    #.. section: macOS
+    #.. section: IDLE
+    #.. section: Tools/Demos
+    #.. section: C API
+
+    # Write your Misc/NEWS entry below.  It should be a simple ReST paragraph.
+    # Don't start with "- Issue #<n>: " or "- gh-issue<n>: " or that sort of 
stuff.
+    ###########################################################################
+
+Here's how you interact with the file:
+
+* Add the GitHub issue number for this checkin to the
+  end of the ``.. gh-issue:`` line.
+
+* Uncomment the line with the relevant ``Misc/NEWS`` section for this entry.
+  For example, if this should go in the ``Library`` section, uncomment
+  the line reading ``#.. section: Library``.  To uncomment, just delete
+  the ``#`` at the front of the line.
+
+* Finally, go to the end of the file, and enter your NEWS entry.
+  This should be a single paragraph of English text using
+  simple ReST markup.
+
+When ``blurb add`` gets a valid entry, it writes it to a file
+with the following format::
+
+    Misc/NEWS.d/next/<section>/<datetime>.gh-issue-<issue_number>.<nonce>.rst
+
+For example, a file added by ``blurb add`` might look like this::
+
+    Misc/NEWS.d/next/Library/2017-05-04-12-24-06.gh-issue-25458.Yl4gI2.rst
+
+``<section>`` is the section provided in the checkin message.
+
+``<datetime>`` is the current UTC time, formatted as
+``YYYY-MM-DD-hh-mm-ss``.
+
+``<nonce>`` is a hopefully-unique string of characters meant to
+prevent filename collisions.  **blurb** creates this by computing
+the MD5 hash of the text, converting it to base64 (using the
+"urlsafe" alphabet), and taking the first 6 characters of that.
+
+
+This filename ensures several things:
+
+* All entries in ``Misc/NEWS`` will be sorted by time.
+
+* It is unthinkably unlikely that there'll be a conflict
+  between the filenames generated for two developers checking in,
+  even if they check in at the exact same second.
+
+
+Finally, ``blurb add`` stages the file in git for you.
+
+
+blurb merge
+~~~~~~~~~~~
+
+``blurb merge`` recombines all the files in the
+``Misc/NEWS.d`` tree back into a single ``NEWS`` file.
+
+``blurb merge`` accepts only a single command-line argument:
+the file to write to.  By default it writes to
+``Misc/NEWS`` (relative to the root of your CPython checkout).
+
+Splitting and recombining the existing ``Misc/NEWS`` file
+doesn't recreate the previous ``Misc/NEWS`` exactly.  This
+is because ``Misc/NEWS`` never used a consistent ordering
+for the "sections" inside each release, whereas ``blurb merge``
+has a hard-coded preferred ordering for the sections.  Also,
+**blurb** aggressively reflows paragraphs to < 78 columns,
+wheras the original hand-edited file occasionally had lines
+> 80 columns.  Finally, **blurb** strictly uses ``gh-issue-<n>:`` to
+specify issue numbers at the beginnings of entries, wheras
+the legacy approach to ``Misc/NEWS`` required using ``Issue #<n>:``.
+
+
+blurb release
+~~~~~~~~~~~~~
+
+``blurb release`` is used by the release manager as part of
+the CPython release process.  It takes exactly one argument,
+the name of the version being released.
+
+Here's what it does under the hood:
+
+* Combines all recently-added NEWS entries from
+  the ``Misc/NEWS.d/next`` directory into ``Misc/NEWS.d/<version>.rst``.
+* Runs ``blurb merge`` to produce an updated ``Misc/NEWS`` file.
+
+One hidden feature: if the version specified is ``.``, ``blurb release``
+uses the name of the directory CPython is checked out to.
+(When making a release I generally name the directory after the
+version I'm releasing, and using this shortcut saves me some typing.)
+
+
+blurb split
+~~~~~~~~~~~
+
+``blurb split`` only needs to be run once per-branch, ever.
+It reads in ``Misc/NEWS``
+and splits it into individual ``.rst`` files.
+The text files are stored as follows::
+
+    Misc/NEWS.d/<version>.rst
+
+``<version>`` is the version number of Python where the
+change was committed.  Pre-release versions are denoted
+with an abbreviation: ``a`` for alphas, ``b`` for betas,
+and ``rc`` for release candidates.
+
+The individual ``<version>.rst`` files actually (usually)
+contain multiple entries.  Each entry is delimited by a
+single line containing ``..`` by itself.
+
+The assumption is, at the point we convert over to *blurb*,
+we'll run ``blurb split`` on each active branch,
+remove ``Misc/NEWS`` from the repo entirely,
+never run ``blurb split`` ever again,
+and ride off into the sunset, confident that the world is now
+a better place.
+
+
+
+The "next" directory
+--------------------
+
+You may have noticed that ``blurb add`` adds news entries to
+a directory called ``next``, and ``blurb release`` combines those
+news entries into a single file named with the version.  Why
+is that?
+
+First, it makes naming the next version a late-binding decision.
+If we are currently working on 3.6.5rc1, but there's a zero-day
+exploit and we need to release an emergency 3.6.5 final, we don't
+have to fix up a bunch of metadata.
+
+Second, it means that if you cherry-pick a commit forward or
+backwards, you automatically pick up the NEWS entry too.  You
+don't need to touch anything up--the system will already do
+the right thing.  If NEWS entries were already written to the
+final version directory, you'd have to move those around as
+part of the cherry-picking process.
+
+Changelog
+---------
+
+1.1.0
+~~~~~
+
+- Support GitHub Issues in addition to b.p.o (bugs.python.org).
+  If "gh-issue" is in the metadata, then the filename will contain 
"gh-issue-<number>" instead of "bpo-".
+
+1.0.7
+~~~~~
+
+- When word wrapping, don't break on long words or hyphens.
+- Use the ``-f`` flag when adding **blurb** files to a ``git``
+  checkin.  This forces them to be added, even when the files
+  might normally be ignored based on a ``.gitignore`` directive.
+- Explicitly support the ``-help`` command-line option.
+- Fix Travis CI integration.
+
+Copyright
+---------
+
+**blurb** is Copyright 2015-2018 by Larry Hastings.
+Licensed to the PSF under a contributor agreement.
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/blurb-1.0.8/README.rst new/blurb-1.1.0/README.rst
--- old/blurb-1.0.8/README.rst  2020-09-05 11:13:54.877884900 +0200
+++ new/blurb-1.1.0/README.rst  1990-08-09 16:25:15.000000000 +0200
@@ -25,7 +25,7 @@
 
 You can install **blurb** from PyPI using ``pip``.  Alternatively,
 simply add ``blurb`` to a directory on your path.
-**blurb**'s only dependency is Python 3.5+.
+**blurb**'s only dependency is Python 3.7+.
 
 
 Files used by blurb
@@ -45,7 +45,7 @@
   the various ``Misc/NEWS`` categories.  Inside these subdirectories
   are more ``.rst`` files with long, uninteresting, computer-generated
   names.  Example:
-  ``Misc/NEWS.d/next/Library/2017-05-04-12-24-06.bpo-25458.Yl4gI2.rst``
+  ``Misc/NEWS.d/next/Library/2017-05-04-12-24-06.gh-issue-25458.Yl4gI2.rst``
 
 
 blurb subcommands
@@ -85,9 +85,9 @@
 The template for the ``blurb add`` message looks like this::
 
     #
-    # Please enter the relevant bugs.python.org issue number here:
+    # Please enter the relevant GitHub issue number here:
     #
-    .. bpo:
+    .. gh-issue:
 
     #
     # Uncomment one of these "section:" lines to specify which section
@@ -106,13 +106,13 @@
     #.. section: C API
 
     # Write your Misc/NEWS entry below.  It should be a simple ReST paragraph.
-    # Don't start with "- Issue #<n>: " or "- bpo-<n>: "or that sort of stuff.
+    # Don't start with "- Issue #<n>: " or "- gh-issue<n>: " or that sort of 
stuff.
     ###########################################################################
 
 Here's how you interact with the file:
 
-* Add the ``bugs.python.org`` issue number for this checkin to the
-  end of the ``.. bpo:`` line.
+* Add the GitHub issue number for this checkin to the
+  end of the ``.. gh-issue:`` line.
 
 * Uncomment the line with the relevant ``Misc/NEWS`` section for this entry.
   For example, if this should go in the ``Library`` section, uncomment
@@ -126,11 +126,11 @@
 When ``blurb add`` gets a valid entry, it writes it to a file
 with the following format::
 
-    Misc/NEWS.d/next/<section>/<datetime>.bpo-<bpo>.<nonce>.rst
+    Misc/NEWS.d/next/<section>/<datetime>.gh-issue-<issue_number>.<nonce>.rst
 
 For example, a file added by ``blurb add`` might look like this::
 
-    Misc/NEWS.d/next/Library/2017-05-04-12-24-06.bpo-25458.Yl4gI2.rst
+    Misc/NEWS.d/next/Library/2017-05-04-12-24-06.gh-issue-25458.Yl4gI2.rst
 
 ``<section>`` is the section provided in the checkin message.
 
@@ -172,7 +172,7 @@
 has a hard-coded preferred ordering for the sections.  Also,
 **blurb** aggressively reflows paragraphs to < 78 columns,
 wheras the original hand-edited file occasionally had lines
-> 80 columns.  Finally, **blurb** strictly uses ``bpo-<n>:`` to
+> 80 columns.  Finally, **blurb** strictly uses ``gh-issue-<n>:`` to
 specify issue numbers at the beginnings of entries, wheras
 the legacy approach to ``Misc/NEWS`` required using ``Issue #<n>:``.
 
@@ -247,6 +247,12 @@
 Changelog
 ---------
 
+1.1.0
+~~~~~
+
+- Support GitHub Issues in addition to b.p.o (bugs.python.org).
+  If "gh-issue" is in the metadata, then the filename will contain 
"gh-issue-<number>" instead of "bpo-".
+
 1.0.7
 ~~~~~
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/blurb-1.0.8/blurb.py new/blurb-1.1.0/blurb.py
--- old/blurb-1.0.8/blurb.py    2020-09-05 11:17:59.395168300 +0200
+++ new/blurb-1.1.0/blurb.py    1990-08-09 16:25:15.000000000 +0200
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
 """Command-line tool to manage CPython Misc/NEWS.d entries."""
-__version__ = "1.0.8"
+__version__ = "1.1.0"
 
 ##
 ## blurb version 1.0
@@ -46,13 +46,14 @@
 import atexit
 import base64
 import builtins
-from collections import OrderedDict
 import glob
 import hashlib
+import io
 import inspect
 import itertools
 import math
 import os
+from pathlib import Path
 import re
 import shlex
 import shutil
@@ -61,9 +62,7 @@
 import tempfile
 import textwrap
 import time
-import types
 import unittest
-import uuid
 
 
 #
@@ -74,9 +73,9 @@
 template = """
 
 #
-# Please enter the relevant bugs.python.org issue number here:
+# Please enter the relevant GitHub issue number here:
 #
-.. bpo:
+.. gh-issue:
 
 #
 # Uncomment one of these "section:" lines to specify which section
@@ -95,7 +94,7 @@
 #.. section: C API
 
 # Write your Misc/NEWS entry below.  It should be a simple ReST paragraph.
-# Don't start with "- Issue #<n>: " or "- bpo-<n>: " or that sort of stuff.
+# Don't start with "- Issue #<n>: " or "- gh-issue-<n>: " or that sort of 
stuff.
 ###########################################################################
 
 
@@ -112,32 +111,6 @@
         sections.append(section.strip())
 
 
-def f(s):
-    """
-    Basic support for 3.6's f-strings, in 3.5!
-
-    Formats "s" using appropriate globals and locals
-    dictionaries.  This f-string:
-        f"hello a is {a}"
-    simply becomes
-        f("hello a is {a}")
-    In other words, just throw parentheses around the
-    string, and you're done!
-
-    Implemented internally using str.format_map().
-    This means it doesn't support expressions:
-        f("two minus three is {2-3}")
-    And it doesn't support function calls:
-        f("how many elements? {len(my_list)}")
-    But most other f-string features work.
-    """
-    frame = sys._getframe(1)
-    d = dict(builtins.__dict__)
-    d.update(frame.f_globals)
-    d.update(frame.f_locals)
-    return s.format_map(d)
-
-
 def sanitize_section(section):
     """
 Cleans up a section string, making it viable as a directory name.
@@ -250,10 +223,10 @@
 
 
 def prompt(prompt):
-    return input(f("[{prompt}> "))
+    return input(f"[{prompt}> ")
 
 def require_ok(prompt):
-    prompt = f("[{prompt}> ")
+    prompt = f"[{prompt}> "
     while True:
         s = input(prompt).strip()
         if s == 'ok':
@@ -435,11 +408,11 @@
   * Trailing whitespace is stripped.  Leading whitespace is preserved.
   * Empty lines between non-empty lines are preserved.
     Trailing empty lines are stripped.
-  * The BODY mustn't start with "Issue #", "bpo-", or "- ".
+  * The BODY mustn't start with "Issue #", "gh-", or "- ".
     (This formatting will be inserted when rendering the final output.)
   * Lines longer than 76 characters will be wordwrapped.
       * In the final output, the first line will have
-        "- bpo-<bpo-number>: " inserted at the front,
+        "- gh-issue-<gh-issue-number>: " inserted at the front,
         and subsequent lines will have two spaces inserted
         at the front.
 
@@ -450,11 +423,11 @@
 
 The format of a "next" file is exactly the same, except that we're storing
 four pieces of metadata in the filename instead of in the metadata section.
-Those four pieces of metadata are: section, bpo, date, and nonce.
+Those four pieces of metadata are: section, gh-issue, date, and nonce.
 
 -----------------------------------------------------------------------------
 
-In addition to the four conventional metadata (section, bpo, date, and nonce),
+In addition to the four conventional metadata (section, gh-issue, date, and 
nonce),
 there are two additional metadata used per-version: "release date" and
 "no changes".  These may only be present in the metadata block in the *first*
 blurb in a blurb file.
@@ -463,7 +436,7 @@
     for this version.  When used, there are two more things that must be
     true about the the blurb file:
       * There should only be one entry inside the blurb file.
-      * That entry's bpo number must be 0.
+      * That entry's gh-issue number must be 0.
 
 """
 
@@ -483,7 +456,7 @@
         line_number = None
 
         def throw(s):
-            raise BlurbError(f("Error in {filename}:{line_number}:\n{s}"))
+            raise BlurbError(f"Error in {filename}:{line_number}:\n{s}")
 
         def finish_entry():
             nonlocal body
@@ -494,8 +467,8 @@
             if not body:
                 throw("Blurb 'body' text must not be empty!")
             text = textwrap_body(body)
-            for naughty_prefix in ("- ", "Issue #", "bpo-"):
-                if text.startswith(naughty_prefix):
+            for naughty_prefix in ("- ", "Issue #", "bpo-", "gh-", 
"gh-issue-"):
+                if re.match(naughty_prefix, text, re.I):
                     throw("Blurb 'body' can't start with " + 
repr(naughty_prefix) + "!")
 
             no_changes = metadata.get('no changes')
@@ -507,11 +480,19 @@
                 elif section not in sections:
                     throw("Invalid 'section'!  You must use one of the 
predefined sections.")
 
-            bpo = None
-            try:
-                bpo = int(metadata.get('bpo'))
-            except (TypeError, ValueError):
-                throw("Invalid bpo issue number! (" + repr(bpo) + ")")
+            issue_number = None
+
+            if metadata.get("gh-issue") is not None:
+                try:
+                    issue_number = int(metadata.get('gh-issue'))
+                except (TypeError, ValueError):
+                    throw("Invalid GitHub issue number! (" + 
repr(issue_number) + ")")
+            elif metadata.get("bpo") is not None:
+                try:
+                    issue_number = int(metadata.get('bpo'))
+                except (TypeError, ValueError):
+                    throw("Invalid bpo issue number! (" + repr(issue_number) + 
")")
+
 
             self.append((metadata, text))
             metadata = {}
@@ -525,7 +506,7 @@
                     line = line[2:].strip()
                     name, colon, value = line.partition(":")
                     assert colon
-                    name = name.strip()
+                    name = name.lower().strip()
                     value = value.strip()
                     if name in metadata:
                         throw("Blurb metadata sets " + repr(name) + " twice!")
@@ -548,7 +529,7 @@
 
 Broadly equivalent to blurb.parse(open(filename).read()).
         """
-        with open(filename, "rt", encoding="utf-8") as file:
+        with open(filename, encoding="utf-8") as file:
             text = file.read()
         self.parse(text, metadata=metadata, filename=filename)
 
@@ -563,7 +544,7 @@
                 add_separator = True
             if metadata:
                 for name, value in sorted(metadata.items()):
-                    add(f(".. {name}: {value}\n"))
+                    add(f".. {name}: {value}\n")
                 add("\n")
             add(textwrap_body(body))
         return "".join(output)
@@ -585,16 +566,16 @@
         components = filename.split(os.sep)
         section, filename = components[-2:]
         section = unsanitize_section(section)
-        assert section in sections, f("Unknown section {section}")
+        assert section in sections, f"Unknown section {section}"
 
         fields = [x.strip() for x in filename.split(".")]
-        assert len(fields) >= 4, f("Can't parse 'next' filename! filename 
{filename!r} fields {fields}")
+        assert len(fields) >= 4, f"Can't parse 'next' filename! filename 
{filename!r} fields {fields}"
         assert fields[-1] == "rst"
 
         metadata = {"date": fields[0], "nonce": fields[-2], "section": section}
 
         for field in fields[1:-2]:
-            for name in ("bpo",):
+            for name in ("gh-issue","bpo"):
                 _, got, value = field.partition(name + "-")
                 if got:
                     metadata[name] = value.strip()
@@ -615,6 +596,7 @@
         metadata, body = self[-1]
         assert 'section' in metadata
         for name, default in (
+            ("gh-issue", "0"),
             ("bpo", "0"),
             ("date", sortable_datetime()),
             ("nonce", nonceify(body)),
@@ -630,8 +612,12 @@
         metadata, body = self[-1]
         metadata['section'] = sanitize_section(metadata['section'])
         metadata['root'] = root
-        path = 
"{root}/Misc/NEWS.d/next/{section}/{date}.bpo-{bpo}.{nonce}.rst".format_map(metadata)
-        for name in "root section date bpo nonce".split():
+        if int(metadata["gh-issue"]) > 0 :
+            path = 
"{root}/Misc/NEWS.d/next/{section}/{date}.gh-issue-{gh-issue}.{nonce}.rst".format_map(metadata)
+        elif int(metadata["bpo"]) > 0:
+            # assume it's a GH issue number
+            path = 
"{root}/Misc/NEWS.d/next/{section}/{date}.bpo-{bpo}.{nonce}.rst".format_map(metadata)
+        for name in "root section date gh-issue bpo nonce".split():
             del metadata[name]
         return path
 
@@ -705,12 +691,12 @@
     def filename_test(self, filename):
         b = Blurbs()
         with self.assertRaises(Exception):
-            b.read(filename)
+            b.load(filename)
 
 
 
 def run(s):
-    process = subprocess.run(s.split(), stdout=subprocess.PIPE, 
stderr=subprocess.PIPE)
+    process = subprocess.run(s.split(), capture_output=True)
     process.check_returncode()
     return process.stdout.decode('ascii')
 
@@ -738,7 +724,7 @@
         def test_first_line(filename, test):
             if not os.path.exists(filename):
                 return False
-            with open(filename, "rt") as file:
+            with open(filename) as file:
                 lines = file.read().split('\n')
                 if not (lines and test(lines[0])):
                     return False
@@ -777,7 +763,7 @@
 def get_subcommand(subcommand):
     fn = subcommands.get(subcommand)
     if not fn:
-        error(f("Unknown subcommand: {subcommand}\nRun 'blurb help' for 
help."))
+        error(f"Unknown subcommand: {subcommand}\nRun 'blurb help' for help.")
     return fn
 
 
@@ -839,19 +825,19 @@
     for name, p in inspect.signature(fn).parameters.items():
         if p.kind == inspect.Parameter.KEYWORD_ONLY:
             short_option = name[0]
-            options.append(f(" [-{short_option}|--{name}]"))
+            options.append(f" [-{short_option}|--{name}]")
         elif p.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD:
             positionals.append(" ")
             has_default = (p.default != inspect._empty)
             if has_default:
                 positionals.append("[")
                 nesting += 1
-            positionals.append(f("<{name}>"))
+            positionals.append(f"<{name}>")
     positionals.append("]" * nesting)
 
 
     parameters = "".join(options + positionals)
-    print(f("blurb {subcommand}{parameters}"))
+    print(f"blurb {subcommand}{parameters}")
     print()
     print(doc)
     sys.exit(0)
@@ -919,14 +905,14 @@
             # my editor likes to strip trailing whitespace from lines.
             # normally this is a good idea.  but in the case of the template
             # it's unhelpful.
-            # so, manually ensure there's a space at the end of the bpo line.
+            # so, manually ensure there's a space at the end of the gh-issue 
line.
             text = template
 
-            bpo_line = ".. bpo:"
-            without_space = "\n" + bpo_line + "\n"
-            with_space = "\n" + bpo_line + " \n"
+            issue_line = ".. gh-issue:"
+            without_space = "\n" + issue_line + "\n"
+            with_space = "\n" + issue_line + " \n"
             if without_space not in text:
-                sys.exit("Can't find BPO line to ensure there's a space on the 
end!")
+                sys.exit("Can't find gh-issue line to ensure there's a space 
on the end!")
             text = text.replace(without_space, with_space)
             file.write(text)
 
@@ -942,7 +928,7 @@
     else:
         args = list(shlex.split(editor))
         if not shutil.which(args[0]):
-            sys.exit(f("Invalid GIT_EDITOR / EDITOR value: {editor}"))
+            sys.exit(f"Invalid GIT_EDITOR / EDITOR value: {editor}")
     args.append(tmp_path)
 
     while True:
@@ -962,7 +948,7 @@
 
         if failure:
             print()
-            print(f("Error: {failure}"))
+            print(f"Error: {failure}")
             print()
             try:
                 prompt("Hit return to retry (or Ctrl-C to abort)")
@@ -996,20 +982,20 @@
     if existing_filenames:
         error("Sorry, can't handle appending 'next' files to an existing 
version (yet).")
 
-    output = f("Misc/NEWS.d/{version}.rst")
+    output = f"Misc/NEWS.d/{version}.rst"
     filenames = glob_blurbs("next")
     blurbs = Blurbs()
     date = current_date()
 
     if not filenames:
-        print(f("No blurbs found.  Setting {version} as having no changes."))
-        body = f("There were no new changes in version {version}.\n")
-        metadata = {"no changes": "True", "bpo": "0", "section": "Library", 
"date": date, "nonce": nonceify(body)}
+        print(f"No blurbs found.  Setting {version} as having no changes.")
+        body = f"There were no new changes in version {version}.\n"
+        metadata = {"no changes": "True", "gh-issue": "0", "section": 
"Library", "date": date, "nonce": nonceify(body)}
         blurbs.append((metadata, body))
     else:
         no_changes = None
         count = len(filenames)
-        print(f('Merging {count} blurbs to "{output}".'))
+        print(f'Merging {count} blurbs to "{output}".')
 
         for filename in filenames:
             if not filename.endswith(".rst"):
@@ -1026,14 +1012,14 @@
     flush_git_add_files()
 
     how_many = len(filenames)
-    print(f("Removing {how_many} 'next' files from git."))
+    print(f"Removing {how_many} 'next' files from git.")
     git_rm_files.extend(filenames)
     flush_git_rm_files()
 
     # sanity check: ensuring that saving/reloading the merged blurb file works.
     blurbs2 = Blurbs()
     blurbs2.load(output)
-    assert blurbs2 == blurbs, f("Reloading {output} isn't reproducible?!")
+    assert blurbs2 == blurbs, f"Reloading {output} isn't reproducible?!"
 
     print()
     print("Ready for commit.")
@@ -1064,11 +1050,15 @@
         builtins.print("You already have a", repr(output), "file.")
         require_ok("Type ok to overwrite")
 
-    news = open(output, "wt", encoding="utf-8")
+    write_news(output, versions=versions)
+
+
+def write_news(output, *, versions):
+    buff = io.StringIO()
 
     def print(*a, sep=" "):
         s = sep.join(str(x) for x in a)
-        return builtins.print(s, file=news)
+        return builtins.print(s, file=buff)
 
     print ("""
 +++++++++++
@@ -1104,7 +1094,7 @@
         metadata, body = blurbs[0]
         release_date = metadata["release date"]
 
-        print(f("*Release date: {release_date}*"))
+        print(f"*Release date: {release_date}*")
         print()
 
         if "no changes" in metadata:
@@ -1120,16 +1110,34 @@
                 print(section)
                 print("-" * len(section))
                 print()
+            if metadata.get("gh-issue"):
+                issue_number = metadata['gh-issue']
+                if int(issue_number):
+                    body = "gh-issue-" + issue_number + ": " + body
+            elif metadata.get("bpo"):
+                issue_number = metadata['bpo']
+                if int(issue_number):
+                    body = "bpo-" + issue_number + ": " + body
 
-            bpo = metadata['bpo']
-            if int(bpo):
-                body = "bpo-" + bpo + ": " + body
             body = "- " + body
             text = textwrap_body(body, subsequent_indent='  ')
             print(text)
     print()
     print("**(For information about older versions, consult the HISTORY 
file.)**")
-    news.close()
+
+
+    new_contents = buff.getvalue()
+
+    # Only write in `output` if the contents are different
+    # This speeds up subsequent Sphinx builds
+    try:
+        previous_contents = Path(output).read_text(encoding="UTF-8")
+    except (FileNotFoundError, UnicodeError):
+        previous_contents = None
+    if new_contents != previous_contents:
+        Path(output).write_text(new_contents, encoding="UTF-8")
+    else:
+        builtins.print(output, "is already up to date")
 
 
 git_add_files = []
@@ -1172,11 +1180,11 @@
 
     for section in sections:
         dir_name = sanitize_section(section)
-        dir_path = f("NEWS.d/next/{dir_name}")
+        dir_path = f"NEWS.d/next/{dir_name}"
         safe_mkdir(dir_path)
-        readme_path = f("NEWS.d/next/{dir_name}/README.rst")
+        readme_path = f"NEWS.d/next/{dir_name}/README.rst"
         with open(readme_path, "wt", encoding="utf-8") as readme:
-            readme.write(f("Put news entry ``blurb`` files for the *{section}* 
section in this directory.\n"))
+            readme.write(f"Put news entry ``blurb`` files for the *{section}* 
section in this directory.\n")
         git_add_files.append(dir_path)
         git_add_files.append(readme_path)
     flush_git_add_files()
@@ -1197,7 +1205,7 @@
 #    """
 #    Test function for blurb command-line processing.
 #    """
-#    print(f("arg: boolean {boolean} option {option}"))
+#    print(f"arg: boolean {boolean} option {option}")
 
 
 @subcommand
@@ -1230,7 +1238,7 @@
     blurbs = Blurbs()
 
     accumulator = []
-    bpo = "0"
+    issue_number = "0"
     serial_number = 9999
     version = None
     release_date = None
@@ -1245,7 +1253,7 @@
     def flush_blurb():
         nonlocal accumulator
         nonlocal serial_number
-        nonlocal bpo
+        nonlocal issue_number
         nonlocal release_date
         nonlocal see_also
         nonlocal no_changes
@@ -1276,13 +1284,13 @@
                             field = field[1:]
                         try:
                             int(field)
-                            field = "bpo-" + field
+                            field = "gh-issue" + field
                         except ValueError:
                             pass
                         fields.append(field)
                     see_also = ", ".join(fields)
                     # print("see_also: ", repr(see_also))
-                    accumulator.append(f("(See also: {see_also})"))
+                    accumulator.append(f"(See also: {see_also})")
                     see_also = None
                 if not accumulator:
                     return
@@ -1291,7 +1299,7 @@
 
                 body = "\n".join(accumulator) + "\n"
                 metadata = {}
-                metadata["bpo"] = bpo
+                metadata["gh-issue"] = issue_number
                 metadata["date"] = str(serial_number)
                 if section:
                     metadata["section"] = section
@@ -1315,7 +1323,7 @@
                 blurbs.append((metadata, body))
                 blurb_count += 1
 
-            bpo = "0"
+            issue_number = "0"
             serial_number -= 1
             accumulator.clear()
 
@@ -1328,8 +1336,8 @@
         if version is None:
             assert not blurbs, "version should only be None initially, we 
shouldn't have blurbs yet"
             return
-        assert blurbs, f("No blurbs defined when flushing version {version}!")
-        output = f("NEWS.d/{version}.rst")
+        assert blurbs, f"No blurbs defined when flushing version {version}!"
+        output = f"NEWS.d/{version}.rst"
 
         if released:
             # saving merged blurb file for version, e.g. 
Misc/NEWS.d/3.7.0a1.rst
@@ -1338,14 +1346,14 @@
         else:
             # saving a million old-school blurb next files
             # with serial numbers instead of dates
-            # e.g. Misc/NEWS.d/next/IDLE/094.bpo-25514.882pXa.rst
+            # e.g. Misc/NEWS.d/next/IDLE/094.gh-issue-25514.882pXa.rst
             filenames = blurbs.save_split_next()
             git_add_files.extend(filenames)
             released = True
         blurbs.clear()
         version_count += 1
 
-    with open("NEWS", "rt", encoding="utf-8") as file:
+    with open("NEWS", encoding="utf-8") as file:
         for line_number, line in enumerate(file):
             line = line.rstrip()
 
@@ -1369,7 +1377,7 @@
                     line = new
             # 2. unusual indenting
             _line = line.lstrip()
-            if _line.startswith(("- Issue #", "- bpo-")):
+            if _line.startswith(("- Issue #", "- gh-issue-")):
                 line = _line
             if _line == ".characters() and ignorableWhitespace() methods.  
Original patch by Sebastian":
                 line = " " + line
@@ -1447,11 +1455,11 @@
             elif line.startswith("- Issue #9516: Issue #9516: avoid errors in 
sysconfig when MACOSX_DEPLOYMENT_TARGET"):
                 line = "- Issue #9516 and Issue #9516: avoid errors in 
sysconfig when MACOSX_DEPLOYMENT_TARGET"
             elif line.title().startswith(("- Request #", "- Bug #", "- Patch 
#", "- Patches #")):
-                # print(f("FIXING LINE {line_number}: {line!r}"))
+                # print(f"FIXING LINE {line_number}: {line!r}")
                 line = "- Issue #" + line.partition('#')[2]
-                # print(f("FIXED LINE {line_number}: {line!r}"))
+                # print(f"FIXED LINE {line_number}: {line!r}")
             # else:
-            #     print(f("NOT FIXING LINE {line_number}: {line!r}"))
+            #     print(f"NOT FIXING LINE {line_number}: {line!r}")
 
 
             # 4. determine the actual content of the line
@@ -1511,54 +1519,54 @@
                     line = line.lstrip()
                     if line.startswith("#"):
                         line = line[1:].lstrip()
-                    parse_bpo = True
-                elif line.startswith("bpo-"):
-                    line = line[4:]
-                    parse_bpo = True
+                    parse_issue = True
+                elif line.startswith("gh-issue"):
+                    line = line[8:]
+                    parse_issue = True
                 else:
-                    # print(f("[[{line_number:8} no bpo]] {line}"))
-                    parse_bpo = False
-                if parse_bpo:
+                    # print(f"[[{line_number:8} no gh]] {line}")
+                    parse_issue = False
+                if parse_issue:
                     # GAAAH
                     if line == "17500, and 
https://github.com/python/pythondotorg/issues/945: Remove":
                         line = "Remove"
-                        bpo = "17500"
+                        issue = "17500"
                         see_also = 
"https://github.com/python/pythondotorg/issues/945";
                     else:
-                        bpo, colon, line = line.partition(":")
+                        issue, colon, line = line.partition(":")
                         line = line.lstrip()
-                        bpo, comma, see_also = bpo.partition(",")
+                        issue, comma, see_also = issue.partition(",")
                         if comma:
                             see_also = see_also.strip()
-                            # if it's just an integer, add bpo- to the front
+                            # if it's just an integer, add gh-issue to the 
front
                             try:
                                 int(see_also)
-                                see_also = "bpo-" + see_also
+                                see_also = "gh-issue-" + see_also
                             except ValueError:
                                 pass
                         else:
                             # - Issue #21529 (CVE-2014-4616)
-                            bpo, space_paren, see_also = bpo.partition(" (")
+                            issue, space_paren, see_also = issue.partition(" 
(")
                             if space_paren:
                                 see_also = see_also.rstrip(")")
                             else:
                                 # - Issue #19544 and Issue #1180:
-                                bpo, space_and, see_also = bpo.partition(" and 
")
+                                issue, space_and, see_also = issue.partition(" 
and ")
                                 if not space_and:
-                                    bpo, space_and, see_also = bpo.partition(" 
& ")
+                                    issue, space_and, see_also = 
issue.partition(" & ")
                                 if space_and:
-                                    see_also = see_also.replace("Issue #", 
"bpo-").strip()
+                                    see_also = see_also.replace("Issue #", 
"gh-issue-").strip()
                                 else:
                                     # - Issue #5258/#10642: if site.py
-                                    bpo, slash, see_also = bpo.partition("/")
+                                    issue, slash, see_also = 
issue.partition("/")
                                     if space_and:
-                                        see_also = see_also.replace("#", 
"bpo-").strip()
+                                        see_also = see_also.replace("#", 
"gh-").strip()
                     try:
-                        int(bpo) # this will throw if it's not a legal int
+                        int(issue) # this will throw if it's not a legal int
                     except ValueError:
-                        sys.exit(f("Couldn't convert bpo number to int on line 
{line_number}! {bpo!r}"))
+                        sys.exit(f"Couldn't convert issue number to int on 
line {line_number}! {issue!r}")
                     if see_also == "partially":
-                        sys.exit(f("What the hell on line {line_number}! 
{bpo!r}"))
+                        sys.exit(f"What the hell on line {line_number}! 
{issue!r}")
 
             # 4.6.1 continuation of blurb
             elif line.startswith("  "):
@@ -1567,7 +1575,7 @@
             elif line.startswith(" * "):
                 line = line[3:]
             elif line:
-                sys.exit(f("Didn't recognize line {line_number}! {line!r}"))
+                sys.exit(f"Didn't recognize line {line_number}! {line!r}")
             # only add blank lines if we have an initial line in the 
accumulator
             if line or accumulator:
                 accumulator.append(line)
@@ -1579,7 +1587,7 @@
     git_rm_files.append("NEWS")
     flush_git_rm_files()
 
-    print(f("Wrote {blurb_count} news items across {version_count} versions."))
+    print(f"Wrote {blurb_count} news items across {version_count} versions.")
     print()
     print("Ready for commit.")
 
@@ -1628,10 +1636,10 @@
         def handle_option(s, dict):
             name = dict.get(s, None)
             if not name:
-                sys.exit(f('blurb: Unknown option for {subcommand}: "{s}"'))
+                sys.exit(f'blurb: Unknown option for {subcommand}: "{s}"')
             kwargs[name] = not kwargs[name]
 
-        # print(f("short_options {short_options} long_options {long_options}"))
+        # print(f"short_options {short_options} long_options {long_options}")
         for a in args:
             if done_with_options:
                 filtered_args.append(a)
@@ -1665,7 +1673,7 @@
             # whoops, must be a real type error, reraise
             raise e
 
-        how_many = f("{specified} argument")
+        how_many = f"{specified} argument"
         if specified != 1:
             how_many += "s"
 
@@ -1676,12 +1684,12 @@
                 middle = "requires"
             else:
                 plural = "" if required == 1 else "s"
-                middle = f("requires at least {required} argument{plural} and 
at most")
-            middle += f(" {total} argument")
+                middle = f"requires at least {required} argument{plural} and 
at most"
+            middle += f" {total} argument"
             if total != 1:
                 middle += "s"
 
-        print(f('Error: Wrong number of arguments!\n\nblurb {subcommand} 
{middle},\nand you specified {how_many}.'))
+        print(f'Error: Wrong number of arguments!\n\nblurb {subcommand} 
{middle},\nand you specified {how_many}.')
         print()
         print("usage: ", end="")
         help(subcommand)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/blurb-1.0.8/flit.ini new/blurb-1.1.0/flit.ini
--- old/blurb-1.0.8/flit.ini    2017-09-04 20:01:38.791154600 +0200
+++ new/blurb-1.1.0/flit.ini    1970-01-01 01:00:00.000000000 +0100
@@ -1,15 +0,0 @@
-[metadata]
-module = blurb
-author = Larry Hastings
-author-email = la...@hastings.org
-maintainer = Python Core Developers
-maintainer-email = core-workf...@mail.python.org
-home-page = https://github.com/python/core-workflow/tree/master/blurb
-requires-python = >=3.5
-description-file = README.rst
-classifiers = Intended Audience :: Developers
-    License :: OSI Approved :: BSD License
-    Programming Language :: Python :: 3 :: Only
-
-[scripts]
-blurb = blurb:main
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/blurb-1.0.8/pyproject.toml 
new/blurb-1.1.0/pyproject.toml
--- old/blurb-1.0.8/pyproject.toml      1970-01-01 01:00:00.000000000 +0100
+++ new/blurb-1.1.0/pyproject.toml      1990-08-09 16:25:15.000000000 +0200
@@ -0,0 +1,21 @@
+[build-system]
+requires = ["flit_core >=2,<4"]
+build-backend = "flit_core.buildapi"
+
+[tool.flit.metadata]
+module = "blurb"
+author = "Larry Hastings"
+author-email = "la...@hastings.org"
+maintainer = "Python Core Developers"
+maintainer-email = "core-workf...@mail.python.org"
+home-page = "https://github.com/python/core-workflow/tree/master/blurb";
+requires-python = ">=3.7"
+description-file = "README.rst"
+classifiers = [
+    "Intended Audience :: Developers",
+    "License :: OSI Approved :: BSD License",
+    "Programming Language :: Python :: 3 :: Only"
+]
+
+[tool.flit.scripts]
+blurb = "blurb:main"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/blurb-1.0.8/setup.py new/blurb-1.1.0/setup.py
--- old/blurb-1.0.8/setup.py    1970-01-01 01:00:00.000000000 +0100
+++ new/blurb-1.1.0/setup.py    1970-01-01 01:00:00.000000000 +0100
@@ -1,18 +0,0 @@
-#!/usr/bin/env python
-# setup.py generated by flit for tools that don't yet use PEP 517
-
-from distutils.core import setup
-
-entry_points = \
-{'console_scripts': ['blurb = blurb:main']}
-
-setup(name='blurb',
-      version='1.0.8',
-      description='Command-line tool to manage CPython Misc/NEWS.d entries.',
-      author='Larry Hastings',
-      author_email='la...@hastings.org',
-      url='https://github.com/python/core-workflow/tree/master/blurb',
-      py_modules=['blurb'],
-      entry_points=entry_points,
-      python_requires='>=3.5',
-     )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/blurb-1.0.8/tests/fail/gh-.rst 
new/blurb-1.1.0/tests/fail/gh-.rst
--- old/blurb-1.0.8/tests/fail/gh-.rst  1970-01-01 01:00:00.000000000 +0100
+++ new/blurb-1.1.0/tests/fail/gh-.rst  1990-08-09 16:25:15.000000000 +0200
@@ -0,0 +1 @@
+gh-12345: Fixed some problem or other.
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/blurb-1.0.8/tests/pass/basic.rst 
new/blurb-1.1.0/tests/pass/basic.rst
--- old/blurb-1.0.8/tests/pass/basic.rst        2019-02-27 22:26:05.528112600 
+0100
+++ new/blurb-1.1.0/tests/pass/basic.rst        1990-08-09 16:25:15.000000000 
+0200
@@ -1,5 +1,5 @@
-.. bpo: 0
 .. date: 2017-05-02
+.. gh-issue: 0
 .. nonce: xyz
 .. section: Library
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/blurb-1.0.8/tests/pass/basic.rst.res 
new/blurb-1.1.0/tests/pass/basic.rst.res
--- old/blurb-1.0.8/tests/pass/basic.rst.res    1970-01-01 01:00:00.000000000 
+0100
+++ new/blurb-1.1.0/tests/pass/basic.rst.res    1990-08-09 16:25:15.000000000 
+0200
@@ -0,0 +1,6 @@
+.. date: 2017-05-02
+.. gh-issue: 0
+.. nonce: xyz
+.. section: Library
+
+Hello world!
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/blurb-1.0.8/tests/pass/bpo-in-metadata.rst 
new/blurb-1.1.0/tests/pass/bpo-in-metadata.rst
--- old/blurb-1.0.8/tests/pass/bpo-in-metadata.rst      1970-01-01 
01:00:00.000000000 +0100
+++ new/blurb-1.1.0/tests/pass/bpo-in-metadata.rst      1990-08-09 
16:25:15.000000000 +0200
@@ -0,0 +1,6 @@
+.. bpo: 0
+.. date: 2017-05-02
+.. nonce: xyz
+.. section: Library
+
+Hello world!
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/blurb-1.0.8/tests/pass/bpo-in-metadata.rst.res 
new/blurb-1.1.0/tests/pass/bpo-in-metadata.rst.res
--- old/blurb-1.0.8/tests/pass/bpo-in-metadata.rst.res  1970-01-01 
01:00:00.000000000 +0100
+++ new/blurb-1.1.0/tests/pass/bpo-in-metadata.rst.res  1990-08-09 
16:25:15.000000000 +0200
@@ -0,0 +1,6 @@
+.. bpo: 0
+.. date: 2017-05-02
+.. nonce: xyz
+.. section: Library
+
+Hello world!
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/blurb-1.0.8/tests/pass/case-insensitive.rst 
new/blurb-1.1.0/tests/pass/case-insensitive.rst
--- old/blurb-1.0.8/tests/pass/case-insensitive.rst     1970-01-01 
01:00:00.000000000 +0100
+++ new/blurb-1.1.0/tests/pass/case-insensitive.rst     1990-08-09 
16:25:15.000000000 +0200
@@ -0,0 +1,6 @@
+.. date: 2017-05-02
+.. GH-Issue: 0
+.. nonce: xyz
+.. section: Library
+
+Hello world!
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/blurb-1.0.8/tests/pass/case-insensitive.rst.res 
new/blurb-1.1.0/tests/pass/case-insensitive.rst.res
--- old/blurb-1.0.8/tests/pass/case-insensitive.rst.res 1970-01-01 
01:00:00.000000000 +0100
+++ new/blurb-1.1.0/tests/pass/case-insensitive.rst.res 1990-08-09 
16:25:15.000000000 +0200
@@ -0,0 +1,6 @@
+.. date: 2017-05-02
+.. gh-issue: 0
+.. nonce: xyz
+.. section: Library
+
+Hello world!
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/blurb-1.0.8/tests/pass/no-break-long-words.rst 
new/blurb-1.1.0/tests/pass/no-break-long-words.rst
--- old/blurb-1.0.8/tests/pass/no-break-long-words.rst  2019-02-27 
22:26:05.528112600 +0100
+++ new/blurb-1.1.0/tests/pass/no-break-long-words.rst  1990-08-09 
16:25:15.000000000 +0200
@@ -1,5 +1,5 @@
-.. bpo: 0
 .. date: 1234
+.. gh-issue: 0
 .. nonce: xyz
 .. section: Library
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/blurb-1.0.8/tests/pass/no-break-long-words.rst.res 
new/blurb-1.1.0/tests/pass/no-break-long-words.rst.res
--- old/blurb-1.0.8/tests/pass/no-break-long-words.rst.res      2019-02-27 
22:26:05.528112600 +0100
+++ new/blurb-1.1.0/tests/pass/no-break-long-words.rst.res      1990-08-09 
16:25:15.000000000 +0200
@@ -1,5 +1,5 @@
-.. bpo: 0
 .. date: 1234
+.. gh-issue: 0
 .. nonce: xyz
 .. section: Library
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/blurb-1.0.8/tests/pass/no-break-on-hyphens.rst 
new/blurb-1.1.0/tests/pass/no-break-on-hyphens.rst
--- old/blurb-1.0.8/tests/pass/no-break-on-hyphens.rst  2019-02-27 
22:26:05.532112600 +0100
+++ new/blurb-1.1.0/tests/pass/no-break-on-hyphens.rst  1990-08-09 
16:25:15.000000000 +0200
@@ -1,5 +1,5 @@
-.. bpo: 21121
 .. date: 7333
+.. gh-issue: 21121
 .. nonce: ZLsRil
 .. section: Library
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/blurb-1.0.8/tests/pass/no-break-on-hyphens.rst.res 
new/blurb-1.1.0/tests/pass/no-break-on-hyphens.rst.res
--- old/blurb-1.0.8/tests/pass/no-break-on-hyphens.rst.res      2019-02-27 
22:26:05.532112600 +0100
+++ new/blurb-1.1.0/tests/pass/no-break-on-hyphens.rst.res      1990-08-09 
16:25:15.000000000 +0200
@@ -1,5 +1,5 @@
-.. bpo: 21121
 .. date: 7333
+.. gh-issue: 21121
 .. nonce: ZLsRil
 .. section: Library
 

Reply via email to