A retread (/ˈriːtrɛd/) is a used tire whose tread has been replaced -- retread checks the quality of rebuilt Python wheels.
retread inspects and compares Python wheels. Given a downstream rebuild, it resolves the corresponding upstream wheel and reports which files differ, are missing, or were added -- without downloading entire wheel files.
It uses zipwire for efficient remote wheel access via HTTP range requests and pypi-simple to interact with package indexes.
Note: retread does not rebuild wheels. It only inspects and compares existing wheels.
- Compare upstream and downstream wheels without downloading entire files
- Detect missing, extra, and modified files between wheel builds
- CRC-32 based fast comparison from ZIP central directory metadata
- Platform and ABI consistency checks (shared libraries, extension
modules,
Root-Is-Purelib, tag validation) - Show unified diffs of individual files between wheels
- Both synchronous and asynchronous APIs
- Pluggable HTTP backends: requests (default), httpx2, aiohttp
- Text and JSON output formats
pip install retreadWith optional async HTTP backends:
pip install retread[aiohttp] # aiohttp (async)
pip install retread[httpx2] # httpx2 (async, HTTP/2)
pip install retread[all] # all backendsCompare a downstream wheel against its upstream source on PyPI:
# Compare by URL
retread compare https://rebuild.example/foo-1.0-py3-none-any.whl
# Compare a local wheel file
retread compare /path/to/foo-1.0-py3-none-any.whl
# Resolve from a downstream index
retread compare foo-1.0-py3-none-any.whl --downstream-index https://rebuild.example/simple/
# JSON output
retread compare foo-1.0-py3-none-any.whl --downstream-index https://rebuild.example/simple/ -f jsonShow unified diffs of specific files between upstream and downstream wheels:
# Diff the METADATA file
retread diff https://rebuild.example/foo-1.0-py3-none-any.whl foo-1.0.dist-info/METADATA
# Diff multiple files
retread diff /path/to/foo-1.0-py3-none-any.whl foo-1.0.dist-info/METADATA foo-1.0.dist-info/WHEEL- CPython only -- PyPy and other Python implementations are not supported.
- Linux only -- Windows and macOS platform tags are not supported.
- Architecture-based matching -- Upstream wheel matching uses CPU
architecture suffixes (e.g.
x86_64,aarch64) to fuzzy-matchlinuxandmanylinuxplatform tags. Manylinux version specifiers are ignored; a downstreamlinux_x86_64wheel will match an upstreammanylinux_2_28_x86_64wheel. Musllinux wheels require an exact platform tag match.
Apache-2.0