repopulator
A portable Python library to generate binary software repositories
Purpose
Ever needed to build an APT package repository on Fedora? Or perhaps a DNF repository on Debian? How about a FreeBSD repository on Windows or Mac? This library allows you to do all these things and more. And yes, you can do it even on Windows if you are so inclined for some reason.
All binary package repositories have their own tools that usually range from being "non-portable" to "portable with lots of effort to limited platforms only". On the other hand, it is often convenient to build software packages in a Map/Reduce fashion where a single host collects multiple packages built for different platforms to produce binary repositories. Such a host will necessarily need to be able to build repositories for "foreign" packages. This library is an attempt to enable such a scenario. It provides both programmatic and command-line access.
Requirements
- Python >= 3.9
- If you plan to build repositories that require GPG signing, the
gpgcommand needs to be available in the PATH - If you plan to build repositories that require private key signing, OpenSSL > 3.0 libraries need to be available on your platform
Supported repository formats
- APT
- RPM
- Pacman
- Alpine apk
- FreeBSD pkg
Installing
pip install repopulator
Documentation
Documentation for the API and command-line syntax is available at https://gershnik.github.io/repopulator/
Examples
APT
Programmatic
from repopulator import AptRepo, PgpSigner
repo = AptRepo()
package1 = repo.add_package('/path/to/awesome_3.14_amd64.deb')
package2 = repo.add_package('/path/to/awesome_3.14_arm64.deb')
dist = repo.add_distribution('jammy')
repo.assign_package(package1, dist, component='main')
repo.assign_package(package2, dist, component='main')
signer = PgpSigner('name_of_key_to_use', 'password_of_that_key')
repo.export('/path/of/new/repo', signer)
Command-line
repopulator apt -o /path/of/new/repo -k name_of_key_to_use -w password_of_that_key \
-d jammy -c main \
-p /path/to/awesome_3.14_amd64.deb /path/to/awesome_3.14_arm64.deb
RPM
Programmatic
from repopulator import RpmRepo, PgpSigner
repo = RpmRepo()
repo.add_package('/path/to/awesome-3.14-1.el9.x86_64.rpm')
repo.add_package('/path/to/awesome-3.14-1.el9.aarch64.rpm')
signer = PgpSigner('name_of_key_to_use', 'password_of_that_key')
repo.export('/path/of/new/repo', signer)
Command-line
repopulator rpm -o /path/of/new/repo -k name_of_key_to_use -w password_of_that_key \
-p /path/to/awesome-3.14-1.el9.x86_64.rpm /path/to/awesome-3.14-1.el9.aarch64.rpm
Pacman
Programmatic
from repopulator import PacmanRepo, PgpSigner
repo = PacmanRepo('myrepo')
repo.add_package('/path/to/awesome-3.14-1-x86_64.pkg.tar.zst')
repo.add_package('/path/to/another-1.2-1-x86_64.pkg.tar.zst')
signer = PgpSigner('name_of_key_to_use', 'password_of_that_key')
repo.export('/path/of/new/repo', signer)
Command-line
repopulator pacman -o /path/of/new/repo -k name_of_key_to_use -w password_of_that_key \
-n myrepo -p /path/to/awesome-3.14-1-x86_64.pkg.tar.zst /path/to/another-1.2-1-x86_64.pkg.tar.zst
Alpine apk
Programmatic
from repopulator import AlpineRepo, PkiSigner
repo = AlpineRepo('my repo description')
repo.add_package('/path/to/awesome-3.14-r0.apk')
repo.add_package('/path/to/another-1.23-r0.apk')
signer = PkiSigner('/path/to/private/key', 'password_or_None')
# Unlike the `pkg` tool, we do not parse the signer name out of the private key filename
# so you can name your key files whatever you wish
repo.export('/path/of/new/repo', signer, signer_name = 'mymail@mydomain.com-1234abcd')
Command-line
repopulator alpine -o /path/of/new/repo -d 'my repo description' \
-k /path/to/private/key.rsa -w password_of_that_key \
-s 'mymail@mydomain.com-1234abcd' \
-p /path/to/awesome-3.14-r0.apk /path/to/another-1.23-r0.apk
FreeBSD pkg
Programmatic
from repopulator import FreeBSDRepo, PkiSigner
repo = FreeBSDRepo()
repo.add_package('/path/to/awesome-3.14.pkg')
repo.add_package('/path/to/another-1.2.pkg')
signer = PkiSigner('/path/to/private/key', 'password_or_None')
repo.export('/path/of/new/repo', signer)
Command-line
repopulator freebsd -o /path/of/new/repo \
-k /path/to/private/key -w password_of_that_key \
-p /path/to/awesome-3.14.pkg /path/to/another-1.2.pkg
Metadata
Release files for repopulator 1.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| repopulator-1.7.tar.gz | 35.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| repopulator-1.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 76.5 kB
Release files / repopulator-1.7.tar.gz
| Download URL | repopulator-1.7.tar.gz |
|---|---|
| Size | 35.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d5d9b379ae5ebf8a83caef4e0e7d427d7be811ffa5867e2cdc6839aa66cfb5f3
|
|
BLAKE2b-256 checksum How to use checksums |
333370f6709420e8281a2a6032c375301db90bb3a9f96a763cd3143aad70da13
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.0
|
Release files / repopulator-1.7-py3-none-any.whl
| Download URL | repopulator-1.7-py3-none-any.whl |
|---|---|
| Size | 41.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e52fef80eeeadff6075973121c44141d7c8da4d90fb5c2463872f437d836a29c
|
|
BLAKE2b-256 checksum How to use checksums |
8e9c9c92439d7e59f725e7f201734698afa0f3f793afc520593d633f3815bde1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.0
|