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