diff --git a/CHANGES.rst b/CHANGES.rst
index 22ff98dfd..b4da5e1b6 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -19,6 +19,16 @@ development at the same time, such as 4.5.x and 5.0.
.. scriv-start-here
+.. _changes_7-2-5:
+
+Version 7.2.5 — 2023-04-30
+--------------------------
+
+- Fix: ``html_report()`` could fail with an AttributeError on ``isatty`` if run
+ in an unusual environment where sys.stdout had been replaced. This is now
+ fixed.
+
+
.. _changes_7-2-4:
Version 7.2.4 — 2023-04-28
diff --git a/Makefile b/Makefile
index 847e50987..7f529e0c1 100644
--- a/Makefile
+++ b/Makefile
@@ -89,6 +89,7 @@ metasmoke:
PIP_COMPILE = pip-compile --upgrade --allow-unsafe --resolver=backtracking
upgrade: export CUSTOM_COMPILE_COMMAND=make upgrade
upgrade: ## Update the *.pip files with the latest packages satisfying *.in files.
+ git switch -c nedbat/upgrade-$$(date +%Y%m%d)
pip install -q -r requirements/pip-tools.pip
$(PIP_COMPILE) -o requirements/pip-tools.pip requirements/pip-tools.in
$(PIP_COMPILE) -o requirements/pip.pip requirements/pip.in
@@ -100,6 +101,7 @@ upgrade: ## Update the *.pip files with the latest packages satisfying *.in
$(PIP_COMPILE) -o doc/requirements.pip doc/requirements.in
$(PIP_COMPILE) -o requirements/lint.pip doc/requirements.in requirements/dev.in
$(PIP_COMPILE) -o requirements/mypy.pip requirements/mypy.in
+ git commit -am "chore: make upgrade"
diff_upgrade: ## Summarize the last `make upgrade`
@# The sort flags sort by the package name first, then by the -/+, and
diff --git a/coverage/misc.py b/coverage/misc.py
index 061682ee5..908b0dd24 100644
--- a/coverage/misc.py
+++ b/coverage/misc.py
@@ -394,7 +394,7 @@ def stdout_link(text: str, url: str) -> str:
If attached to a terminal, use escape sequences. Otherwise, just return
the text.
"""
- if sys.stdout.isatty():
+ if hasattr(sys.stdout, "isatty") and sys.stdout.isatty():
return f"\033]8;;{url}\a{text}\033]8;;\a"
else:
return text
diff --git a/coverage/version.py b/coverage/version.py
index d878ebc1b..516d00c15 100644
--- a/coverage/version.py
+++ b/coverage/version.py
@@ -8,7 +8,7 @@
# version_info: same semantics as sys.version_info.
# _dev: the .devN suffix if any.
-version_info = (7, 2, 4, "final", 0)
+version_info = (7, 2, 5, "final", 0)
_dev = 0
diff --git a/doc/conf.py b/doc/conf.py
index f0b2d6e42..fbd7e3f3a 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -66,11 +66,11 @@
# @@@ editable
copyright = "2009–2023, Ned Batchelder" # pylint: disable=redefined-builtin
# The short X.Y.Z version.
-version = "7.2.4"
+version = "7.2.5"
# The full version, including alpha/beta/rc tags.
-release = "7.2.4"
+release = "7.2.5"
# The date of release, in "monthname day, year" format.
-release_date = "April 28, 2023"
+release_date = "April 30, 2023"
# @@@ end
rst_epilog = """
diff --git a/doc/requirements.pip b/doc/requirements.pip
index 5bd841b0e..16213c7ff 100644
--- a/doc/requirements.pip
+++ b/doc/requirements.pip
@@ -56,7 +56,7 @@ pygments==2.15.1
# via sphinx
pytz==2023.3
# via babel
-requests==2.28.2
+requests==2.29.0
# via
# scriv
# sphinx
diff --git a/doc/sample_html/d_7b071bdc2a35fa80___init___py.html b/doc/sample_html/d_7b071bdc2a35fa80___init___py.html
index 6351b32dd..cf43ec9ee 100644
--- a/doc/sample_html/d_7b071bdc2a35fa80___init___py.html
+++ b/doc/sample_html/d_7b071bdc2a35fa80___init___py.html
@@ -66,8 +66,8 @@
^ index
» next
- coverage.py v7.2.4,
- created at 2023-04-28 05:33 -0400
+ coverage.py v7.2.5,
+ created at 2023-04-30 06:39 -0400