Skip to main content

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)

Source distribution for ppa-copy-packages 2.0.0
File Size Uploaded
ppa_copy_packages-2.0.0.tar.gz 11.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ppa-copy-packages 2.0.0
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

2.0.0 This release

2 release files

1.9.4

2 release files

1.9.3

2 release files

1.9.2

2 release files

1.9.1

2 release files

1.9

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page