Bug#1077601: setuptools: please make the output reproducible
Chris Lamb
lamby at debian.org
Tue Jul 30 12:10:25 BST 2024
Source: setuptools
Version: 70.3.0-2
Severity: wishlist
Tags: patch
User: reproducible-builds at lists.alioth.debian.org
Usertags: randomess toolchain
X-Debbugs-Cc: reproducible-bugs at lists.alioth.debian.org
Hi,
Whilst working on the Reproducible Builds effort [0], we noticed that
setuptools can generate nondeterministic PKG-INFO files.
For example, here is python-pylatex:
├── ./usr/lib/python3/dist-packages/PyLaTeX-1.4.2.egg-info/PKG-INFO
│┄ Ordering differences only
│ @@ -42,27 +42,27 @@
│ Requires-Dist: coverage; extra == "testing"
│ Requires-Dist: pytest-cov; extra == "testing"
│ Requires-Dist: black; extra == "testing"
│ Requires-Dist: isort; extra == "testing"
│ Provides-Extra: packaging
│ Requires-Dist: twine; extra == "packaging"
│ Provides-Extra: all
│ +Requires-Dist: isort; extra == "all"
│ +Requires-Dist: quantities; extra == "all"
│ +Requires-Dist: alabaster<0.7.12; extra == "all"
│ +Requires-Dist: numpy; extra == "all"
│ Requires-Dist: pytest>=4.6; extra == "all"
│ +Requires-Dist: black; extra == "all"
│ +Requires-Dist: matplotlib; extra == "all"
│ +Requires-Dist: MarkupSafe==2.0.1; extra == "all"
│ +Requires-Dist: coverage; extra == "all"
│ Requires-Dist: twine; extra == "all"
│ +Requires-Dist: jinja2<3.0; extra == "all"
│ Requires-Dist: sphinx; extra == "all"
│ -Requires-Dist: numpy; extra == "all"
│ -Requires-Dist: quantities; extra == "all"
│ -Requires-Dist: coverage; extra == "all"
│ -Requires-Dist: black; extra == "all"
│ -Requires-Dist: alabaster<0.7.12; extra == "all"
│ -Requires-Dist: isort; extra == "all"
│ Requires-Dist: pytest-cov; extra == "all"
│ -Requires-Dist: jinja2<3.0; extra == "all"
│ -Requires-Dist: MarkupSafe==2.0.1; extra == "all"
│ -Requires-Dist: matplotlib; extra == "all"
The patch (also attached) is fairly simple:
--- a/setuptools/_core_metadata.py
+++ b/setuptools/_core_metadata.py
@@ -226,7 +226,7 @@ def _write_requirements(self, file):
if extra:
_write_provides_extra(file, processed_extras, extra, unsafe_extra)
- for req in _reqs.parse_strings(reqs):
+ for req in sorted(_reqs.parse_strings(reqs)):
r = _include_extra(req, extra, condition.strip())
file.write(f"Requires-Dist: {r}\n")
… although there may be more places where it is a problem.
[0] https://reproducible-builds.org/
Regards,
--
,''`.
: :' : Chris Lamb
`. `'` lamby at debian.org / chris-lamb.co.uk
`-
-------------- next part --------------
diff --git a/setuptools/_core_metadata.py b/setuptools/_core_metadata.py
index 45aae7d..f50e2a0 100644
--- a/setuptools/_core_metadata.py
+++ b/setuptools/_core_metadata.py
@@ -226,7 +226,7 @@ def _write_requirements(self, file):
if extra:
_write_provides_extra(file, processed_extras, extra, unsafe_extra)
- for req in _reqs.parse_strings(reqs):
+ for req in sorted(_reqs.parse_strings(reqs)):
r = _include_extra(req, extra, condition.strip())
file.write(f"Requires-Dist: {r}\n")
More information about the Reproducible-bugs
mailing list