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.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ppa_copy_packages-2.0.0.tar.gz (11.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ppa_copy_packages-2.0.0-py3-none-any.whl (8.7 kB view details)

Uploaded Python 3

File details

Details for the file ppa_copy_packages-2.0.0.tar.gz.

File metadata

  • Download URL: ppa_copy_packages-2.0.0.tar.gz
  • Upload date:
  • Size: 11.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for ppa_copy_packages-2.0.0.tar.gz
Algorithm Hash digest
SHA256 7093285736f0685234b59e43d3c82f8ce5fc2a23b671782482353819f9d136ae
MD5 41c6e9b27f1da6dbe7220b650e6940a9
BLAKE2b-256 f99e1f04a05416f07498793ad12788f0b0f93aa9c71c71fa41ece329b1470e7f

See more details on using hashes here.

File details

Details for the file ppa_copy_packages-2.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for ppa_copy_packages-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 650a9e4dc8334554160ba03cb66ea67d71626210df9ad1eb56352cd30026ba78
MD5 22ef4b061398ddc6401f170f8d0702b6
BLAKE2b-256 72b08fd01c2fdf4027932781f6318a4fcdb6f2c76e88e1807d43c8bbe3c4f7d3

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

2.0.0 This release

2 files

1.9.4

2 files

1.9.3

2 files

1.9.2

2 files

1.9.1

2 files

1.9

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page