Bug#1043330: tox: please make the build reproducible

Chris Lamb lamby at debian.org
Wed Aug 9 09:16:05 BST 2023


Source: tox
Version: 4.4.6-2
Severity: wishlist
Tags: patch
User: reproducible-builds at lists.alioth.debian.org
Usertags: timestamps, randomness
X-Debbugs-Cc: reproducible-bugs at lists.alioth.debian.org

Hi,

Whilst working on the Reproducible Builds effort [0], we noticed that
tox could not be built reproducibly.

This is because:

a) The documentation embeded the current build date via the copyright
year and a "last updated" timestamp. The attached patch changes this
to use SOURCE_DATE_EPOCH if available.

b) The default value for the --hashset argument (a random integer) was
encoded into the documentation. As this value was nondeterminstic, a
fresh value is inserted into the documentation on each build. This in
turn makes the package unreproducible. The attached patch changes this
to use the Pythonic "default=None … if default is None" pattern (NB.
this is distinct from the "notset" value, which, incidentally, is
typod in the --help text.)


 [0] https://reproducible-builds.org/


Regards,

-- 
      ,''`.
     : :'  :     Chris Lamb
     `. `'`      lamby at debian.org / chris-lamb.co.uk
       `-
-------------- next part --------------
--- a/debian/patches/reproducible-build.patch	1970-01-01 01:00:00.000000000 +0100
--- b/debian/patches/reproducible-build.patch	2023-08-09 09:12:22.249949353 +0100
@@ -0,0 +1,67 @@
+Description: Make the build reproducible
+Author: Chris Lamb <lamby at debian.org>
+Last-Update: 2023-08-09
+
+--- tox-4.4.6.orig/docs/conf.py
++++ tox-4.4.6/docs/conf.py
+@@ -1,9 +1,11 @@
+ from __future__ import annotations
+ 
++import os
+ import re
+ import subprocess
+ import sys
+-from datetime import date, datetime
++import time
++from datetime import datetime
+ from importlib.machinery import SourceFileLoader
+ from pathlib import Path
+ from subprocess import check_output
+@@ -20,9 +22,13 @@ from sphinx.ext.extlinks import External
+ 
+ from tox import __version__
+ 
++build_date = datetime.utcfromtimestamp(
++    int(os.environ.get('SOURCE_DATE_EPOCH', time.time()))
++)
++
+ company, name = "tox-dev", "tox"
+ release, version = __version__, ".".join(__version__.split(".")[:2])
+-copyright = f"2010-{date.today().year}, {company}"
++copyright = f"2010-{build_date.year}, {company}"
+ master_doc, source_suffix = "index", ".rst"
+ 
+ sphinx_argparse_cli_prefix_document = True
+@@ -31,7 +37,7 @@ man_pages = [
+ ]
+ 
+ html_theme = "furo"
+-html_title, html_last_updated_fmt = "tox", datetime.now().isoformat()
++html_title, html_last_updated_fmt = "tox", build_date.isoformat()
+ pygments_style, pygments_dark_style = "sphinx", "monokai"
+ html_static_path, html_css_files = ["_static"], ["custom.css"]
+ html_logo, html_favicon = "_static/img/tox.svg", "_static/img/toxfavi.ico"
+--- tox-4.4.6.orig/src/tox/session/cmd/run/common.py
++++ tox-4.4.6/src/tox/session/cmd/run/common.py
+@@ -122,6 +122,8 @@ def env_run_create_flags(parser: Argumen
+             ) -> None:
+                 if values == "notset":
+                     result = None
++                elif values is None:
++                    result = random.randint(1, 1024 if sys.platform == "win32" else 4294967295)
+                 else:
+                     try:
+                         result = int(cast(str, values))
+@@ -135,10 +137,10 @@ def env_run_create_flags(parser: Argumen
+             "--hashseed",
+             metavar="SEED",
+             help="set PYTHONHASHSEED to SEED before running commands. Defaults to a random integer in the range "
+-            "[1, 4294967295] ([1, 1024] on Windows). Passing 'noset' suppresses this behavior.",
++            "[1, 4294967295] ([1, 1024] on Windows). Passing 'notset' suppresses this behavior.",
+             action=SeedAction,
+             of_type=Optional[int],
+-            default=random.randint(1, 1024 if sys.platform == "win32" else 4294967295),
++            default=None,
+             dest="hash_seed",
+         )
+     parser.add_argument(
--- a/debian/patches/series	2023-08-09 09:02:18.061945063 +0100
--- b/debian/patches/series	2023-08-09 09:06:31.910569337 +0100
@@ -2,3 +2,4 @@
 docs-remove-shields-io-badges.patch
 sphinx-manpage-conf.patch
 intersphinx-mapping-local.patch
+reproducible-build.patch


More information about the Reproducible-bugs mailing list