ppa-copy-packages
Copy published PPA packages from one release pocket to another.
We build a few Debian packages containing various helpful scripts (i.e. the packages have Architecture: all and do not need to be recompiled when system library versions change). We want them to be available for all supported Ubuntu releases. So we upload a version built for the oldest supported LTS release to our PPA and use this script to copy the built packages to all other releases in the same PPA:
ppa-copy-packages -O pov -s xenial -t bionic disco -p pov-admin-tools ...
I do the same thing with gtimelog, which is a pure Python program and also doesn’t need to be recompiled:
ppa-copy-packages -O gtimelog -s xenial -t bionic disco -p gtimelog
And sometimes, when I’m feeling brave, I try this trick with C programs such as pwsafe:
ppa-copy-packages -O mg -s xenial -t bionic disco -p pwsafe
Authentication is taken care of by launchpadlib, which opens a browser window on first run and asks you to log in and authorize its access token (which is stored in the system keyring for your convenience).
Synopsis
$ ppa-copy-packages -h
usage: ppa-copy-packages [-h] [--version] [-v] [-q] [-n] [-w] [-b]
[--debug] -O OWNER [-N NAME] -p NAME [NAME ...]
-s SERIES -t SERIES [SERIES ...]
[--architectures ARCH [ARCH ...]]
[--pocket POCKET] [--launchpad-instance INSTANCE]
copy Ubuntu PPA packages from one release pocket to another
optional arguments:
-h, --help show this help message and exit
--version show program's version number and exit
-v, --verbose More verbose output (can be stacked)
-q, --quiet Less verbose output
-n, --dry-run Don't make any changes
-w, --wait Wait for pending packages to be published
-b, --browse Open the PPA page in a browser, don't do anything
else.
--debug Very verbose logging, for debugging this script
PPA selection:
-O OWNER, --owner OWNER
owner of the PPA
-N NAME, --name NAME name of the PPA (default: ppa)
-p NAME [NAME ...], --packages NAME [NAME ...]
names of packages to copy
-s SERIES, --source-series SERIES
source series (e.g. xenial)
-t SERIES [SERIES ...], --target-series SERIES [SERIES ...]
target series (e.g. bionic)
--architectures ARCH [ARCH ...]
architectures to check for published binaries (default
is ['i386', 'amd64'])
--pocket POCKET pocket name (you probably don't want to change this;
default is Release)
--launchpad-instance INSTANCE
Launchpad instance (default: production)
Changelog
2.0.0 (2026-04-30)
Do not ignore –wait when also using –dry-run; this makes it possible for me to wait until a PPA package is published even if I don’t want to actually copy it anywhere.
Explicitly depend on launchpadlib[keyring].
Drop Python 2 compatibility.
Drop Python < 3.10 compatibility.
1.9.4 (2022-10-21)
Copy packages one by one to avoid Launchpad timeouts.
Do not copy the same packages more than once when using –wait.
Fix TypeError: ‘<’ not supported between instances of ‘str’ and ‘NoneType’ when using –wait.
1.9.3 (2020-10-31)
Handle ‘needs building’ state when using –wait.
1.9.2 (2020-07-02)
Fix ValueError: Namespace GnomeKeyring not available (GH #3).
1.9.1 (2019-09-06)
Fix TypeError: unhashable type: ‘Entry’.
1.9 (2019-09-05)
First release to PyPI.
Unified three older scripts I had lying around with hardcoded configuration.
Replaced hardcoded configuration with command-line arguments.
Release files for ppa-copy-packages 2.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ppa_copy_packages-2.0.0.tar.gz | 11.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ppa_copy_packages-2.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 20.0 kB
Release files / ppa_copy_packages-2.0.0.tar.gz
| Download URL | ppa_copy_packages-2.0.0.tar.gz |
|---|---|
| Size | 11.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7093285736f0685234b59e43d3c82f8ce5fc2a23b671782482353819f9d136ae
|
|
BLAKE2b-256 checksum How to use checksums |
f99e1f04a05416f07498793ad12788f0b0f93aa9c71c71fa41ece329b1470e7f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.7
|
Release files / ppa_copy_packages-2.0.0-py3-none-any.whl
| Download URL | ppa_copy_packages-2.0.0-py3-none-any.whl |
|---|---|
| Size | 8.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
650a9e4dc8334554160ba03cb66ea67d71626210df9ad1eb56352cd30026ba78
|
|
BLAKE2b-256 checksum How to use checksums |
72b08fd01c2fdf4027932781f6318a4fcdb6f2c76e88e1807d43c8bbe3c4f7d3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.7
|