meta_package_manager.managers packageΒΆ

SubmodulesΒΆ

meta_package_manager.managers.apk moduleΒΆ

class meta_package_manager.managers.apk.APK[source]ΒΆ

Bases: PackageManager

Alpine Package Keeper (apk) used by Alpine Linux.

Documentation: https://wiki.alpinelinux.org/wiki/Alpine_Package_Keeper

Note

installed and outdated both parse the list applet, so the version floor is 2.10.0: the release that introduced it. Progress output is disabled on every call to keep the parsed lines stable.

Caution

outdated reads the local repository cache rather than the remote, so sync must run first for an accurate upgrade list.

Initialize cli_errors list.

name: str = 'Alpine apk'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://gitlab.alpinelinux.org/alpine/apk-tools'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='debian', name='Debian'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

default_sudo: bool = TrueΒΆ

Built-in escalation default, used when sudo is None.

False on the base: most managers install into user-writable trees and never need root. The system package managers whose privileged operations require root (apt, dnf, pacman, zypper, …) set this to True so their build_cli(..., sudo=True) operations escalate out of the box, while staying switchable off through sudo (--no-sudo or config) for rootless setups.

requirement: str | None = '>=2.10.0'ΒΆ

The list applet, used by installed() and outdated(), was introduced in version 2.10.0.

pre_args: tuple[str, ...] = ('--no-progress',)ΒΆ

Suppress progress indicators so log lines are stable when parsing.

Source: apk(8) global options.

version_regexes: tuple[str, ...] = ('apk-tools\\s+(?P<version>[^\\s,]+)',)ΒΆ
$ apk --version
apk-tools 2.14.10, compiled for x86_64.
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ apk --no-progress list --installed
acl-2.2.53-r0 x86_64 {acl} (LGPL-2.1-or-later AND GPL-2.0-or-later) [installed]
alpine-baselayout-3.4.3-r1 x86_64 {alpine-baselayout} (GPL-2.0-only) [installed]
apk-tools-2.14.0-r5 x86_64 {apk-tools} (GPL-2.0-only) [installed]
busybox-1.36.1-r5 x86_64 {busybox} (GPL-2.0-only) [installed]
python3-3.11.6-r0 x86_64 {python3} (PSF-2.0) [installed]
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

Caution

Reads from the local repository cache. Run sync() first to refresh the index.

$ apk --no-progress list --upgradable
acl-2.3.1-r0 x86_64 {acl} (LGPL-2.1-or-later) [upgradable from: acl-2.2.53-r0]
python3-3.11.7-r0 x86_64 {python3} (PSF-2.0) [upgradable from: python3-3.11.6-r0]
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Caution

apk search matches package names with case-insensitive substring globbing. Exact matching is not supported and is handled by meta_package_manager.manager.PackageManager.refiltered_search(). Extended search adds the --description flag so the query is also matched against package descriptions.

$ apk --no-progress search --verbose firefox
firefox-120.0-r0
firefox-esr-115.5.0-r0
firefox-langpack-de-120.0-r0
$ apk --no-progress search --verbose --description ntp
chrony-4.4-r1
ntp-4.2.8_p17-r0
openntpd-6.8_p1-r1
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ sudo apk --no-progress add firefox
Return type:

str

cli_names: tuple[str, ...] = ('apk',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'apk'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all packages.

$ sudo apk --no-progress upgrade
Return type:

tuple[str, ...]

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade one package.

$ sudo apk --no-progress upgrade firefox
Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Remove one package.

$ sudo apk --no-progress del firefox
Return type:

str

sync()[source]ΒΆ

Synchronize the local package index from remote repositories.

$ sudo apk --no-progress update
Return type:

None

cleanup()[source]ΒΆ

Drop the local package cache.

$ sudo apk --no-progress cache clean
Return type:

None

meta_package_manager.managers.apm moduleΒΆ

class meta_package_manager.managers.apm.APM[source]ΒΆ

Bases: PackageManager

Atom’s package manager, from the sunset Atom editor.

apm installed packages and themes for GitHub’s Atom editor, exposing an npm-style CLI whose queries mpm parses from --json output.

Atom was sunset on December 15, 2022, so apm is flagged deprecated here. mpm keeps the wrapper while doing so stays cheap: the community fork atom-community/apm has been floated but never produced a usable drop-in, and per the project’s stability policy a deprecated manager may be dropped without notice once it becomes a burden to maintain.

Initialize cli_errors list.

deprecated: bool = TrueΒΆ

A manager marked as deprecated is hidden from package selection by default.

You can still use it by explicitly calling for it on the command line.

A deprecated manager is exempt from the project stability policy: it may be dropped, in part or in full, in any release and without notice, once keeping it working becomes too burdensome. Every deprecation must be documented through deprecation_url.

Deprecated managers are kept out of the functional and integration test matrices, so an unreliable or flaky deprecated manager never blocks a release. The cheap static invariants (ID format, attribute ordering, …) still apply for as long as the manager’s code lives in the source tree, to keep that code valid.

deprecation_url: str | None = 'https://github.blog/2022-06-08-sunsetting-atom/'ΒΆ

GitHub announced the end of the project for December 15, 2022. Source: https://github.blog/2022-06-08-sunsetting-atom/

There is a tentative community fork being discussed. See: https://github.com/atom-community/apm

In the mean time, as long as no apm alternative is useable, it is safe to tag this manager as deprecated.

name: str = 'Atom apm'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://atom.io/packages'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='debian', name='Debian'), Platform(id='dragonfly_bsd', name='DragonFly BSD'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='freebsd', name='FreeBSD'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='macos', name='macOS'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='midnightbsd', name='MidnightBSD'), Platform(id='netbsd', name='NetBSD'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='openbsd', name='OpenBSD'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='sunos', name='SunOS'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='windows', name='Windows'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

requirement: str | None = '>=1.0.0'ΒΆ

Version requirement specifier.

Supports a comma-separated range of constraints (e.g. ">=1.20.0,<2.0.0"). A bare version string like "1.20.0" is treated as >=1.20.0.

Parsed by meta_package_manager.version.VersionRange.

Defaults to None, which deactivates version check entirely.

version_regexes: tuple[str, ...] = ('apm\\s+(?P<version>\\S+)',)ΒΆ
$ apm --version
apm  2.6.2
npm  6.14.13
node 12.14.1 x64
atom 1.58.0
python 2.7.16
git 2.33.0
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ apm list --json
{
  "core": [
    {
      "name": "background-tips",
      "version": "0.26.1",
      "description": "Displays tips about Atom in the background."
    }
  ],
  "user": [
    {
      "name": "file-icons",
      "version": "2.0.9",
      "description": "Assign file extension icons"
    }
  ]
}
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ apm outdated --compatible --json
[
  {
    "name": "file-icons",
    "version": "2.0.9",
    "latestVersion": "2.0.10",
    "description": "Assign file extension icons"
  }
]
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Caution

Search does not supports exact matching.

$ apm search --json python | jq
[
  {
    "name": "atom-python-run",
    "main": "./lib/atom-python-run.js",
    "version": "0.7.3",
    "description": "Run a python source file.",
    "keywords": [
      "python"
    ],
    "repository": "https://github.com/foreshadow/atom-python-run",
    "license": "MIT",
    "engines": {
      "atom": ">=1.0.0 <2.0.0"
    },
    "dependencies": {},
    "readme": "Blah blah",
    "downloads": 41379,
    "stargazers_count": 16
  },
  {
    "name": "build-python",
    "version": "0.6.3",
    "description": "Atom Build provider for python/python3",
    "repository": "https://github.com/idleberg/atom-build-python",
    "license": "MIT",
    "keywords": [
      "buildprovider",
      "compile",
      "python",
      "python3",
      "linter",
      "lint"
    ],
    "main": "lib/provider.js",
    "engines": {
      "atom": ">=1.0.0 <2.0.0"
    },
    "providedServices": {
      "builder": {
        "description": "Compiles Python",
        "versions": {
          "2.0.0": "provideBuilder"
        }
      }
    },
    "package-deps": [
      "build"
    ],
    "dependencies": {
      "atom-package-deps": "^4.3.1"
    },
    "devDependencies": {
      "babel-eslint": "^7.1.1",
      "coffeelint-stylish": "^0.1.2",
      "eslint": "^3.13.1",
      "eslint-config-atom-build": "^4.0.0",
      "gulp": "github:gulpjs/gulp#4.0",
      "gulp-coffeelint": "^0.6.0",
      "gulp-debug": "^3.0.0",
      "gulp-jshint": "^2.0.4",
      "gulp-jsonlint": "^1.2.0",
      "gulp-lesshint": "^2.1.0",
      "jshint": "^2.9.4"
    },
    "scripts": {
      "test": "gulp lint"
    },
    "readme": "Blah blah",
    "downloads": 2838,
    "stargazers_count": 0
  },
  (...)
]
$ apm search --no-description --json python | jq
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ apm install image-view
The image-view package is bundled with Atom and should not be explicitly
installed. You can run `apm uninstall image-view` to uninstall it and then
the version bundled with Atom will be used.
Installing image-view to /Users/kde/.atom/packages βœ“
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all outdated packages.

$ apm update --no-confirm
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the provided package.

$ apm update --no-confirm image-view
Return type:

tuple[str, ...]

cli_names: tuple[str, ...] = ('apm',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'apm'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

remove(package_id)[source]ΒΆ

Remove one package.

$ apm uninstall image-view
Return type:

str

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

cleanup()[source]ΒΆ

Removes things we don’t need anymore.

$ apm clean
Return type:

None

meta_package_manager.managers.apt moduleΒΆ

class meta_package_manager.managers.apt.APT[source]ΒΆ

Bases: PackageManager

Base class for Debian’s apt front-end and its variants.

Documentation:

See other command equivalences at: https://wiki.archlinux.org/title/Pacman/Rosetta

mpm drives the high-level apt binary, not apt-get or apt-cache, over system-wide packages. Mutations escalate through sudo and force --yes to stay non-interactive. APT_Mint retargets Linux Mint’s same-named but differently-behaved apt.

Note

apt’s listing and search commands emit Listing..., Sorting... and Full Text Search... preambles plus progress indicators. --quiet drops the progress bars, and each parser anchors on the name/suite version arch row shape, so the preamble lines fall through.

Note

search matches names only by default. An exact query is wrapped as the ^query$ regex apt supports natively; an extended query switches to --full to pull descriptions into the output for mpm to post-filter.

Initialize cli_errors list.

name: str = 'Debian apt'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://wiki.debian.org/AptCLI'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='aix', name='IBM AIX'), Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='cygwin', name='Cygwin'), Platform(id='debian', name='Debian'), Platform(id='dragonfly_bsd', name='DragonFly BSD'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='freebsd', name='FreeBSD'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='haiku', name='Haiku'), Platform(id='hurd', name='GNU/Hurd'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='illumos', name='illumos'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='midnightbsd', name='MidnightBSD'), Platform(id='netbsd', name='NetBSD'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='openbsd', name='OpenBSD'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='os400', name='IBM i'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='solaris', name='Solaris'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='sunos', name='SunOS'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

default_sudo: bool = TrueΒΆ

Built-in escalation default, used when sudo is None.

False on the base: most managers install into user-writable trees and never need root. The system package managers whose privileged operations require root (apt, dnf, pacman, zypper, …) set this to True so their build_cli(..., sudo=True) operations escalate out of the box, while staying switchable off through sudo (--no-sudo or config) for rootless setups.

requirement: str | None = '>=1.0.0'ΒΆ

Version requirement specifier.

Supports a comma-separated range of constraints (e.g. ">=1.20.0,<2.0.0"). A bare version string like "1.20.0" is treated as >=1.20.0.

Parsed by meta_package_manager.version.VersionRange.

Defaults to None, which deactivates version check entirely.

pre_args: tuple[str, ...] = ('--quiet',)ΒΆ
version_regexes: tuple[str, ...] = ('apt\\s+(?P<version>\\S+)',)ΒΆ
$ apt --version
apt 2.0.6 (amd64)
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ apt --quiet list --installed
Listing...
adduser/xenial,now 3.113+nmu3ubuntu4 all [installed]
bc/xenial,now 1.06.95-9build1 amd64 [installed]
bsdmainutils/xenial,now 9.0.6ubuntu3 amd64 [installed,automatic]
ca-certificates/xenial,now 20160104ubuntu1 all [installed]
cron/xenial,now 3.0pl1-128ubuntu2 amd64 [installed]
debconf/xenial,now 1.5.58ubuntu1 all [installed]
debianutils/xenial,now 4.7 amd64 [installed]
diffutils/xenial,now 1:3.3-3 amd64 [installed]
e2fsprogs/xenial,now 1.42.13-1ubuntu1 amd64 [installed]
ethstatus/xenial,now 0.4.3ubuntu2 amd64 [installed]
file/xenial,now 1:5.25-2ubuntu1 amd64 [installed]
findutils/xenial,now 4.6.0+git+20160126-2 amd64 [installed]
libidn2-0/jammy,now 2.3.2-2build1 amd64 [installed,automatic]
libidn2-0/jammy,now 2.3.2-2build1 i386 [installed,automatic]
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ apt --quiet list --upgradable
Listing...
apt/xenial-updates 1.2.19 amd64 [upgradable from: 1.2.15ubuntu0.2]
nano/xenial-updates 2.5.3-2ubuntu2 amd64 [upgradable from: 2.5.3-2]
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

$ apt --quiet search abc --names-only
Sorting...
Full Text Search...
abcde/xenial 2.7.1-1 all
  A Better CD Encoder

abcmidi/xenial 20160103-1 amd64
  converter from ABC to MIDI format and back

berkeley-abc/xenial 1.01+20150706hgc3698e0+dfsg-2 amd64
  ABC - A System for Sequential Synthesis and Verification

fuse-overlayfs/jammy,now 1.7.1-1 amd64 [installed]
  implementation of overlay+shiftfs in FUSE for rootless containers

grabcd-rip/xenial 0009-1 all
  rip and encode audio CDs - ripper

libakonadi-kabc4/xenial 4:4.14.10-1ubuntu2 amd64
  Akonadi address book access library
$ apt --quiet search ^sed$ --names-only
Sorting...
Full Text Search...
sed/xenial 2.1.9-3 all
  Blah blah blah
$ apt --quiet search abc --full
Sorting...
Full Text Search...
abcde/xenial 2.7.1-1 all
  This package contains the essential basic system utilities.
  .
  Specifically, this package includes:
  basename cat chgrp chmod chown chroot cksum comm cp csplit cut
  dircolors dirname du echo env expand expr factor false fmt
  hostid id install join link ln logname ls md5sum mkdir mkfifo
  nohup od paste pathchk pinky pr printenv printf ptx pwd
  sha1sum seq shred sleep sort split stat stty sum sync tac tail
  tr true tsort tty uname unexpand uniq unlink users vdir wc who

(...)

midi/xenial 20160103-1 amd64
  converter from ABC to MIDI format and back
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ sudo apt --quiet --yes install git
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all outdated packages.

$ sudo apt --quiet --yes upgrade
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the provided package.

$ sudo apt --quiet --yes install --only-upgrade git
Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Remove one package.

$ sudo apt --quiet --yes remove git
Return type:

str

sync()[source]ΒΆ

Sync package metadata.

$ sudo apt --quiet --yes update
Hit:1 http://archive.ubuntu.com xenial InRelease
Get:2 http://archive.ubuntu.com xenial-updates InRelease [102 kB]
Get:3 http://archive.ubuntu.com xenial-security InRelease [102 kB]
Get:4 http://archive.ubuntu.com xenial/main Translation-en [568 kB]
Fetched 6,868 kB in 2s (2,680 kB/s)
Reading package lists...
Building dependency tree...
Reading state information...
Return type:

None

cleanup()[source]ΒΆ

Removes things we don’t need anymore.

$ sudo apt --quiet --yes autoremove
$ sudo apt --quiet --yes clean
Return type:

None

cli_names: tuple[str, ...] = ('apt',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'apt'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

class meta_package_manager.managers.apt.APT_Mint[source]ΒΆ

Bases: APT

Linux Mint’s apt, a wrapper script that shadows Debian’s apt.

Mint ships its own apt command reusing the name but not the behavior of APT, so only version probing and search parsing are overridden here; every other operation is inherited.

Note

Mint’s apt --version prints no apt <version> line, so the version is read from apt version apt: the version of the apt package itself.

Caution

Search rows are <status> <name> - <description> with no version column and no --full mode, so extended matching is unsupported and results carry no version.

Initialize cli_errors list.

name: str = 'Linux Mint apt'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://github.com/kdeldycke/meta-package-manager/issues/52'ΒΆ

Home page of the project, only used in documentation for reference.

cli_names: tuple[str, ...] = ('apt',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'apt-mint'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

version_cli_options: tuple[str, ...] = ('version', 'apt')ΒΆ
$ apt version apt
1.6.11
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Caution

Search does not supports extended matching.

$ /usr/local/bin/apt --quiet search sed
v   librust-slog-2.5+erased-serde-dev  -
p   python3-blessed                    - Practical wrapper
i   sed                                - GNU stream editor
p   sed:i386                           - GNU stream editor
$ /usr/local/bin/apt --quiet search ^sed$
i   sed              - GNU stream editor
p   sed:i386         - GNU stream editor
Return type:

Iterator[Package]

meta_package_manager.managers.asdf moduleΒΆ

class meta_package_manager.managers.asdf.ASDF[source]ΒΆ

Bases: PackageManager

asdf manages parallel versions of multiple developer tools (Node.js, Ruby, Python, Erlang, …) through a plugin ecosystem, exposing all of them behind a single CLI.

mpm targets the 0.16.0 Go rewrite and later: it calls the space-separated subcommands (asdf list all, asdf plugin add) that replaced the hyphenated forms (list-all, plugin-add) of the older Bash asdf, which is unsupported.

Note

asdf is plugin-driven: every tool the user can install is gated behind a plugin (asdf plugin add nodejs). mpm install does not auto-add plugins; the user is expected to register them first with asdf plugin add.

Note

Each (plugin, installed_version) pair is reported as a distinct package, so a tool installed at multiple versions yields multiple entries sharing the same ID.

Caution

mpm outdated only reports tools that have a currently-active version (marked with * in asdf list) different from their latest stable release. A tool installed without being activated through a .tool-versions file does not surface as outdated.

Initialize cli_errors list.

name: str = 'asdf'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://asdf-vm.com'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='debian', name='Debian'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='macos', name='macOS'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

requirement: str | None = '>=0.16.0'ΒΆ

The Go rewrite shipped in 0.16.0 on 2025-01-30 replaced the hyphenated subcommands (asdf list-all, asdf plugin-add, …) with their space-separated equivalents this wrapper depends on (asdf list all, asdf plugin add, …). Older Bash-based releases are not supported.

version_cli_options: tuple[str, ...] = ('version',)ΒΆ

CLI options used to produce the version of the package manager.

The raw output produced by the package manager CLI will be parsed with the version_regexes below to extract the version number.

version_regexes: tuple[str, ...] = ('v?(?P<version>\\d+\\.\\d+\\.\\d+)',)ΒΆ
$ asdf version
v0.19.0-83adfe6
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

Emits one meta_package_manager.package.Package per (plugin, installed_version) pair, so a tool installed at multiple versions yields multiple entries sharing the same ID.

$ asdf list
nodejs
  18.20.4
 *20.10.0
ruby
 *3.2.0
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

Cross-references the currently-active version per plugin (the entry marked with * in asdf list) with the latest stable version (asdf latest --all). Only plugins whose active version differs from the latest are yielded.

$ asdf latest --all
nodejs    20.10.0    missing
ruby      3.3.0      missing
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

asdf plugin list all enumerates the entire short-name plugin catalogue. The framework’s meta_package_manager.manager.PackageManager.refiltered_search() narrows the listing down to entries that contain the query.

$ asdf plugin list all
1password-cli   https://github.com/NeoHsu/asdf-1password-cli.git
act             https://github.com/grimoh/asdf-act.git
nodejs          https://github.com/asdf-vm/asdf-nodejs.git
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

asdf install <plugin> requires the plugin to have been added beforehand with asdf plugin add <plugin>. This wrapper does not auto-add plugins.

$ asdf install nodejs 20.10.0
Return type:

str

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade one package.

asdf has no native upgrade verb: installing the latest alias downloads the newest stable release alongside any older versions already on disk. The user is responsible for switching the active version with asdf set if desired.

$ asdf install nodejs latest
Return type:

tuple[str, ...]

cli_names: tuple[str, ...] = ('asdf',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'asdf'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

remove(package_id)[source]ΒΆ

Remove one package.

asdf plugin remove deletes the plugin and every version of the tool installed through it, which matches mpm’s β€œremove this package” contract more cleanly than iterating asdf uninstall per installed version.

$ asdf plugin remove nodejs
Return type:

str

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

sync()[source]ΒΆ

Refresh plugin metadata.

$ asdf plugin update --all
Return type:

None

meta_package_manager.managers.composer moduleΒΆ

class meta_package_manager.managers.composer.Composer[source]ΒΆ

Bases: PackageManager

Dependency manager for PHP, driven in global mode.

Every operation is prefixed with global so it targets the user-wide Composer project under COMPOSER_HOME ($XDG_CONFIG_HOME/composer on XDG systems, ~/.composer on macOS and other Unixes, %APPDATA%\Composer on Windows) rather than a working tree. installed and outdated parse Composer’s --format=json output, while search reads its plain-text listing; --no-ansi is forced on every call to strip color codes.

Initialize cli_errors list.

name: str = 'PHP Composer'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://getcomposer.org'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='aix', name='IBM AIX'), Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='cygwin', name='Cygwin'), Platform(id='debian', name='Debian'), Platform(id='dragonfly_bsd', name='DragonFly BSD'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='freebsd', name='FreeBSD'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='haiku', name='Haiku'), Platform(id='hurd', name='GNU/Hurd'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='illumos', name='illumos'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='macos', name='macOS'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='midnightbsd', name='MidnightBSD'), Platform(id='netbsd', name='NetBSD'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='openbsd', name='OpenBSD'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='os400', name='IBM i'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='solaris', name='Solaris'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='sunos', name='SunOS'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='windows', name='Windows'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

requirement: str | None = '>=1.4.0'ΒΆ

Version requirement specifier.

Supports a comma-separated range of constraints (e.g. ">=1.20.0,<2.0.0"). A bare version string like "1.20.0" is treated as >=1.20.0.

Parsed by meta_package_manager.version.VersionRange.

Defaults to None, which deactivates version check entirely.

pre_args: tuple[str, ...] = ('global', '--no-ansi')ΒΆ
version_regexes: tuple[str, ...] = ('Composer\\s+version\\s+(?P<version>\\S+)',)ΒΆ
$ composer --version
Composer version 2.1.8 2021-09-15 13:55:14
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ composer global show --format=json
{
  "installed": [
    {
      "name": "carbondate/carbon",
      "version": "1.33.0",
      "description": "A simple API extension for DateTime."
    },
    {
      "name": "guzzlehttp/guzzle",
      "version": "6.3.3",
      "description": "Guzzle is a PHP HTTP client library"
    },
    {
      "name": "guzzlehttp/promises",
      "version": "v1.3.1",
      "description": "Guzzle promises library"
    },
    {
      "name": "guzzlehttp/psr7",
      "version": "1.4.2",
      "description": "PSR-7 message implementation"
    }
  ]
}
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ composer global outdated --format=json
{
    "installed": [
        {
            "name": "illuminate/contracts",
            "version": "v5.7.2",
            "latest": "v5.7.3",
            "latest-status": "semver-safe-update",
            "description": "The Illuminate Contracts package."
        },
        {
            "name": "illuminate/support",
            "version": "v5.7.2",
            "latest": "v5.7.3",
            "latest-status": "semver-safe-update",
            "description": "The Illuminate Support package."
        }
    ]
}
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Caution

Search does not supports exact matching.

$ composer global search symfony
symfony/symfony The Symfony PHP framework
symfony/yaml Symfony Yaml Component
symfony/var-dumper Symfony (...) dumping PHP variables
symfony/translation Symfony Translation Component
symfony/routing Symfony Routing Component
symfony/process Symfony Process Component
symfony/polyfill-php70 Symfony (...) features to lower PHP versions
symfony/polyfill-mbstring Symfony (...) Mbstring extension
symfony/polyfill-ctype Symfony polyfill for ctype functions
symfony/http-kernel Symfony HttpKernel Component
symfony/http-foundation Symfony HttpFoundation Component
symfony/finder Symfony Finder Component
symfony/event-dispatcher Symfony EventDispatcher Component
symfony/debug Symfony Debug Component
symfony/css-selector Symfony CssSelector Component
$ composer global search --only-name python
hiqdev/hidev-python
aanro/pythondocx
laravel-admin-ext/python-editor
pythonphp/pythonphp
blyxxyz/python-server
nim-development/python-domotics
rakshitbharat/pythoninphp
tequilarapido/python-bridge
$ search global --only-name pythonphp/pythonphp
pythonphp/pythonphp
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ composer global --no-ansi require illuminate/contracts
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all outdated packages.

$ composer global --no-ansi update
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the provided package.

$ composer global --no-ansi update illuminate/contracts
Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Remove one package.

$ composer global --no-ansi remove illuminate/contracts
Return type:

str

cleanup()[source]ΒΆ

Removes things we don’t need anymore.

See: https://getcomposer.org/doc/03-cli.md#clear-cache-clearcache-cc

$ composer global --no-ansi clear-cache
Return type:

None

cli_names: tuple[str, ...] = ('composer',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'composer'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

meta_package_manager.managers.conda moduleΒΆ

class meta_package_manager.managers.conda.Conda[source]ΒΆ

Bases: PackageManager

Conda cross-language package and environment manager.

Reads go through conda’s --json mode: installed packages come from conda list --json and search from conda search "*query*" --json. conda has no dedicated outdated command, so the upgrade the solver would perform is simulated with conda update --all --dry-run --json and its UNLINK (current) and LINK (candidate) sets are diffed by name: a name in both is an in-place upgrade, while a LINK-only entry is a freshly pulled dependency and is not reported.

Note

Every operation targets conda’s currently active environment, which is base when none is activated. mpm neither activates nor switches environments: it inspects and mutates whatever environment conda resolves from the inherited CONDA_PREFIX / CONDA_DEFAULT_ENV, exactly as a bare conda call in the same shell would. Per-environment targeting is not supported yet.

Note

The >=4.6.0 floor is the release where update --dry-run --json settled on an actions mapping whose LINK / UNLINK values are package dicts, the shape the outdated diff parses. Much older conda wrapped actions in a list and emitted bare channel::name-version-build strings instead.

Initialize cli_errors list.

name: str = 'Conda'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://conda.org'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='debian', name='Debian'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='macos', name='macOS'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='windows', name='Windows'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

requirement: str | None = '>=4.6.0'ΒΆ

4.6.0 is a conservative floor. By this release conda update --dry-run --json reports actions as a single mapping whose LINK / UNLINK values are lists of package dicts: the exact shape outdated() parses. Much older conda wrapped actions in a list and emitted bare channel::name-version-build strings instead of dicts, which the parser below does not handle. The --json output of list and search predates this floor by years.

See 4.6.0 release.

version_regexes: tuple[str, ...] = ('conda\\s+(?P<version>\\S+)',)ΒΆ
$ conda --version
conda 24.5.0
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ conda list --json
[
  {
    "base_url": "https://repo.anaconda.com/pkgs/main",
    "build_number": 0,
    "build_string": "py312hca03da5_0",
    "channel": "pkgs/main",
    "dist_name": "pip-24.0-py312hca03da5_0",
    "name": "pip",
    "platform": "osx-arm64",
    "version": "24.0"
  },
  {
    "base_url": "https://repo.anaconda.com/pkgs/main",
    "build_number": 0,
    "build_string": "py312_0",
    "channel": "pkgs/main",
    "dist_name": "pytz-2024.1-py312_0",
    "name": "pytz",
    "platform": "osx-arm64",
    "version": "2024.1"
  }
]
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

There is no dedicated conda outdated command, so the upgrade the solver would perform is simulated with --dry-run and the UNLINK (current) / LINK (candidate) sets are diffed by name. A package appearing in both is an in-place upgrade; one appearing in only LINK is a freshly-pulled dependency and one in only UNLINK is a removal, so neither is reported.

$ conda update --all --dry-run --json
{
  "actions": {
    "FETCH": [],
    "LINK": [
      {
        "base_url": "https://repo.anaconda.com/pkgs/main",
        "build_number": 0,
        "build_string": "py312_0",
        "channel": "pkgs/main",
        "dist_name": "pytz-2024.2-py312_0",
        "name": "pytz",
        "platform": "osx-arm64",
        "version": "2024.2"
      }
    ],
    "UNLINK": [
      {
        "base_url": "https://repo.anaconda.com/pkgs/main",
        "build_number": 0,
        "build_string": "py312_0",
        "channel": "pkgs/main",
        "dist_name": "pytz-2024.1-py312_0",
        "name": "pytz",
        "platform": "osx-arm64",
        "version": "2024.1"
      }
    ],
    "PREFIX": "/opt/conda"
  },
  "dry_run": true,
  "prefix": "/opt/conda",
  "success": true
}

When the environment is already current, conda omits the actions key entirely:

$ conda update --all --dry-run --json
{
  "message": "All requested packages already installed.",
  "success": true
}
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Caution

Search does not support extended or exact matching. The query is wrapped in * wildcards to get the broadest substring match conda offers, and meta_package_manager.manager.PackageManager.refiltered_search() narrows the results down. conda exposes no package description in its search output, so extended matching has nothing to match against.

conda returns every available build of every matching package, grouped by name and sorted by ascending version, so the last record of each group carries the latest version.

$ conda search "*pytz*" --json
{
  "pytz": [
    {
      "arch": null,
      "build": "py27_0",
      "build_number": 0,
      "channel": "https://repo.anaconda.com/pkgs/main/osx-arm64",
      "name": "pytz",
      "version": "2013b"
    },
    {
      "arch": null,
      "build": "py312_0",
      "build_number": 0,
      "channel": "https://repo.anaconda.com/pkgs/main/osx-arm64",
      "name": "pytz",
      "version": "2024.1"
    }
  ]
}
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package, optionally pinned to a version.

conda accepts a MatchSpec so the version is appended with =.

$ conda install --yes pytz

## Package Plan ##

  environment location: /opt/conda

  added / updated specs:
    - pytz

Preparing transaction: done
Verifying transaction: done
Executing transaction: done
$ conda install --yes pytz=2024.1
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generate the CLI to upgrade all packages.

$ conda update --all --yes
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generate the CLI to upgrade a single package, optionally to a version.

$ conda update --yes pytz
$ conda update --yes pytz=2024.2
Return type:

tuple[str, ...]

cli_names: tuple[str, ...] = ('conda',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'conda'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

remove(package_id)[source]ΒΆ

Remove one package.

$ conda remove --yes pytz

## Package Plan ##

  environment location: /opt/conda

  removed specs:
    - pytz

Preparing transaction: done
Verifying transaction: done
Executing transaction: done
Return type:

str

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

cleanup()[source]ΒΆ

Removes tarballs, unused packages and index caches.

$ conda clean --all --yes
Will remove 42 (123.4 MB) tarball(s).
Will remove 1 index cache(s).
Will remove 7 (45.6 MB) package(s).
Return type:

None

meta_package_manager.managers.deb_get moduleΒΆ

class meta_package_manager.managers.deb_get.Deb_Get[source]ΒΆ

Bases: PackageManager

deb-get installs third-party software on Debian and Ubuntu via .deb packages sourced from GitHub releases, direct URLs, and PPAs.

Note

deb-get wraps apt under the hood for actual package installation and removal, so all operations that modify the system require sudo.

Caution

deb-get list --installed prints bare package names with no versions, so the installed inventory carries no version. search is likewise version-less and offers no exact or extended mode, so mpm refilters its results.

Note

There is no read-only outdated: detection runs deb-get update, which also refreshes the package index, so the probe escalates through sudo like a sync.

Initialize cli_errors list.

name: str = 'deb-get'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://github.com/wimpysworld/deb-get'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='debian', name='Debian'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

default_sudo: bool = TrueΒΆ

Built-in escalation default, used when sudo is None.

False on the base: most managers install into user-writable trees and never need root. The system package managers whose privileged operations require root (apt, dnf, pacman, zypper, …) set this to True so their build_cli(..., sudo=True) operations escalate out of the box, while staying switchable off through sudo (--no-sudo or config) for rootless setups.

version_cli_options: tuple[str, ...] = ('version',)ΒΆ
$ deb-get version
0.4.5
version_regexes: tuple[str, ...] = ('(?P<version>\\d+\\.\\d+\\.\\d+)',)ΒΆ

Regular expressions used to extract the version number.

This property must be a tuple of strings, each of which is a valid regular expression that must contain a group named <version>.

The first of these regexes producing a match and returning non-empty <version> group will be used as the version string of the package manager.

That version string will then be sanitized and normalized by meta_package_manager.manager.PackageManager.version().

By default match the first part that is space-separated.

Caution

These regexes are compiled with re.MULTILINE only. They are not compiled with re.VERBOSE, so literal whitespace in the pattern is significant and matches whitespace in the CLI output.

property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ deb-get list --installed
activitywatch
anydesk
bitwarden
deb-get
freeplane
google-chrome-stable
ipscan
protonvpn
zoom

Note

deb-get list --installed only outputs bare package names without version information.

property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ sudo deb-get update
Checking for updates to deb-get installed packages
  [+] ipscan (3.9.2) has an update pending. 3.9.3 is available.

Note

Outdated detection piggybacks on deb-get update which also refreshes the package index.

search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Caution

Search does not support extended or exact matching, and does not provide version information. Returns the best subset of results and lets meta_package_manager.manager.PackageManager.refiltered_search() refine them.

$ deb-get search zoom
zoom
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ sudo deb-get install ipscan
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all packages.

$ sudo deb-get upgrade
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade one package by reinstalling it.

$ sudo deb-get install ipscan
Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Remove one package.

$ sudo deb-get remove ipscan
Return type:

str

sync()[source]ΒΆ

Sync package metadata.

$ sudo deb-get update
Return type:

None

cleanup()[source]ΒΆ

Remove cached downloads.

$ sudo deb-get clean
Return type:

None

cli_names: tuple[str, ...] = ('deb-get',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'deb-get'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

meta_package_manager.managers.dnf moduleΒΆ

class meta_package_manager.managers.dnf.DNF[source]ΒΆ

Bases: PackageManager

Fedora’s RPM package manager.

mpm reads the inventory through repoquery rather than the human-facing listing: --userinstalled for packages installed on request (dependencies pulled in automatically are skipped) and --upgrades for pending updates, both with a --queryformat that joins the fields on a private ___MPM___ delimiter so summaries containing spaces stay splittable. Every call is forced --color=never and --quiet for parseable output.

Note

remove runs autoremove, so removing a package also drops the dependencies it leaves orphaned. search matches names only, with no exact or extended mode.

The DNF5 and YUM subclasses reuse everything here, differing only in the binary and forced arguments.

Documentation:

Initialize cli_errors list.

name: str = 'Fedora DNF'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://github.com/rpm-software-management/dnf'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='aix', name='IBM AIX'), Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='cygwin', name='Cygwin'), Platform(id='debian', name='Debian'), Platform(id='dragonfly_bsd', name='DragonFly BSD'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='freebsd', name='FreeBSD'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='haiku', name='Haiku'), Platform(id='hurd', name='GNU/Hurd'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='illumos', name='illumos'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='midnightbsd', name='MidnightBSD'), Platform(id='netbsd', name='NetBSD'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='openbsd', name='OpenBSD'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='os400', name='IBM i'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='solaris', name='Solaris'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='sunos', name='SunOS'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

default_sudo: bool = TrueΒΆ

Built-in escalation default, used when sudo is None.

False on the base: most managers install into user-writable trees and never need root. The system package managers whose privileged operations require root (apt, dnf, pacman, zypper, …) set this to True so their build_cli(..., sudo=True) operations escalate out of the box, while staying switchable off through sudo (--no-sudo or config) for rootless setups.

requirement: str | None = '>=4.0.0'ΒΆ

Version requirement specifier.

Supports a comma-separated range of constraints (e.g. ">=1.20.0,<2.0.0"). A bare version string like "1.20.0" is treated as >=1.20.0.

Parsed by meta_package_manager.version.VersionRange.

Defaults to None, which deactivates version check entirely.

cli_names: tuple[str, ...] = ('dnf', 'dnf4')ΒΆ
$ dnf --version
4.9.0
pre_args: tuple[str, ...] = ('--color=never', '--quiet')ΒΆ
DELIMITER = '___MPM___'ΒΆ
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ dnf repoquery --userinstalled --qf FORMAT
acl___MPM___2.2.53-1.el8___MPM___Access control list utilities___MPM___x86_64
audit___MPM___3.0.7-4.el9___MPM___User space auditing tools___MPM___x86_64
audit-libs___MPM___3.0.7-4.el9___MPM___Dynamic auditing library___MPM___x86_64
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ dnf repoquery --upgrades --qf FORMAT
acl___MPM___2.2.53-1.el8___MPM___2.6.53-1.el8___MPM___Access control list utilities___MPM___x86_64
audit___MPM___2.2.53-1.el8___MPM___2.5.53-1.el8___MPM___User space auditing tools___MPM___x86_64
audit-libs___MPM___2.2.53-1.el8___MPM___2.6.53-1.el8___MPM___Dynamic auditing library___MPM___x86_64
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Caution

Search does not support extended or exact matching. So we return the best subset of results and let meta_package_manager.manager.PackageManager.refiltered_search() refine them.

$ dnf --color=never search usd
Last metadata expiration check: 0:06:37 ago on Sun 03 Apr 2022.
=================== Name Exactly Matched: usd =====================
usd.aarch64 : 3D VFX pipeline interchange file format
=================== Name & Summary Matched: usd ===================
python3-usd.aarch64 : Development files for USD
usd-devel.aarch64 : Development files for USD
======================= Name Matched: usd =========================
lvm2-dbusd.noarch : LVM2 D-Bus daemon
usd-libs.aarch64 : Universal Scene Description library
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ sudo dnf --color=never --quiet --assumeyes install pip
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all outdated packages.

$ sudo dnf --color=never --quiet --assumeyes upgrade
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the provided package.

$ sudo dnf --color=never --quiet --assumeyes upgrade pip
Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Remove one package and one only.

$ sudo dnf --color=never --quiet --assumeyes autoremove package_id
Return type:

str

sync()[source]ΒΆ

Sync package metadata.

$ dnf --color=never --quiet check-update
Return type:

None

cleanup()[source]ΒΆ

Removes things we don’t need anymore.

$ sudo dnf --color=never --quiet --assumeyes autoremove
$ dnf --color=never --quiet clean all
Return type:

None

id: str = 'dnf'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

class meta_package_manager.managers.dnf.DNF5[source]ΒΆ

Bases: DNF

The dnf5 rewrite of DNF, Fedora’s reference package manager since Fedora 41.

Inherits every operation and parser from DNF. Its forced arguments drop --color=never (dnf5 rejects that option), keeping only --quiet.

Initialize cli_errors list.

name: str = 'Fedora DNF5'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://github.com/rpm-software-management/dnf5'ΒΆ

Home page of the project, only used in documentation for reference.

requirement: str | None = '>=5.0.0'ΒΆ

dnf5 is the new reference package manager as of Fedora 41.

cli_names: tuple[str, ...] = ('dnf5',)ΒΆ
$ dnf --version
4.9.0
pre_args: tuple[str, ...] = ('--quiet',)ΒΆ

Reset global options inherited from the DNF above.

dnf5 does not support –color=never parameter.

id: str = 'dnf5'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

class meta_package_manager.managers.dnf.YUM[source]ΒΆ

Bases: DNF

YUM, the package manager DNF superseded.

On current Fedora and RHEL the yum binary is a wrapper around dnf. mpm drives it exactly as DNF, only the binary name differs.

Initialize cli_errors list.

id: str = 'yum'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

name: str = 'Fedora YUM'ΒΆ

Return package manager’s common name.

Default value is based on class name.

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

homepage_url: str | None = 'http://yum.baseurl.org'ΒΆ

Home page of the project, only used in documentation for reference.

cli_names: tuple[str, ...] = ('yum',)ΒΆ
$ dnf --version
4.9.0

meta_package_manager.managers.emerge moduleΒΆ

class meta_package_manager.managers.emerge.Emerge[source]ΒΆ

Bases: PackageManager

Portage’s emerge, Gentoo’s source-based package manager.

Documentation:

See other command equivalences at: https://wiki.archlinux.org/title/Pacman/Rosetta

The outdated listing and the whole-system upgrade operate against the @world set. The progress spinner and ANSI coloring are disabled on every call, leaving output the regexes can parse.

Note

Two operations lean on companion Portage tools rather than emerge itself: installed reads the package list through qlist and cleanup trims distfiles through eclean. Neither is resolved through cli_path the way the reference emerge binary is; both are expected on the PATH.

Warning

cleanup forces a full @world upgrade before running --depclean: Portage refuses to remove packages until every dependency is resolved, so depcleaning a partially-upgraded system could drop still-needed packages.

Initialize cli_errors list.

name: str = 'Gentoo emerge'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://wiki.gentoo.org/wiki/Portage#emerge'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='aix', name='IBM AIX'), Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='cygwin', name='Cygwin'), Platform(id='debian', name='Debian'), Platform(id='dragonfly_bsd', name='DragonFly BSD'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='freebsd', name='FreeBSD'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='haiku', name='Haiku'), Platform(id='hurd', name='GNU/Hurd'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='illumos', name='illumos'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='midnightbsd', name='MidnightBSD'), Platform(id='netbsd', name='NetBSD'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='openbsd', name='OpenBSD'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='os400', name='IBM i'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='solaris', name='Solaris'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='sunos', name='SunOS'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

default_sudo: bool = TrueΒΆ

Built-in escalation default, used when sudo is None.

False on the base: most managers install into user-writable trees and never need root. The system package managers whose privileged operations require root (apt, dnf, pacman, zypper, …) set this to True so their build_cli(..., sudo=True) operations escalate out of the box, while staying switchable off through sudo (--no-sudo or config) for rootless setups.

requirement: str | None = '>=3.0.0'ΒΆ

Version requirement specifier.

Supports a comma-separated range of constraints (e.g. ">=1.20.0,<2.0.0"). A bare version string like "1.20.0" is treated as >=1.20.0.

Parsed by meta_package_manager.version.VersionRange.

Defaults to None, which deactivates version check entirely.

pre_args: tuple[str, ...] = ('--quiet', '--color', 'n', '--nospinner')ΒΆ
version_regexes: tuple[str, ...] = ('Portage\\s+(?P<version>\\S+)',)ΒΆ
$ emerge --version
Portage 3.0.30 (python 3.9.9-final-0, gcc-11.2.1, 5.15.32-gentoo-r1 x86_64)
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

Warning

This suppose the qlist binary is available and present on the system. We do not search for it or try to resolves its canonical path with cli_path, as we do for the reference emerge binary.

$ qlist --installed --verbose --nocolor
acct-group/audio-0-r1
acct-group/cron-0
app-admin/hddtemp-0.3_beta15-r29
app-admin/perl-cleaner-2.30
app-admin/system-config-printer-1.5.16-r1
app-arch/p7zip-16.02-r8
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ emerge --update --deep --pretend --columns --color n --nospinner @world
[blocks  B     ] app-text/dos2unix
[ebuild   N    ] app-games/qstat   [25c]
[ebuild    R   ] sys-apps/sed      [2.4.7-r6]
[ebuild       U] net-fs/samba      [2.2.8_pre1]      [2.2.7a]
[ebuild       U] sys-devel/distcc  [2.16]            [2.13-r1] USE=ip6* -gtk
[ebuild r     U] dev-libs/icu      [50.1.1:0/50.1.1] [50.1-r2:0/50.1]
[ebuild r  R   ] dev-libs/libxml2  [2.9.0-r1:2]       USE=icu
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

$ emerge --search --color n --nospinner blah

[ Results for search key : blah ]
Searching...

*  sys-process/htop
    Latest version available: 1.0.2-r1
    Latest version installed: [ Not Installed ]
    Size of files: 380 KiB
    Homepage:      http://htop.sourceforge.net
    Description:   interactive process viewer
    License:       BSD GPL-2

*  x11-drivers/nvidia-drivers
    Latest version available: 455.45.01-r1
    Latest version installed: [ Not Installed ]
    Size of files: 180.214 KiB
    Homepage:      https://www.nvidia.com/Download/Find.aspx
    Description:   NVIDIA Accelerated Graphics Driver
    License:       GPL-2 NVIDIA-r2

[ Applications found : 2 ]
$ emerge --search --color n --nospinner %^sed$
$ emerge --searchdesc --color n --nospinner sed
$ emerge --searchdesc --color n --nospinner %^sed$
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ sudo emerge --quiet --color n --nospinner dev-vcs/git
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all outdated packages.

$ sudo emerge --quiet --color n --nospinner --update --newuse --deep @world
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the provided package.

$ sudo emerge --quiet --color n --nospinner --update dev-vcs/git
Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Remove one package.

$ sudo emerge --quiet --color n --nospinner --unmerge dev-vcs/git
Return type:

str

sync()[source]ΒΆ

Sync package metadata.

$ sudo emerge --quiet --color n --nospinner --sync
Return type:

None

cleanup()[source]ΒΆ

Removes things we don’t need anymore.

An update is forced before calling the clean commands, as pointed to by the emerge documentation:

> As a safety measure, depclean will not remove any packages unless all > required dependencies have been resolved. As a consequence, it is often > necessary to run emerge –update –newuse –deep @world prior to depclean.

Warning

This suppose the eclean binary is available and present on the system. We do not search for it or try to resolves its canonical path with cli_path, as we do for the reference emerge binary.

$ sudo emerge --quiet --color n --nospinner --update --newuse --deep @world
$ sudo emerge --quiet --color n --nospinner --depclean
$ sudo eclean distfiles
Return type:

None

cli_names: tuple[str, ...] = ('emerge',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'emerge'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

meta_package_manager.managers.eopkg moduleΒΆ

class meta_package_manager.managers.eopkg.EOPKG[source]ΒΆ

Bases: PackageManager

Solus’ eopkg package manager, a PiSi fork.

installed and outdated parse eopkg’s fixed-width, |-delimited status table; the column regex requires that pipe structure, so the header and === separator rows fall through. --no-color is forced to keep the output free of ANSI escapes.

Mutating operations pass --yes-all to auto-confirm eopkg’s prompts so they run unattended.

Initialize cli_errors list.

name: str = 'Solus eopkg'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://github.com/getsolus/eopkg/'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='debian', name='Debian'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

default_sudo: bool = TrueΒΆ

Built-in escalation default, used when sudo is None.

False on the base: most managers install into user-writable trees and never need root. The system package managers whose privileged operations require root (apt, dnf, pacman, zypper, …) set this to True so their build_cli(..., sudo=True) operations escalate out of the box, while staying switchable off through sudo (--no-sudo or config) for rootless setups.

requirement: str | None = '>=3.2.0'ΒΆ

Version requirement specifier.

Supports a comma-separated range of constraints (e.g. ">=1.20.0,<2.0.0"). A bare version string like "1.20.0" is treated as >=1.20.0.

Parsed by meta_package_manager.version.VersionRange.

Defaults to None, which deactivates version check entirely.

pre_args: tuple[str, ...] = ('--no-color',)ΒΆ
version_regexes: tuple[str, ...] = ('eopkg\\s+(?P<version>\\S+)',)ΒΆ
$ eopkg --version
eopkg 3.2.0
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ eopkg --no-color list-installed --install-info
Package Name          |St|        Version|  Rel.|  Distro|       Date
=====================================================================
aalib                 | i|        1.4.0_5|     8|   Solus|14 Oct 2024
abseil-cpp            | i|     20240116.2|    10|   Solus|14 Oct 2024
accountsservice       | i|        23.13.9|    36|   Solus|14 Oct 2024
acl                   | i|          2.3.2|    21|   Solus|14 Oct 2024
adwaita-icon-theme    | i|           46.2|    28|   Solus|14 Oct 2024
adwaita-icon-theme-legacy  | i|           46.2|     2|   Solus|14 Oct 2024
alsa-firmware         | i|          1.2.4|     7|   Solus|14 Oct 2024
alsa-lib              | i|         1.2.12|    38|   Solus|14 Oct 2024
alsa-plugins          | i|         1.2.12|    26|   Solus|14 Oct 2024
alsa-utils            | i|         1.2.12|    28|   Solus|14 Oct 2024
aom                   | i|         3.10.0|    24|   Solus|14 Oct 2024
appstream             | i|          1.0.1|     9|   Solus|14 Oct 2024
appstream-data        | i|             49|    51|   Solus|14 Oct 2024
appstream-glib        | i|          0.8.2|    13|   Solus|14 Oct 2024
argon2                | i|       20190702|     6|   Solus|14 Oct 2024
at-spi2               | i|         2.52.0|    44|   Solus|14 Oct 2024
atkmm                 | i|         2.28.4|    19|   Solus|14 Oct 2024
attr                  | i|          2.5.2|    25|   Solus|14 Oct 2024
audit                 | i|          4.0.2|    19|   Solus|14 Oct 2024
avahi                 | i|            0.8|    27|   Solus|14 Oct 2024
baobab                | i|           46.0|    27|   Solus|14 Oct 2024
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ eopkg --no-color list-upgrades --install-info
Package Name          |St|        Version|  Rel.|  Distro|       Date
=====================================================================
adwaita-icon-theme   | i|           46.2|    28|   Solus|14 Oct 2024
appstream-data       | i|             49|    51|   Solus|14 Oct 2024
at-spi2              | i|         2.52.0|    44|   Solus|14 Oct 2024
baobab               | i|           46.0|    27|   Solus|14 Oct 2024
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Caution

Search does not supports exact matching.

Naked search without parameters is the same as extended search with all filtering parameters (i.e. --name --summary --description):

$ eopkg --no-color search firefox
gjs-dbginfo                 - Debug symbols for gjs
bleachbit                   - BleachBit frees disk space and maintains privacy
firefox                     - Firefox web browser
eid-mw-firefox              - Belgian eID add-on for Mozilla Firefox
gjs                         - GNOME JavaScript
font-fira-ttf               - Mozilla's new typeface, used in Firefox OS
geckodriver                 - WebDriver for Firefox
firefox-dbginfo             - Debug symbols for firefox
nvidia-vaapi-driver-dbginfo - Debug symbols for nvidia-vaapi-driver
font-clear-sans-ttf         - Clear Sans Fonts - TrueType
gjs-devel                   - Development files for gjs
geckodriver-dbginfo         - Debug symbols for geckodriver

$ eopkg --no-color search firefox --name --summary --description
gjs-dbginfo                 - Debug symbols for gjs
bleachbit                   - BleachBit frees disk space and maintains privacy
firefox                     - Firefox web browser
eid-mw-firefox              - Belgian eID add-on for Mozilla Firefox
gjs                         - GNOME JavaScript
font-fira-ttf               - Mozilla's new typeface, used in Firefox OS
geckodriver                 - WebDriver for Firefox
firefox-dbginfo             - Debug symbols for firefox
nvidia-vaapi-driver-dbginfo - Debug symbols for nvidia-vaapi-driver
font-clear-sans-ttf         - Clear Sans Fonts - TrueType
gjs-devel                   - Development files for gjs
geckodriver-dbginfo         - Debug symbols for geckodriver

For default search on package name only, we rescript filtering to --name only:

$ eopkg --no-color search firefox --name
firefox         - Firefox web browser
eid-mw-firefox  - Belgian eID add-on for Mozilla Firefox
firefox-dbginfo - Debug symbols for firefox
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ sudo eopkg --no-color install --yes-all 0ad
Warning: Updates available, checking reverse dependencies of runtime dependencies for safety.
Following packages will be installed:
0ad          0ad-data         assimp           at-spi2             baobab             breeze-icons      budgie-control-center  budgie-desktop      dav1d                  enet                   evolution-data-server       ffmpeg
file-roller  firefox          fmt              fontconfig          gcr-4              gloox             gnome-calculator       gnome-calendar      gnome-online-accounts  gnome-settings-daemon  gnome-system-monitor        gnome-terminal
gvfs         harfbuzz         ibus             kf6-karchive        kf6-kauth          kf6-kbookmarks    kf6-kcodecs            kf6-kcolorscheme    kf6-kcompletion        kf6-kconfig            kf6-kconfigwidgets          kf6-kcoreaddons
kf6-kcrash   kf6-kdbusaddons  kf6-kded         kf6-kdoctools       kf6-kglobalaccel   kf6-kguiaddons    kf6-ki18n              kf6-kiconthemes     kf6-kio                kf6-kitemviews         kf6-kjobwidgets             kf6-knotifications
kf6-kparts   kf6-kservice     kf6-kwallet      kf6-kwidgetsaddons  kf6-kwindowsystem  kf6-kxmlgui       kf6-solid              kpmcore             ldb                    libadwaita             libarchive                  libass
libcheese    libgtk-4         libgtkmm-4       libgtksourceview5   libheif            libpng            libportal              libportal-gtk4      libreoffice-common     librsvg                libsodium                   libtiff
libtool      libvte           libwebkit-gtk41  libwebkit-gtk6      lzo                mesalib           miniupnpc              nautilus-extension  nemo                   network-manager        networkmanager-openconnect  openconnect
pipewire     pipewire-lib     pixman           poppler             poppler-utils      postgresql-libpq  python-pysmbc          qt6-base            qt6-declarative        qt6-multimedia         qt6-quick3d                 qt6-quicktimeline
qt6-wayland  rav1e            rhythmbox        samba               sdl2               svt-av1           thunderbird            wayland             xapp                   xmlsec1                xorg-server                 xorg-xwayland
xreader      xviewer          zenity
Total size of package(s): 1.94 GB
Downloading 1 / 111
Package ldb found in repository Solus
ldb-2.8.2-31-1-x86_64.eopkg    (137.0 KB)100%      0.00 --/- [--:--:--] [complete]
(...)
Package 0ad-data found in repository Solus
0ad-data-0.0.26a-10-1-x86_64.eopkg (1.4 GB) 39%
(...)
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all outdated packages.

$ sudo eopkg --no-color upgrade --yes-all
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the provided package.

$ sudo eopkg --no-color upgrade --yes-all xz
Updating repositories
Updating repository: Solus
eopkg-index.xml.xz.sha1sum     (40.0  B)100%      0.00 --/- [--:--:--] [complete]
Solus repository information is up-to-date.
Warning: Safety switch forces the installation of following packages:
os-release
Warning: Safety switch forces the upgrade of following packages:
bash    bash-completion  brotli   eopkg    gawk            glib2    glibc         gobject-introspection  hwdata  json-c   libcap2  libdw
libelf  libjson-glib     libnspr  libnss   libpipeline     libssh2  libunistring  lvm2                   lzip    ncurses  nghttp2  nghttp3
pisi    readline         sqlite3  systemd  wireless-regdb  xz
Total size of package(s): 55.40 MB
Warning: There are extra packages due to dependencies.
Downloading 1 / 32
Package ncurses found in repository Solus
ncurses-6.5.20241006-29-1-x86_64.eopkg (767.0 KB)100%      0.00 --/- [--:--:--] [complete]
(...)
[βœ“] Syncing filesystems                                                success
[βœ“] Updating dynamic library cache                                     success
[ ] Updating clr-boot-manager                                          skipped
[ ] Updating clr-boot-manager                                          skipped
[ ] Updating clr-boot-manager                                          skipped
[ ] Updating clr-boot-manager                                          skipped
[ ] Registering QoL migration on next boot                             skipped
[ ] Registering QoL migration on next boot                             skipped
[ ] Registering QoL migration on next boot                             skipped
[ ] Registering QoL migration on next boot                             skipped
[ ] Registering QoL migration on next boot                             skipped
[ ] Registering QoL migration on next boot                             skipped
[ ] Registering QoL migration on next boot                             skipped
[ ] Registering QoL migration on next boot                             skipped
[ ] Registering QoL migration on next boot                             skipped
[βœ“] Updating hwdb                                                      success
[βœ“] Updating system users                                              success
[βœ“] Updating systemd tmpfiles                                          success
[βœ“] Reloading systemd configuration                                    success
[ ] Re-starting vendor-enabled .socket units                           skipped
[ ] Re-executing systemd                                               skipped
[βœ“] Compiling glib-schemas                                             success
[βœ“] Creating GIO modules cache                                         success
[βœ“] Updating manpages database                                         success
[βœ“] Reloading udev rules                                               success
[βœ“] Applying udev rules                                                success
Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Remove one package.

$ sudo eopkg --no-color remove --yes-all firefox
The following list of packages will be removed
in the respective order to satisfy dependencies:
firefox
Removing package firefox
Rebuilding the FilesDB...
Adding packages to FilesDB /var/lib/eopkg/info/files.db:
................
847 packages added in total.
Done rebuilding FilesDB (version: 3)
Removed firefox
[βœ“] Syncing filesystems                                                success
[βœ“] Updating dynamic library cache                                     success
[ ] Updating clr-boot-manager                                          skipped
[ ] Updating clr-boot-manager                                          skipped
[ ] Updating clr-boot-manager                                          skipped
[ ] Updating clr-boot-manager                                          skipped
[ ] Registering QoL migration on next boot                             skipped
[ ] Registering QoL migration on next boot                             skipped
[ ] Registering QoL migration on next boot                             skipped
[ ] Registering QoL migration on next boot                             skipped
[ ] Registering QoL migration on next boot                             skipped
[ ] Registering QoL migration on next boot                             skipped
[ ] Registering QoL migration on next boot                             skipped
[ ] Registering QoL migration on next boot                             skipped
[ ] Registering QoL migration on next boot                             skipped
[ ] Re-starting vendor-enabled .socket units                           skipped
[ ] Re-executing systemd                                               skipped
[βœ“] Updating icon theme cache: hicolor                                 success
[βœ“] Updating desktop database                                          success
[βœ“] Updating manpages database                                         success
Return type:

str

sync()[source]ΒΆ

Sync package metadata.

$ sudo eopkg --no-color update-repo
Updating repository: Solus
eopkg-index.xml.xz.sha1sum  (40.0  B)100%   0.00 --/- [--:--:--] [complete]
eopkg-index.xml.xz           (3.1 MB)100%  87.40 KB/s [00:00:34] [complete]
Package database updated.
Return type:

None

cleanup()[source]ΒΆ

Removes things we don’t need anymore: - orphaned packages, - outdated package locks - package cache and package manager cache

$ sudo eopkg --no-color remove-orphans --yes-all
$ sudo eopkg --no-color clean
$ sudo eopkg --no-color delete-cache
Return type:

None

cli_names: tuple[str, ...] = ('eopkg',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'eopkg'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

meta_package_manager.managers.flatpak moduleΒΆ

class meta_package_manager.managers.flatpak.Flatpak[source]ΒΆ

Bases: PackageManager

Flatpak manages sandboxed desktop applications pulled from remotes like Flathub.

mpm covers applications only: every listing passes --app, so runtimes and SDKs stay out of scope. Listings are requested with --columns=name,application,version --ostree-verbose and parsed as tab-separated rows.

Note

All operations target the system-wide scope except cleanup which only repairs the user installation. Per-scope targeting (system vs user) is tracked in #1725.

Caution

outdated reads each pending update’s latest version from remote-ls --updates, then runs one flatpak info per package to recover its installed version: a follow-up CLI call for every outdated app.

Note

Brewfile backups emit the bare flatpak "id" form: mpm does not capture each app’s origin remote, so brew bundle install restores through Flathub and non-Flathub apps must be edited in by hand.

Initialize cli_errors list.

homepage_url: str | None = 'https://flatpak.org'ΒΆ

Home page of the project, only used in documentation for reference.

brewfile_entry_type: ClassVar[str | None] = 'flatpak'ΒΆ

Mapped to Homebrew Bundle’s flatpak extension.

The Brewfile flatpak entry supports a with: ["remote"] keyword for non-default remotes. mpm’s installed() does not currently capture the origin remote per package, so the dump emits the bare flatpak "id" form; brew bundle install then resolves through the default flathub remote. Non-flathub flatpaks need to be edited in by hand after the dump.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='aix', name='IBM AIX'), Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='cygwin', name='Cygwin'), Platform(id='debian', name='Debian'), Platform(id='dragonfly_bsd', name='DragonFly BSD'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='freebsd', name='FreeBSD'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='haiku', name='Haiku'), Platform(id='hurd', name='GNU/Hurd'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='illumos', name='illumos'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='midnightbsd', name='MidnightBSD'), Platform(id='netbsd', name='NetBSD'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='openbsd', name='OpenBSD'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='os400', name='IBM i'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='solaris', name='Solaris'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='sunos', name='SunOS'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

requirement: str | None = '>=1.2.0'ΒΆ

Version requirement specifier.

Supports a comma-separated range of constraints (e.g. ">=1.20.0,<2.0.0"). A bare version string like "1.20.0" is treated as >=1.20.0.

Parsed by meta_package_manager.version.VersionRange.

Defaults to None, which deactivates version check entirely.

version_regexes: tuple[str, ...] = ('Flatpak\\s+(?P<version>\\S+)',)ΒΆ
$ flatpak --version
Flatpak 1.4.2
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ flatpak list --app --columns=name,application,version             > --ostree-verbose
Peek        com.uploadedlobster.peek        1.3.1
Fragments   de.haeckerfelix.Fragments       1.4
GNOME MPV   io.github.GnomeMpv      0.16
Syncthing GTK       me.kozec.syncthingtk    v0.9.4.3
Builder     org.flatpak.Builder
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ flatpak remote-ls --app --updates --columns=name,application,version                 --ostree-verbose
GNOME Dictionary    org.gnome.Dictionary    3.26.0
Files       org.gnome.Nautilus      42.2
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Caution

Search does not support extended or exact matching. So we return the best subset of results and let meta_package_manager.manager.PackageManager.refiltered_search() refine them.

$ flatpak search gitg --ostree-verbose
gitg    GUI for git        org.gnome.gitg  3.32.1  stable  flathub
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ flatpak install --noninteractive org.gnome.Dictionary
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all outdated packages.

$ flatpak update --noninteractive
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the provided package.

$ flatpak update --noninteractive org.gnome.Dictionary
Return type:

tuple[str, ...]

cli_names: tuple[str, ...] = ('flatpak',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'flatpak'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

name: str = 'Flatpak'ΒΆ

Return package manager’s common name.

Default value is based on class name.

remove(package_id)[source]ΒΆ

Remove one package.

$ flatpak uninstall --noninteractive org.gnome.Dictionary
Return type:

str

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

cleanup()[source]ΒΆ

Removes things we don’t need anymore.

See: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#flatpak-repair

$ flatpak repair --user
Return type:

None

meta_package_manager.managers.fwupd moduleΒΆ

class meta_package_manager.managers.fwupd.FWUPD[source]ΒΆ

Bases: PackageManager

fwupd manages device firmware, treating each updatable device as a package.

Firmware inventory and updates come from the LVFS (Linux Vendor Firmware Service). Each package is keyed by its fwupd DeviceId, carrying the device name and current firmware version. mpm drives fwupdmgr in JSON mode (get-devices --json, get-updates --json), which sets the version floor at 1.9.5: the first release to emit JSON for get-devices.

Note

installed and outdated report only devices carrying the updatable flag: fixed or unsupported hardware is skipped even though fwupdmgr still lists it.

Note

No search (firmware has no name catalog to query) and no remove (firmware cannot be uninstalled). Flashing runs as root and is forced non-interactive: no confirmation prompt, no reboot check, no device-selection prompt.

Initialize cli_errors list.

name: str = 'Linux fwupd'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://fwupd.org'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='debian', name='Debian'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

default_sudo: bool = TrueΒΆ

Built-in escalation default, used when sudo is None.

False on the base: most managers install into user-writable trees and never need root. The system package managers whose privileged operations require root (apt, dnf, pacman, zypper, …) set this to True so their build_cli(..., sudo=True) operations escalate out of the box, while staying switchable off through sudo (--no-sudo or config) for rootless setups.

requirement: str | None = '>=1.9.5'ΒΆ

Version 1.9.5 is the first supporting –json parameter for get-devices command.

cli_names: tuple[str, ...] = ('fwupdmgr',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

pre_args: tuple[str, ...] = ('--assume-yes', '--no-reboot-check', '--no-device-prompt')ΒΆ
version_regexes: tuple[str, ...] = ('compile\\s+org\\.freedesktop\\.fwupd\\s+(?P<version>\\S+)\\s+',)ΒΆ
$ fwupdmgr --version
compile   com.hughsie.libxmlb           0.3.18
compile   com.hughsie.libjcat           0.2.0
compile   org.freedesktop.fwupd         1.9.24
runtime   org.freedesktop.fwupd-efi     1.4
compile   org.freedesktop.gusb          0.4.8
runtime   com.hughsie.libxmlb           0.3.x
runtime   org.freedesktop.gusb          0.4.8
runtime   com.hughsie.libjcat           0.2.0
runtime   org.freedesktop.fwupd         1.9.24
runtime   org.kernel                    6.8.0-48-generic
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ fwupdmgr --assume-yes --no-reboot-check --no-device-prompt get-devices --json
{
  "Devices": [
    {
      "Name": "USB2.0 Hub",
      "DeviceId": "7622d5fdbf1d1e08138156da7d83bf693986ad16",
      "ParentDeviceId" : "b5540761dfe33d9abccd3bb21f1d725f9e69f541",
      "CompositeId" : "b5540761dfe33d9abccd3bb21f1d725f9e69f541",
      "InstanceIds": [
        "USB\VID_17EF&PID_3080",
        "USB\VID_17EF&PID_3080&REV_5163",
        "USB\VID_17EF&PID_3080&HUB_20",
        "USB\VID_17EF&PID_3080&SPI_C220",
        "USB\VID_17EF&PID_3080&SPI_C220&REV_5163",
        "USB\VID_17EF&PID_3080&DEV_VL820Q7"
      ],
      "Guid": [
        "8ee94f0e-9b44-596a-bdd9-6f90401664cc",
        "35199e34-cf82-5b09-9287-622d225056e4",
        "0987e3c9-b1ee-5763-ac6e-51329b034e4b",
        "163cea66-5a78-58af-80ba-21be960aae5c",
        "c7def18d-66ae-5531-924b-2020c3638181"
      ],
      "Summary": "USB 3.x hub",
      "Plugin": "vli",
      "Protocol" : "com.vli.usbhub",
      "Flags": [
        "updatable",
        "registered",
        "can-verify",
        "can-verify-image",
        "dual-image",
        "self-recovery",
        "add-counterpart-guids",
        "unsigned-payload"
      ],
      "Vendor": "VIA Labs, Inc.",
      "VendorId" : "USB:0x17EF",
      "Version": "51.63",
      "VersionFormat" : "bcd",
      "VersionRaw": 20835,
      "Icons": [
        "usb-hub"
      ],
      "InstallDuration" : 15,
      "Created": 1686048073
    },
    {
      "DeviceId" : "20de1d77d0d1787bc56ef62f7d05de49361e1e07",
      "InstanceIds" : [
        "DRM\VEN_RHT&DEV_1234"
      ],
      "Guid" : [
        "90b1437c-86da-5374-a9a7-ceca8b0afd5e"
      ],
      "Plugin" : "linux_display",
      "Flags" : [
        "registered"
      ],
      "Created" : 1731659840
    },
    {
      "Name" : "UEFI dbx",
      "DeviceId" : "362301da643102b9f38477387e2193e57abaa590",
      "InstanceIds" : [
        "UEFI\CRT_E1FFABB40A30D9EE750BDA8BAF36ACA304FF20526138129247576B3339C54537&ARCH_AA64",
        "UEFI\CRT_A1117F516A32CEFCBA3F2D1ACE10A87972FD6BBE8FE0D0B996E09E65D802A503&ARCH_AA64"
      ],
      "Guid" : [
        "a9b31b16-b184-560f-97cb-1aa25e418c7d",
        "67d35028-ca5b-5834-834a-f97380381082"
      ],
      "Summary" : "UEFI revocation database",
      "Plugin" : "uefi_dbx",
      "Protocol" : "org.uefi.dbx",
      "Flags" : [
        "internal",
        "updatable",
        "supported",
        "registered",
        "needs-reboot",
        "usable-during-update",
        "only-version-upgrade",
        "signed-payload"
      ],
      "Checksums" : [
        "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
      ],
      "VendorId" : "UEFI:Linux Foundation",
      "Version" : "0",
      "VersionLowest" : "0",
      "VersionFormat" : "number",
      "Icons" : [
        "computer"
      ],
      "InstallDuration" : 1,
      "Created" : 1731659840,
      "Releases" : [
        {
          "AppstreamId" : "org.linuxfoundation.dbx.aa64.firmware",
          "ReleaseId" : "35289",
          "RemoteId" : "lvfs",
          "Name" : "Secure Boot dbx",
          "NameVariantSuffix" : "aa64",
          "Summary" : "UEFI Secure Boot Forbidden Signature Database",
          "Description" : "<p>Insecure versions of the Microsoft Windows boot manager affected by Black Lotus were added to the list of forbidden signatures due to a discovered security problem.This updates the dbx to the latest release from Microsoft.</p><p>Before installing the update, fwupd will check for any affected executables in the ESP and will refuse to update if it finds any boot binaries signed with any of the forbidden signatures.Applying this update may also cause some Windows install media to not start correctly.</p>",
          "Version" : "26",
          "Filename" : "DBXUpdate-20230509-aa64.cab",
          "Protocol" : "org.uefi.dbx",
          "Categories" : [
            "X-Configuration",
            "X-System"
          ],
          "Issues" : [
            "CVE-2022-21894"
          ],
          "Checksum" : [
            "46a42362cd34c0d103cf534ca431508d24715e51",
            "3ff3f17a9e5d372e51503803f22294f32ca90d1fe570b0bef4088c3a542617e6"
          ],
          "License" : "LicenseRef-proprietary",
          "Size" : 4610,
          "Created" : 1683590400,
          "Locations" : [
            "https://fwupd.org/downloads/3ff3f17a9e5d372e51503803f22294f32ca90d1fe570b0bef4088c3a542617e6-DBXUpdate-20230509-aa64.cab"
          ],
          "Uri" : "https://fwupd.org/downloads/3ff3f17a9e5d372e51503803f22294f32ca90d1fe570b0bef4088c3a542617e6-DBXUpdate-20230509-aa64.cab",
          "Homepage" : "https://uefi.org/revocationlistfile",
          "Vendor" : "Linux Foundation",
          "Flags" : [
            "trusted-metadata",
            "is-upgrade"
          ],
          "InstallDuration" : 1
        },
        {
          "AppstreamId" : "org.linuxfoundation.dbx.aa64.firmware",
          "ReleaseId" : "28503",
          "RemoteId" : "lvfs",
          "Name" : "Secure Boot dbx",
          "NameVariantSuffix" : "aa64",
          "Summary" : "UEFI Secure Boot Forbidden Signature Database",
          "Description" : "<p>An insecure version of software from vmware has been added to the list of forbidden signatures due to a discovered security problem.This updates the dbx to the latest release from Microsoft.</p><p>Before installing the update, fwupd will check for any affected executables in the ESP and will refuse to update if it finds any boot binaries signed with any of the forbidden signatures.</p>",
          "Version" : "22",
          "Filename" : "DBXUpdate-20230314-aa64.cab",
          "Protocol" : "org.uefi.dbx",
          "Categories" : [
            "X-Configuration",
            "X-System"
          ],
          "Issues" : [
            "CVE-2023-28005"
          ],
          "Checksum" : [
            "611e745638f05e9a11c2998cfba38f0bad651141",
            "533ce4ac028585925268d9e39079b71730a7abd94f611bc532707938d4271ad3"
          ],
          "License" : "LicenseRef-proprietary",
          "Size" : 4418,
          "Created" : 1678752000,
          "Locations" : [
            "https://fwupd.org/downloads/533ce4ac028585925268d9e39079b71730a7abd94f611bc532707938d4271ad3-DBXUpdate-20230314-aa64.cab"
          ],
          "Uri" : "https://fwupd.org/downloads/533ce4ac028585925268d9e39079b71730a7abd94f611bc532707938d4271ad3-DBXUpdate-20230314-aa64.cab",
          "Homepage" : "https://uefi.org/revocationlistfile",
          "Vendor" : "Linux Foundation",
          "Flags" : [
            "trusted-metadata",
            "is-upgrade"
          ],
          "InstallDuration" : 1
        },
        {
          "AppstreamId" : "org.linuxfoundation.dbx.aa64.firmware",
          "ReleaseId" : "15180",
          "RemoteId" : "lvfs",
          "Name" : "Secure Boot dbx",
          "NameVariantSuffix" : "aa64",
          "Summary" : "UEFI Secure Boot Forbidden Signature Database",
          "Description" : "<p>This updates the dbx to the latest release from Microsoft which adds insecure versions of grub and shim to the list of forbidden signatures due to multiple discovered security updates.</p>",
          "Version" : "21",
          "Filename" : "DBXUpdate-20220812-aa64.cab",
          "Protocol" : "org.uefi.dbx",
          "Categories" : [
            "X-Configuration",
            "X-System"
          ],
          "Issues" : [
            "CVE-2022-34303",
            "309662",
            "CVE-2022-34302",
            "CVE-2022-34301"
          ],
          "Checksum" : [
            "4032a1d8734e6085f4a6e4bb26a038eb639603b9",
            "bf56092de6586604d2b41d5bb4c9b7787a07adde408fd4134a3f3606f7fda999"
          ],
          "License" : "LicenseRef-proprietary",
          "Size" : 4370,
          "Created" : 1595980800,
          "Locations" : [
            "https://fwupd.org/downloads/bf56092de6586604d2b41d5bb4c9b7787a07adde408fd4134a3f3606f7fda999-DBXUpdate-20220812-aa64.cab"
          ],
          "Uri" : "https://fwupd.org/downloads/bf56092de6586604d2b41d5bb4c9b7787a07adde408fd4134a3f3606f7fda999-DBXUpdate-20220812-aa64.cab",
          "Homepage" : "https://uefi.org/revocationlistfile",
          "Vendor" : "Linux Foundation",
          "Flags" : [
            "trusted-metadata",
            "is-upgrade"
          ],
          "InstallDuration" : 1
        }
      ]
    },
    {
      "Name" : "Virtio network device",
      "DeviceId" : "17076870bcf7a84a9c8e999d7e54e39b446032bb",
      "InstanceIds" : [
        "PCI\VEN_1AF4&DEV_1000",
        "PCI\VEN_1AF4&DEV_1000&SUBSYS_1AF40001"
      ],
      "Guid" : [
        "21c85fac-5270-576f-a84e-04969f8cf75a",
        "b93ef629-0df1-5505-9fee-6992b8b9abd8"
      ],
      "Plugin" : "optionrom",
      "Flags" : [
        "internal",
        "registered",
        "can-verify",
        "can-verify-image"
      ],
      "Vendor" : "Red Hat, Inc.",
      "VendorId" : "PCI:0x1AF4",
      "Created" : 1731659840
    }
  ]
}
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ fwupdmgr --assume-yes --no-reboot-check --no-device-prompt get-updates --json
{
  "Devices" : [
    {
      "Name" : "UEFI dbx",
      "DeviceId" : "362301da643102b9f38477387e2193e57abaa590",
      "InstanceIds" : [
        "UEFI\CRT_E1FFABB40A30D9EE750BDA8BAF36ACA304FF20526138129247576B3339C54537&ARCH_AA64",
        "UEFI\CRT_A1117F516A32CEFCBA3F2D1ACE10A87972FD6BBE8FE0D0B996E09E65D802A503&ARCH_AA64"
      ],
      "Guid" : [
        "a9b31b16-b184-560f-97cb-1aa25e418c7d",
        "67d35028-ca5b-5834-834a-f97380381082"
      ],
      "Summary" : "UEFI revocation database",
      "Plugin" : "uefi_dbx",
      "Protocol" : "org.uefi.dbx",
      "Flags" : [
        "internal",
        "updatable",
        "supported",
        "registered",
        "needs-reboot",
        "usable-during-update",
        "only-version-upgrade",
        "signed-payload"
      ],
      "Checksums" : [
        "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
      ],
      "VendorId" : "UEFI:Linux Foundation",
      "Version" : "0",
      "VersionLowest" : "0",
      "VersionFormat" : "number",
      "Icons" : [
        "computer"
      ],
      "InstallDuration" : 1,
      "Created" : 1731659840,
      "Releases" : [
        {
          "AppstreamId" : "org.linuxfoundation.dbx.aa64.firmware",
          "ReleaseId" : "35289",
          "RemoteId" : "lvfs",
          "Name" : "Secure Boot dbx",
          "NameVariantSuffix" : "aa64",
          "Summary" : "UEFI Secure Boot Forbidden Signature Database",
          "Description" : "<p>Insecure versions of the Microsoft Windows boot manager affected by Black Lotus were added to the list of forbidden signatures due to a discovered security problem.This updates the dbx to the latest release from Microsoft.</p><p>Before installing the update, fwupd will check for any affected executables in the ESP and will refuse to update if it finds any boot binaries signed with any of the forbidden signatures.Applying this update may also cause some Windows install media to not start correctly.</p>",
          "Version" : "26",
          "Filename" : "DBXUpdate-20230509-aa64.cab",
          "Protocol" : "org.uefi.dbx",
          "Categories" : [
            "X-Configuration",
            "X-System"
          ],
          "Issues" : [
            "CVE-2022-21894"
          ],
          "Checksum" : [
            "46a42362cd34c0d103cf534ca431508d24715e51",
            "3ff3f17a9e5d372e51503803f22294f32ca90d1fe570b0bef4088c3a542617e6"
          ],
          "License" : "LicenseRef-proprietary",
          "Size" : 4610,
          "Created" : 1683590400,
          "Locations" : [
            "https://fwupd.org/downloads/3ff3f17a9e5d372e51503803f22294f32ca90d1fe570b0bef4088c3a542617e6-DBXUpdate-20230509-aa64.cab"
          ],
          "Uri" : "https://fwupd.org/downloads/3ff3f17a9e5d372e51503803f22294f32ca90d1fe570b0bef4088c3a542617e6-DBXUpdate-20230509-aa64.cab",
          "Homepage" : "https://uefi.org/revocationlistfile",
          "Vendor" : "Linux Foundation",
          "Flags" : [
            "trusted-metadata",
            "is-upgrade"
          ],
          "InstallDuration" : 1
        },
        {
          "AppstreamId" : "org.linuxfoundation.dbx.aa64.firmware",
          "ReleaseId" : "28503",
          "RemoteId" : "lvfs",
          "Name" : "Secure Boot dbx",
          "NameVariantSuffix" : "aa64",
          "Summary" : "UEFI Secure Boot Forbidden Signature Database",
          "Description" : "<p>An insecure version of software from vmware has been added to the list of forbidden signatures due to a discovered security problem.This updates the dbx to the latest release from Microsoft.</p><p>Before installing the update, fwupd will check for any affected executables in the ESP and will refuse to update if it finds any boot binaries signed with any of the forbidden signatures.</p>",
          "Version" : "22",
          "Filename" : "DBXUpdate-20230314-aa64.cab",
          "Protocol" : "org.uefi.dbx",
          "Categories" : [
            "X-Configuration",
            "X-System"
          ],
          "Issues" : [
            "CVE-2023-28005"
          ],
          "Checksum" : [
            "611e745638f05e9a11c2998cfba38f0bad651141",
            "533ce4ac028585925268d9e39079b71730a7abd94f611bc532707938d4271ad3"
          ],
          "License" : "LicenseRef-proprietary",
          "Size" : 4418,
          "Created" : 1678752000,
          "Locations" : [
            "https://fwupd.org/downloads/533ce4ac028585925268d9e39079b71730a7abd94f611bc532707938d4271ad3-DBXUpdate-20230314-aa64.cab"
          ],
          "Uri" : "https://fwupd.org/downloads/533ce4ac028585925268d9e39079b71730a7abd94f611bc532707938d4271ad3-DBXUpdate-20230314-aa64.cab",
          "Homepage" : "https://uefi.org/revocationlistfile",
          "Vendor" : "Linux Foundation",
          "Flags" : [
            "trusted-metadata",
            "is-upgrade"
          ],
          "InstallDuration" : 1
        },
        {
          "AppstreamId" : "org.linuxfoundation.dbx.aa64.firmware",
          "ReleaseId" : "15180",
          "RemoteId" : "lvfs",
          "Name" : "Secure Boot dbx",
          "NameVariantSuffix" : "aa64",
          "Summary" : "UEFI Secure Boot Forbidden Signature Database",
          "Description" : "<p>This updates the dbx to the latest release from Microsoft which adds insecure versions of grub and shim to the list of forbidden signatures due to multiple discovered security updates.</p>",
          "Version" : "21",
          "Filename" : "DBXUpdate-20220812-aa64.cab",
          "Protocol" : "org.uefi.dbx",
          "Categories" : [
            "X-Configuration",
            "X-System"
          ],
          "Issues" : [
            "CVE-2022-34303",
            "309662",
            "CVE-2022-34302",
            "CVE-2022-34301"
          ],
          "Checksum" : [
            "4032a1d8734e6085f4a6e4bb26a038eb639603b9",
            "bf56092de6586604d2b41d5bb4c9b7787a07adde408fd4134a3f3606f7fda999"
          ],
          "License" : "LicenseRef-proprietary",
          "Size" : 4370,
          "Created" : 1595980800,
          "Locations" : [
            "https://fwupd.org/downloads/bf56092de6586604d2b41d5bb4c9b7787a07adde408fd4134a3f3606f7fda999-DBXUpdate-20220812-aa64.cab"
          ],
          "Uri" : "https://fwupd.org/downloads/bf56092de6586604d2b41d5bb4c9b7787a07adde408fd4134a3f3606f7fda999-DBXUpdate-20220812-aa64.cab",
          "Homepage" : "https://uefi.org/revocationlistfile",
          "Vendor" : "Linux Foundation",
          "Flags" : [
            "trusted-metadata",
            "is-upgrade"
          ],
          "InstallDuration" : 1
        }
      ]
    }
  ]
}
install(package_id, version=None)[source]ΒΆ

Install one package.

$ sudo fwupdmgr  --assume-yes --no-reboot-check --no-device-prompt install 362301da643102b9f38477387e2193e57abaa590
WARNING: UEFI capsule updates not available or enabled in firmware setup
See https://github.com/fwupd/fwupd/wiki/PluginFlag:capsules-unsupported for more information.
0.  Cancel
1.  26
2.  22
3.  21
Choose release [0-3]: 3
Scheduling…              [***************************************]
Successfully installed firmware

$ sudo fwupdmgr --assume-yes --no-reboot-check --no-device-prompt install 362301da643102b9f38477387e2193e57abaa590 21
WARNING: UEFI capsule updates not available or enabled in firmware setup
See https://github.com/fwupd/fwupd/wiki/PluginFlag:capsules-unsupported for more information.
Scheduling…              [***************************************]
362301da643102b9f38477387e2193e57abaa590 is already scheduled to be updated
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all outdated packages.

$ sudo fwupdmgr --assume-yes --no-reboot-check --no-device-prompt update
Return type:

tuple[str, ...]

id: str = 'fwupd'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the package provided as parameter.

$ sudo fwupdmgr --assume-yes --no-reboot-check --no-device-prompt update 362301da643102b9f38477387e2193e57abaa590
WARNING: UEFI capsule updates not available or enabled in firmware setup
See https://github.com/fwupd/fwupd/wiki/PluginFlag:capsules-unsupported for more information.
Scheduling…              [ -                                     ]
362301da643102b9f38477387e2193e57abaa590 is already scheduled to be updated
Return type:

tuple[str, ...]

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

sync()[source]ΒΆ

Sync package metadata.

$ fwupdmgr --assume-yes --no-reboot-check --no-device-prompt refresh --force
Updating lvfs
Downloading…             [***************************************]
Successfully downloaded new metadata: 1 local device supported
Return type:

None

meta_package_manager.managers.gem moduleΒΆ

class meta_package_manager.managers.gem.Gem[source]ΒΆ

Bases: PackageManager

The RubyGems package manager.

gem emits no machine-readable format, so installed, outdated and search listings are parsed from its text output. A gem can keep several versions installed side by side (molinillo (0.5.4, 0.4.5, 0.2.3)); mpm reports the highest as the installed version.

Note

All operations target the default gem scope (controlled by GEM_HOME). On system Ruby this means system-level gems, which may require elevated privileges for write operations. Per-scope targeting (system vs user gems) is tracked in #1725.

Tip

Installs require sudo on system ruby. I (@tresni) recommend doing something like:

$ sudo dseditgroup -o edit -a -t user wheel

And then do visudo to make it so the wheel group does not require a password. There is a line already there for it, you just need to uncomment it and save.

Initialize cli_errors list.

name: str = 'RubyGems'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://rubygems.org'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='aix', name='IBM AIX'), Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='cygwin', name='Cygwin'), Platform(id='debian', name='Debian'), Platform(id='dragonfly_bsd', name='DragonFly BSD'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='freebsd', name='FreeBSD'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='haiku', name='Haiku'), Platform(id='hurd', name='GNU/Hurd'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='illumos', name='illumos'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='macos', name='macOS'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='midnightbsd', name='MidnightBSD'), Platform(id='netbsd', name='NetBSD'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='openbsd', name='OpenBSD'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='os400', name='IBM i'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='solaris', name='Solaris'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='sunos', name='SunOS'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='windows', name='Windows'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

requirement: str | None = '>=2.5.0'ΒΆ
$ gem --version
3.0.3
post_args: tuple[str, ...] = ('--quiet',)ΒΆ

Global list of options used before and after the invoked package manager CLI.

Automatically added to each meta_package_manager.manager.PackageManager.run_cli() call.

Essentially used to force silencing, low verbosity or no-color output.

property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ gem list --quiet
bigdecimal (default: 1.4.1)
bundler (default: 1.17.2)
CFPropertyList (2.3.6)
cmath (default: 1.0.0)
csv (default: 3.0.9)
date (default: 2.0.0)
fileutils (1.4.1, default: 1.1.0)
io-console (0.5.6, default: 0.4.7)
ipaddr (default: 1.2.2)
molinillo (0.5.4, 0.4.5, 0.2.3)
nokogiri (1.5.6)
psych (2.0.0)
rake (0.9.6)
rdoc (4.0.0)
sqlite3 (1.3.7)
test-unit (2.0.0.0)
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ gem outdated --quiet
did_you_mean (1.0.0 < 1.0.2)
io-console (0.4.5 < 0.4.6)
json (1.8.3 < 2.0.1)
minitest (5.8.3 < 5.9.0)
power_assert (0.2.6 < 0.3.0)
psych (2.0.17 < 2.1.0)
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Caution

Search does not supports extended mode.

$ gem search python --versions --quiet
at_coder_friends-generator-python_ref (0.2.0)
bee_python (0.2.3)
dependabot-python (0.117.5)
logstash-filter-python (0.0.1 java)
python (0.0.1)
python-generator (1.1.0)
python_with_git_test (2.499.8)
rabbit-slide-niku-erlangvm-for-pythonista (2015.09.12)
RubyToPython (0.0)
$ gem search python --versions --exact --quiet
python (0.0.1)
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ gem install --quiet markdown
Fetching kramdown-2.3.1.gem
Fetching concurrent-ruby-1.1.9.gem
(...)
Fetching rubyzip-2.3.2.gem
Fetching logutils-0.6.1.gem
Fetching markdown-1.2.0.gem
Successfully installed kramdown-2.3.1
Successfully installed rubyzip-2.3.2
(...)
Successfully installed markdown-1.2.0
(...)
Parsing documentation for markdown-1.2.0
Installing ri documentation for markdown-1.2.0
Done installing documentation for (...) markdown after 19 seconds
12 gems installed
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all outdated packages.

$ gem update --quiet
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the provided package.

$ gem update --quiet markdown
Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Remove one package.

$ gem uninstall left-pad --quiet
Successfully uninstalled left-pad-1.1.0
Return type:

str

sync()[source]ΒΆ

Sync package metadata.

$ gem sources --update --quiet
Return type:

None

cleanup()[source]ΒΆ

Removes things we don’t need anymore.

$ gem cleanup --quiet
Cleaning up installed gems...
Attempting to uninstall test-unit-3.2.9
Unable to uninstall test-unit-3.2.9:
    Gem::FilePermissionError: You don't have write permissions                 for the /Library/Ruby/Gems/2.6.0 directory.
Attempting to uninstall did_you_mean-1.3.0
Unable to uninstall did_you_mean-1.3.0:
    Gem::FilePermissionError: You don't have write permissions                 for the /Library/Ruby/Gems/2.6.0 directory.
Clean up complete
Return type:

None

cli_names: tuple[str, ...] = ('gem',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'gem'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

meta_package_manager.managers.guix moduleΒΆ

class meta_package_manager.managers.guix.Guix[source]ΒΆ

Bases: PackageManager

GNU Guix, GNU’s functional package manager.

Note

All operations target the current user’s default profile. Declarative system configuration (Guix System config.scm) is not covered.

Guix is a rolling release with no upstream semver to pin against: guix --version reports a release tag, a git describe string, or the bare commit hash of an in-tree checkout. No requirement floor is enforced, since any working guix will do.

Warning

search evaluates every package definition to match the query, so its cost scales with the size of the package set, not the result count: tens of seconds on a freshly pulled Guix, longer still from an in-tree development checkout. The call is bounded by mpm --timeout (120s by default), past which it is killed with no results returned, so a slow search can look like a hang.

Initialize cli_errors list.

name: str = 'GNU Guix'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://guix.gnu.org'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='debian', name='Debian'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

version_regexes: tuple[str, ...] = ('guix \\(GNU Guix\\) (?P<version>\\d[\\w.\\-+]*)', 'guix \\(GNU Guix\\) (?P<version>[0-9a-f]{7,40})\\b')ΒΆ
$ guix --version
guix (GNU Guix) 1.4.0
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

Output is tab-separated: name, version, output, store path.

$ guix package --list-installed
hello       2.10    out     /gnu/store/k74skdjjb9c9zqjv9nmgd6zi92wpf3q0-hello-2.10
python      3.10.7  out     /gnu/store/2n3g8n7d5xkp6h4qz1v8m0rjc9wf5aby-python-3.10.7
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

Relies on guix upgrade --dry-run which lists every package that would be upgraded without modifying the user profile.

$ guix upgrade --dry-run
The following packages would be upgraded:
   hello 2.12.1 β†’ 2.12.3
   sed   4.8 β†’ 4.9
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Caution

Search does not support extended or exact matching. So we return the best subset of results and let meta_package_manager.manager.PackageManager.refiltered_search() refine them.

Caution

guix search loads and evaluates every package definition to match the query against each package’s name, synopsis, and description, so it is inherently slow: its cost scales with the size of the package set, not the number of results. A single search runs for tens of seconds on a freshly pulled Guix, and far longer from an in-tree dev checkout that recompiles modules on the fly. The call is bounded by mpm --timeout; when that is unset, search uses the 120s read-only default, past which the process is killed and no results are returned, so a slow search can look like a hang.

Results are printed in recutils format with records separated by blank lines.

$ guix search hello
name: hello
version: 2.10
outputs: out
systems: x86_64-linux i686-linux
dependencies: glibc@2.35 ...
location: gnu/packages/base.scm:86:2
homepage: https://www.gnu.org/software/hello/
license: GPL 3+
synopsis: Hello, GNU world: an example GNU package
description: GNU Hello prints the message "Hello, world!"
+ and then exits.  It serves as an example of standard
+ GNU coding practices.
relevance: 10
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ guix install hello
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all packages.

$ guix upgrade
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade one package.

$ guix upgrade hello
Return type:

tuple[str, ...]

cli_names: tuple[str, ...] = ('guix',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'guix'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

remove(package_id)[source]ΒΆ

Remove one package.

$ guix remove hello
Return type:

str

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

sync()[source]ΒΆ

Fetch the latest Guix channel revisions.

$ guix pull
Return type:

None

cleanup()[source]ΒΆ

Collect garbage in the store.

$ guix gc
Return type:

None

meta_package_manager.managers.homebrew moduleΒΆ

class meta_package_manager.managers.homebrew.Homebrew[source]ΒΆ

Bases: PackageManager

Virtual base shared by the Brew and Cask managers.

Homebrew is the umbrella project behind the brew CLI. mpm exposes it as two managers over that single binary: Brew for formulae built from recipes, and Cask for pre-built macOS applications, each pinning its half with a --formula or --cask selector. This base holds the shared query, mutation and metadata logic; the concrete classes carry the manager-level narrative.

Initialize cli_errors list.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='debian', name='Debian'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='macos', name='macOS'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

Homebrew core is now compatible with Linux and Windows Subsystem for Linux (WSL) 2.

requirement: str | None = '>=6.0.0'ΒΆ

Vanilla brew and cask CLIs now shares the same version.

2.7.0 was the first release to enforce the use of --cask option.

6.0.0 is the first release in which ask mode is the default for brew install and brew upgrade, and the first to ship the --yes opt-out flag that mpm relies on for non-interactive upgrades.

virtual: bool = TrueΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

extra_env: ClassVar = {'HOMEBREW_NO_ANALYTICS': '1', 'HOMEBREW_NO_AUTO_UPDATE': '1', 'HOMEBREW_NO_ENV_HINTS': '1'}ΒΆ

Additional environment variables to add to the current context.

Automatically applied on each meta_package_manager.manager.PackageManager.run_cli() calls.

version_regexes: tuple[str, ...] = ('Homebrew\\s+(?P<version>\\S+)',)ΒΆ
$ brew --version
Homebrew 1.8.6-124-g6cd4c31
Homebrew/homebrew-core (git revision 533d; last commit 2018-12-28)
Homebrew/homebrew-cask (git revision 5095b; last commit 2018-12-28)
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ brew list --versions --formula
ack 2.14
apg 2.2.3
audacity (!) 2.1.2
apple-gcc42 4.2.1-5666.3
atk 2.22.0
bash 4.4.5
bash-completion 1.3_1
boost 1.63.0
c-ares 1.12.0
graphviz 2.40.1 2.40.20161221.0239
quicklook-json latest
$ brew list --versions --cask
aerial 1.2beta5
android-file-transfer latest
audacity (!) 2.1.2
firefox 49.0.1
flux 37.7
gimp 2.8.18-x86_64
java 1.8.0_112-b16
tunnelblick 3.6.8_build_4625 3.6.9_build_4685
virtualbox 5.1.8-111374 5.1.10-112026

Todo

Use the removed variable to detect removed packages (which are reported with a (!) flag). See: https://github.com/caskroom/homebrew-cask/blob/master/doc /reporting_bugs/uninstall_wrongly_reports_cask_as_not_installed.md and https://github.com/kdeldycke/meta-package-manager/issues/17 .

package_metadata_batch(packages)[source]ΒΆ

Enrich installed packages with Homebrew’s API + per-formula data.

Runs brew info --json=v2 --installed in a single shell-out and joins the result back onto the inventory list by package ID. For each formula that has <prefix>/Cellar/<name>/<version>/sbom.spdx.json on disk (the file Homebrew writes when installed under HOMEBREW_SBOM=1), the metadata’s external_sbom_path points at it so the SPDX renderer can splice the upstream document into the aggregate.

Casks reuse the same JSON payload through the casks array but do not get the SBOM-file treatment (Homebrew does not emit one for casks).

Return type:

Iterator[tuple[Package, PackageMetadata]]

property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ brew outdated --json=v2 --formula | jq
{
  "formulae": [
    {
      "name": "pygobject3",
      "installed_versions": [
        "3.36.1"
      ],
      "current_version": "3.38.0",
      "pinned": false,
      "pinned_version": null
    },
    {
      "name": "rav1e",
      "installed_versions": [
        "0.3.3"
      ],
      "current_version": "0.3.4",
      "pinned": false,
      "pinned_version": null
    }
  ],
  "casks": []
}
$ brew outdated --json=v2 --cask | jq
{
  "formulae": [],
  "casks": [
    {
      "name": "electrum",
      "installed_versions": "4.0.2",
      "current_version": "4.0.3"
    },
    {
      "name": "qlcolorcode",
      "installed_versions": "3.0.2",
      "current_version": "3.1.1"
    }
  ]
}
$ brew outdated --json=v2 --greedy --cask | jq
{
  "formulae": [],
  "casks": [
    {
      "name": "amethyst",
      "installed_versions": "0.14.3",
      "current_version": "0.15.3"
    },
    {
      "name": "balenaetcher",
      "installed_versions": "1.5.106",
      "current_version": "1.5.108"
    },
    {
      "name": "caldigit-thunderbolt-charging",
      "installed_versions": "latest",
      "current_version": "latest"
    },
    {
      "name": "electrum",
      "installed_versions": "4.0.2",
      "current_version": "4.0.3"
    },
    {
      "name": "lg-onscreen-control",
      "installed_versions": "5.33,cV8xqv5TSZA.upgrading, 5.47,yi5XuIZw6hg",
      "current_version": "5.48,uYXSwyUCNFBbSch9PFw"
    }
  ]
}

Note

Both the formula and cask payloads also carry pinned and pinned_version fields. The formula payload has always emitted them; the cask payload has emitted them since at least 5.1.15 but they only became meaningful with Homebrew 6.0.0, which added brew pin <cask> so casks can now actually be pinned. mpm discards both fields today: pinned packages still appear in mpm outdated output, and brew upgrade silently skips them at upgrade time. Track this gap if a future mpm release wants to surface or filter on pin state.

search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Caution

Search does not supports extended mode.

$ brew search sed
==> Formulae
gnu-sed βœ”                    libxdg-basedir
==> Casks
eclipse-dsl                       marsedit
focused                           physicseditor
google-adwords-editor             prefs-editor
licensed                          subclassed-mnemosyne
$ brew search sed --formulae
==> Formulae
gnu-sed βœ”                    libxdg-basedir
$ brew search sed --cask
==> Casks
eclipse-dsl                       marsedit
focused                           physicseditor
google-adwords-editor             prefs-editor
licensed                          subclassed-mnemosyne
$ brew search python --formulae
==> Formulae
app-engine-python   boost-python3   python βœ”          python-yq
boost-python        gst-python      python-markdown   python@3.8 βœ”
$ brew search "/^ssed$/" --formulae
==> Formulae
ssed
$ brew search "/^sed$/" --formulae
Error: No formula or cask found for "/^sed$/".
$ brew search tetris --formulae --desc
==> Formulae
bastet: Bastard Tetris
netris: Networked variant of tetris
vitetris: Terminal-based Tetris clone
yetris: Customizable Tetris for the terminal
$ brew search tetris --cask --desc
==> Casks
not-tetris: (Not Tetris) [no description]
tetrio: (TETR.IO) Free-to-play Tetris clone

More doc at: https://docs.brew.sh/Manpage#search

Return type:

Iterator[Package]

trust_tap(package_id)[source]ΒΆ

Trust the tap a third-party package_id belongs to.

Homebrew 6.0.0 rejects code from third-party taps until the tap (or each formula or cask) has been explicitly trusted. Vanilla brew install would otherwise abort with a tap trust is required warning when the snapshot pins a user/tap/name package.

Only fully-qualified package IDs (user/tap/name) need this step: core formulae and casks live on the trusted homebrew/core and homebrew/cask taps. The tap itself is registered first (idempotent if already tapped) so brew trust can resolve the formula or cask. The --formula and --cask flag is supplied by the subclass’s post_args.

$ brew tap gromgit/fuse
$ brew trust gromgit/fuse/ntfs-3g-mac --formula
Return type:

None

install(package_id, version=None)[source]ΒΆ

Install one package.

Tap-qualified IDs (user/tap/name) are routed through trust_tap() first so the install isn’t rejected by Homebrew 6.0.0’s tap-trust gate.

$ brew install jpeginfo --formula
==> Downloading https://ghcr.io/core/jpeginfo/manifests/1.6.1_1-1
############################################################## 100.0%
==> Downloading https://ghcr.io/core/jpeginfo/blobs/sha256:27bb35884368b83
==> Downloading from https://pkg.githubcontent.com/ghcr1/blobs/sha256:27bb3
############################################################## 100.0%
==> Pouring jpeginfo--1.6.1_1.big_sure.bottle.1.tar.gz
🍺  /usr/local/Cellar/jpeginfo/1.6.1_1: 7 files, 77.6KB
$ brew install pngyu --cask
==> Downloading https://nukesaq.github.io/Pngyu/download/Pngyu_mac_101.zip
################################################################## 100.0%
==> Installing Cask pngyu
==> Moving App 'Pngyu.app' to '/Applications/Pngyu.app'
🍺  pngyu was successfully installed!
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all outdated packages.

brew and cask share the same command, but cask overrides this method to append --greedy when auto-updating packages are included.

$ brew upgrade --formula
==> Upgrading 2 outdated packages:
node 13.11.0 -> 13.12.0
sdl2 2.0.12 -> 2.0.12_1
==> Upgrading node 13.11.0 -> 13.12.0
==> Downloading https://homebrew.bintray.com/bottles/node-13.tar.gz
==> Downloading from https://akamai.bintray.com/fc/fc0bfb42fe23e960
############################################################ 100.0%
==> Pouring node-13.12.0.catalina.bottle.tar.gz
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
==> Summary
🍺  /usr/local/Cellar/node/13.12.0: 4,660 files, 60.3MB
Removing: /usr/local/Cellar/node/13.11.0... (4,686 files, 60.4MB)
==> Upgrading sdl2 2.0.12 -> 2.0.12_1
==> Downloading https://homebrew.bintray.com/bottles/sdl2-2.tar.gz
==> Downloading from https://akamai.bintray.com/4d/4dcd635465d16372
############################################################ 100.0%
==> Pouring sdl2-2.0.12_1.catalina.bottle.tar.gz
🍺  /usr/local/Cellar/sdl2/2.0.12_1: 89 files, 4.7MB
Removing: /usr/local/Cellar/sdl2/2.0.12... (89 files, 4.7MB)
==> Checking for dependents of upgraded formulae...
==> No dependents found!
==> Caveats
==> node
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
$ brew upgrade --cask
==> Casks with `auto_updates` or `version :latest` will not be upgraded
==> Upgrading 1 outdated packages:
aerial 2.0.7 -> 2.0.8
==> Upgrading aerial
==> Downloading https://github.com/Aerial/download/v2.0.8/Aerial.saver.zip
==> Downloading from https://65be.s3.amazonaws.com/44998092/29eb1e0
==> Verifying SHA-256 checksum for Cask 'aerial'.
==> Backing Screen Saver up to '/usr/local/Caskroom/Aerial.saver'.
==> Removing Screen Saver '/Users/kde/Library/Screen Savers/Aerial.saver'.
==> Moving Screen Saver to '/Users/kde/Library/Screen Savers/Aerial.saver'.
==> Purging files for version 2.0.7 of Cask aerial
🍺  aerial was successfully upgraded!

--yes skips the interactive confirmation prompt that brew shows by default since ask mode became the default behaviour.

Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the provided package.

brew and cask share the same command.

$ brew upgrade dupeguru --cask
==> Upgrading 1 outdated package:
dupeguru 4.2.0 -> 4.2.1
==> Upgrading dupeguru
==> Downloading https://github.com/(...)/4.2.1/dupeguru_macOS_Qt_4.2.1.zip
==> Downloading from https://githubusercontent.com/production-release-asset
##################################################################### 100.0%
==> Backing App 'dupeguru.app' up to '/opt/homebrew/.../4.2.0/dupeguru.app'
==> Removing App '/Applications/dupeguru.app'
==> Moving App 'dupeguru.app' to '/Applications/dupeguru.app'
==> Purging files for version 4.2.0 of Cask dupeguru
🍺  dupeguru was successfully upgraded!

--yes skips the interactive confirmation prompt that brew shows by default since ask mode became the default behaviour.

Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Removes a package.

$ brew uninstall bat
Uninstalling /usr/local/Cellar/bat/0.21.0... (14 files, 5MB)
Return type:

str

sync()[source]ΒΆ

Sync package metadata.

$ brew update --quiet
Already up-to-date.
Return type:

None

cleanup()[source]ΒΆ

Removes things we don’t need anymore.

Scrub the cache, including latest version’s downloads. Also remove unused dependencies.

Downloads for all installed formulae and casks will not be deleted.

$ brew cleanup -s --prune=all
Removing: ~/Library/Caches/Homebrew/node--1.bottle.tar.gz... (9MB)
Warning: Skipping sdl2: most recent version 2.0.12_1 not installed
Removing: ~/Library/Caches/Homebrew/Cask/aerial--1.8.1.zip... (5MB)
Removing: ~/Library/Caches/Homebrew/Cask/prey--1.9.pkg... (19.9MB)
Removing: ~/Library/Logs/Homebrew/readline... (64B)
Removing: ~/Library/Logs/Homebrew/libfido2... (64B)
Removing: ~/Library/Logs/Homebrew/libcbor... (64B)

More doc at: https://docs.brew.sh/Manpage#cleanup

$ brew autoremove
==> Uninstalling 17 unneeded formulae:
gtkmm3
highlight
lua@5.1
nasm
nghttp2
texi2html
Uninstalling /usr/local/Cellar/nghttp2/1.41.0_1... (26 files, 2.7MB)
Uninstalling /usr/local/Cellar/highlight/3.59... (558 files, 3.5MB)

Warning: The following highlight configuration files have not been removed!
If desired, remove them manually with `rm -rf`:
  /usr/local/etc/highlight
  /usr/local/etc/highlight/filetypes.conf
  /usr/local/etc/highlight/filetypes.conf.default
Uninstalling /usr/local/Cellar/gtkmm3/3.24.2_1... (1,903 files, 173.7MB)
Uninstalling /usr/local/Cellar/texi2html/5.0... (279 files, 6.2MB)
Uninstalling /usr/local/Cellar/lua@5.1/5.1.5_8... (22 files, 245.6KB)
Uninstalling /usr/local/Cellar/nasm/2.15.05... (29 files, 2.9MB)
Return type:

None

cli_names: tuple[str, ...] = ('homebrew',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'homebrew'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

name: str = 'Homebrew'ΒΆ

Return package manager’s common name.

Default value is based on class name.

class meta_package_manager.managers.homebrew.Brew[source]ΒΆ

Bases: Homebrew

The formula half of Homebrew: command-line tools built from recipes.

Homebrew is the umbrella project behind the brew CLI. mpm splits it into two managers over the same binary, this one for formulae and Cask for macOS applications; a forced --formula selector keeps every call on the formula side. Homebrew core runs on macOS and on Linux and WSL.

mpm drives brew non-interactively and pins its environment: analytics and setup hints are silenced, and HOMEBREW_NO_AUTO_UPDATE keeps brew from folding a metadata refresh into every command, since mpm runs that as a separate sync (asked for since mpm’s early days). Outdated packages come from --json=v2; the installed and search listings are parsed from their plain-text columns.

Note

The >=6.0.0 requirement is the release where ask mode became the default for brew install and brew upgrade, and where the --yes opt-out mpm relies on for unattended runs first shipped. It is also where Homebrew began rejecting third-party taps until trusted, so installing a fully-qualified user/tap/name package taps and trusts it first (see Homebrew.trust_tap()).

Caution

A pinned formula still appears in mpm outdated output, yet brew upgrade silently skips it: mpm discards Homebrew’s pinned fields today.

Initialize cli_errors list.

name: str = 'Homebrew Formulae'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://brew.sh'ΒΆ

Home page of the project, only used in documentation for reference.

brewfile_entry_type: ClassVar[str | None] = 'brew'ΒΆ

Name of the Brewfile DSL entry type this manager maps to, or None if the manager has no Brewfile equivalent.

Set by the subset of managers covered by Homebrew Bundle’s DSL (brew, cask, mas, vscode, npm, cargo, uv, winget, flatpak). Consumed by meta_package_manager.brewfile when rendering the output of mpm dump --brewfile.

cli_names: tuple[str, ...] = ('brew',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

post_args: tuple[str, ...] = ('--formula',)ΒΆ

Global list of options used before and after the invoked package manager CLI.

Automatically added to each meta_package_manager.manager.PackageManager.run_cli() call.

Essentially used to force silencing, low verbosity or no-color output.

id: str = 'brew'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

class meta_package_manager.managers.homebrew.Cask[source]ΒΆ

Bases: Homebrew

The cask half of Homebrew: pre-built macOS applications.

Homebrew is the umbrella project behind the brew CLI. mpm splits it into two managers over the same binary, this one for casks and Brew for formulae; a forced --cask selector keeps every call on the cask side. Casks ship macOS .app bundles and .pkg installers, so this manager is macOS-only.

mpm drives brew non-interactively with the same environment pins as Brew (analytics and hints off, HOMEBREW_NO_AUTO_UPDATE so the metadata refresh stays a separate sync) and the same >=6.0.0 floor (ask mode default, the --yes opt-out, and the tap-trust gate that Homebrew.trust_tap() clears for user/tap/name packages).

Note

Casks self-escalate: their artifacts (.pkg installers, kernel extensions) invoke sudo from inside brew, so mpm never wraps a cask command in its own sudo.

Caution

Casks flagged auto_updates true or version :latest update themselves, and brew upgrade skips them unless --greedy is passed. mpm supplies --greedy (to outdated and to upgrade --all) unless auto-updating packages are being ignored. --greedy conflicts with --formula, so this handling is cask-only and cannot fold into the base shared with Brew.

Initialize cli_errors list.

name: str = 'Homebrew Cask'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://github.com/Homebrew/homebrew-cask'ΒΆ

Home page of the project, only used in documentation for reference.

brewfile_entry_type: ClassVar[str | None] = 'cask'ΒΆ

Name of the Brewfile DSL entry type this manager maps to, or None if the manager has no Brewfile equivalent.

Set by the subset of managers covered by Homebrew Bundle’s DSL (brew, cask, mas, vscode, npm, cargo, uv, winget, flatpak). Consumed by meta_package_manager.brewfile when rendering the output of mpm dump --brewfile.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='macos', name='macOS')})ΒΆ

Casks are only available on macOS, not Linux or WSL.

id: str = 'cask'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

internal_sudo: bool = TrueΒΆ

Cask artifacts (.pkg installers, kernel extensions) run sudo from inside brew.

cli_names: tuple[str, ...] = ('brew',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

post_args: tuple[str, ...] = ('--cask',)ΒΆ

Global list of options used before and after the invoked package manager CLI.

Automatically added to each meta_package_manager.manager.PackageManager.run_cli() call.

Essentially used to force silencing, low verbosity or no-color output.

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all outdated packages.

Adds --greedy to the shared brew upgrade command when auto-updating packages are included, mirroring Homebrew.outdated(). Without it, brew upgrade skips casks flagged auto_updates true or version :latest, so mpm --include-auto-updates upgrade --all would report them as outdated but never upgrade them.

Note

This override is cask-only by necessity: brew upgrade declares --greedy and --formula mutually exclusive, while brew outdated accepts the pair. The conflict is intentional: --formula has conflicted with --greedy ever since the selector switch was added to brew upgrade in August 2020, and a request to tolerate --greedy as a no-op in formula-only contexts was declined as invalid usage. This method can therefore never fold back into the base class shared with brew.

A cask explicitly passed to brew upgrade is always evaluated greedily, so Homebrew.upgrade_one_cli() needs no counterpart.

Return type:

tuple[str, ...]

meta_package_manager.managers.mas moduleΒΆ

class meta_package_manager.managers.mas.MAS[source]ΒΆ

Bases: PackageManager

mas drives the Mac App Store from the command line.

Packages are Mac App Store applications, keyed by the numeric adamID Apple assigns each title (the id in an App Store link). mpm reads and writes that ID; the display name rides along only as a label.

Every query reads --json output, the supported programmatic interface since the >=7.0.0 floor added --json to list, outdated and search. It sidesteps the column-alignment ambiguities of the tabular listing, where an app name carrying parentheses or padding whitespace would derail a positional parser.

Note

mas prints one JSON object per app, concatenated rather than wrapped in an array, and leaves control characters (embedded newlines, U+2028) unescaped inside name and description strings (upstream bug). mpm decodes the buffer one object at a time with strict=False so each object ends at its own closing brace instead of splitting on those bytes.

Note

mas self-escalates: it asks for root itself when a store mutation needs it, so mpm never wraps install, upgrade or uninstall in its own sudo.

Initialize cli_errors list.

name: str = 'Mac App Store'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://github.com/mas-cli/mas'ΒΆ

Home page of the project, only used in documentation for reference.

brewfile_entry_type: ClassVar[str | None] = 'mas'ΒΆ

Name of the Brewfile DSL entry type this manager maps to, or None if the manager has no Brewfile equivalent.

Set by the subset of managers covered by Homebrew Bundle’s DSL (brew, cask, mas, vscode, npm, cargo, uv, winget, flatpak). Consumed by meta_package_manager.brewfile when rendering the output of mpm dump --brewfile.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='macos', name='macOS')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

requirement: str | None = '>=7.0.0'ΒΆ

7.0.0 introduces the --json flag on config, list, lookup/info, outdated & search. Parsing structured JSON output is the supported programmatic interface: it sidesteps the column-alignment ambiguities of the tabular output (app names containing parentheses or extra whitespace would break the previous regex-based parser).

version_cli_options: tuple[str, ...] = ('version',)ΒΆ
$ mas version
7.0.0
brewfile_entry(package)[source]ΒΆ

Brewfile mas entries take the app’s display name as the positional argument and the Mac App Store numeric ID as the id: keyword.

Returns None (silently skip) for any package whose ID is not a numeric adamID: that shape is impossible to round-trip through brew bundle without the ID, and a half-broken mas "Name" line would error at install time.

property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ mas list --json
{"adamID":1569813296,"bundleID":"com.1password.1password-safari","name":"1Password for Safari","version":"2.3.5"}
{"adamID":1295203466,"bundleID":"com.microsoft.rdc.macos","name":"Microsoft Remote Desktop","version":"10.7.6"}
{"adamID":409183694,"bundleID":"com.apple.iWork.Keynote","name":"Keynote","version":"12.0"}
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ mas outdated --json
{"adamID":409183694,"name":"Keynote","newVersion":"12.0","version":"11.0"}
{"adamID":1176895641,"name":"Spark","newVersion":"2.11.21","version":"2.11.20"}
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Caution

Search does not support extended or exact matching. So we return the best subset of results and let meta_package_manager.manager.PackageManager.refiltered_search() refine them.

$ mas search python --json
{"adamID":689176796,"name":"Python Runner","version":"1.3"}
{"adamID":630736088,"name":"Learning Python","version":"1.0"}
{"adamID":945397020,"name":"Run Python","version":"1.0"}
{"adamID":1164498373,"name":"PythonGames","version":"1.0"}
{"adamID":1400050251,"name":"Pythonic","version":"1.0.0"}
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ mas install 945397020
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all outdated packages.

$ mas upgrade
Return type:

tuple[str, ...]

cli_names: tuple[str, ...] = ('mas',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'mas'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the provided package.

$ mas upgrade 945397020
Return type:

tuple[str, ...]

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

remove(package_id)[source]ΒΆ

Removes a package.

mas 4.1.0+ requests root privileges itself when not already running as root, so we don’t pre-wrap the call in sudo. This matches how install and upgrade are already invoked.

$ mas uninstall 1494051017
Password:
Uninstalled '/Applications/SimpleLogin.app' to '/Users/kde/.Trash/SimpleLogin.app'
Return type:

str

meta_package_manager.managers.mise moduleΒΆ

class meta_package_manager.managers.mise.Mise[source]ΒΆ

Bases: PackageManager

mise (formerly rtx) installs and switches between versions of developer tools like Node, Python, Ruby and any tool reachable through its plugin backends.

Note

mpm is system-scoped, so this wrapper reports every tool version present on disk regardless of which mise.toml (global or project) requested it. Project-pinned versions are not surfaced as a separate scope.

Note

Backend-prefixed tool IDs (pipx:ruff, cargo:ubi-cli, asdf:mise-plugins/mise-poetry) round-trip as-is. The colon is part of the package ID; mpm install pipx:ruff resolves the backend through mise itself.

Caution

mise outdated --json only reports tools tracked in a mise.toml (global or project). A tool installed bare with mise install <tool> and never pinned with mise use will not appear in the outdated list, so mpm outdated --mise understates the upgrade surface for those entries.

Initialize cli_errors list.

name: str = 'mise'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://mise.jdx.dev'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='aix', name='IBM AIX'), Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='cygwin', name='Cygwin'), Platform(id='debian', name='Debian'), Platform(id='dragonfly_bsd', name='DragonFly BSD'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='freebsd', name='FreeBSD'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='haiku', name='Haiku'), Platform(id='hurd', name='GNU/Hurd'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='illumos', name='illumos'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='macos', name='macOS'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='midnightbsd', name='MidnightBSD'), Platform(id='netbsd', name='NetBSD'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='openbsd', name='OpenBSD'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='os400', name='IBM i'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='solaris', name='Solaris'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='sunos', name='SunOS'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='windows', name='Windows'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

requirement: str | None = '>=2025.5.10'ΒΆ

mise search shipped in 2025.5.10, the binding floor for the feature set this wrapper depends on. Earlier releases also miss the outdated --json fix from 2025.2.8 that emits valid JSON when no tool is outdated.

version_regexes: tuple[str, ...] = ('^(?P<version>\\d+\\.\\d+\\.\\d+)',)ΒΆ

mise uses CalVer (YYYY.M.P), not SemVer.

$ mise --version
2026.6.3 macos-arm64 (2026-06-13)
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

Emits one meta_package_manager.package.Package per (tool, installed_version) pair, so a tool installed at multiple versions yields multiple entries sharing the same ID.

$ mise ls --installed --json
{
  "node": [
    {
      "version": "20.10.0",
      "install_path": "~/.local/share/mise/installs/node/20.10.0",
      "source": {"type": "mise.toml",
                 "path": "~/.config/mise/config.toml"}
    }
  ],
  "pipx:ruff": [
    {
      "version": "0.6.9",
      "install_path": "~/.local/share/mise/installs/pipx-ruff/0.6.9"
    }
  ]
}
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ mise outdated --json
{
  "node": {
    "requested": "20",
    "current": "20.0.0",
    "latest": "20.10.0"
  }
}
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

mise search returns a two-column Tool  Description table. --match-type contains keeps the candidate set wide; the framework’s meta_package_manager.manager.PackageManager.refiltered_search() narrows it down to honor extended and exact flags.

$ mise search --no-header --match-type contains node
node                Node.js
node-build          Compile and install Node.js
nodejs              alias for node
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

mise install <tool> resolves to the latest version compatible with the active config; mise install <tool>@<version> pins it explicitly. Neither variant writes to mise.toml: the dedicated mise use command is the config-mutating verb and is deliberately avoided here.

$ mise install node@20
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all packages.

$ mise upgrade
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade one package.

$ mise upgrade node
Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Remove one package.

mise uninstall <tool> errors when more than one version of the tool is installed. --all removes every installed version unconditionally, which matches mpm’s β€œremove this package” contract.

$ mise uninstall --all node
Return type:

str

cli_names: tuple[str, ...] = ('mise',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'mise'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

sync()[source]ΒΆ

Refresh plugin metadata.

mise resolves tool listings and version catalogues through its plugins, so updating the plugins is the closest equivalent to the package-list refresh other managers perform during sync.

$ mise plugins update
Return type:

None

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

cleanup()[source]ΒΆ

Clear mise’s download and metadata caches.

$ mise cache clear
Return type:

None

meta_package_manager.managers.nix moduleΒΆ

class meta_package_manager.managers.nix.Nix[source]ΒΆ

Bases: PackageManager

Nix, the functional package manager.

Note

All operations use the imperative nix-env interface, which manages a per-user package profile. Declarative approaches (NixOS modules, home-manager) are not covered.

Channel refresh (sync) and store garbage collection (cleanup) shell out to the sibling nix-channel and nix-collect-garbage binaries installed alongside nix-env, not to nix-env itself.

Initialize cli_errors list.

homepage_url: str | None = 'https://nixos.org'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='debian', name='Debian'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='macos', name='macOS'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

requirement: str | None = '>=2.0.0'ΒΆ

Version requirement specifier.

Supports a comma-separated range of constraints (e.g. ">=1.20.0,<2.0.0"). A bare version string like "1.20.0" is treated as >=1.20.0.

Parsed by meta_package_manager.version.VersionRange.

Defaults to None, which deactivates version check entirely.

cli_names: tuple[str, ...] = ('nix-env',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

version_regexes: tuple[str, ...] = ('nix-env \\(Nix\\) (?P<version>\\S+)',)ΒΆ
$ nix-env --version
nix-env (Nix) 2.18.1
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ nix-env --query --installed
hello-2.12.1
nix-2.18.1
python3-3.11.6
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ nix-env --query --upgradeable --compare-versions
hello-2.12.1 < 2.13.0
python3-3.11.6 < 3.12.0
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Caution

Search does not support extended or exact matching. So we return the best subset of results and let meta_package_manager.manager.PackageManager.refiltered_search() refine them.

Caution

nix-env --query --available evaluates the full nixpkgs set and can be slow on first invocation.

$ nix-env --query --available --attr-path --description 'hello'
nixpkgs.hello  hello-2.12.1  A program that produces a friendly greeting
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ nix-env --install hello
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all packages.

$ nix-env --upgrade
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade one package.

$ nix-env --upgrade hello
Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Remove one package.

$ nix-env --uninstall hello
Return type:

str

sync()[source]ΒΆ

Update Nix channel metadata.

$ nix-channel --update
Return type:

None

cleanup()[source]ΒΆ

Remove old generations and garbage-collect the Nix store.

$ nix-collect-garbage --delete-old
Return type:

None

id: str = 'nix'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

name: str = 'Nix'ΒΆ

Return package manager’s common name.

Default value is based on class name.

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

meta_package_manager.managers.npm moduleΒΆ

class meta_package_manager.managers.npm.NPM[source]ΒΆ

Bases: PackageManager

The Node.js package manager.

mpm drives npm in global mode: every call forces --global so packages land in the shared prefix instead of the current working directory. Per-scope targeting and multi-binary discovery (several node versions through nvm) are tracked in #1725. Command equivalences with the sibling JS managers are listed at https://github.com/antfu-collective/ni?tab=readme-ov-file#ni.

Queries parse npm’s --json output. Mutating operations are marked privileged so --sudo can escalate writes into a root-owned global prefix, though escalation stays dormant unless requested.

Note

npm enforces a supply-chain cooldown through its min-release-age resolver option, refusing to resolve any release younger than the configured age. The version floor exists for it: min-release-age first shipped in 11.10.0, and older releases silently ignore the setting.

Caution

A fatal npm error (usually a local node version out of sync) is reported both on <stderr> and as a JSON blob on <stdout>. The run_cli override blanks that JSON so the failure surfaces once, through <stderr>, rather than being parsed as a package listing.

Initialize cli_errors list.

name: str = 'Node npm'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://www.npmjs.com'ΒΆ

Home page of the project, only used in documentation for reference.

brewfile_entry_type: ClassVar[str | None] = 'npm'ΒΆ

Name of the Brewfile DSL entry type this manager maps to, or None if the manager has no Brewfile equivalent.

Set by the subset of managers covered by Homebrew Bundle’s DSL (brew, cask, mas, vscode, npm, cargo, uv, winget, flatpak). Consumed by meta_package_manager.brewfile when rendering the output of mpm dump --brewfile.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='aix', name='IBM AIX'), Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='cygwin', name='Cygwin'), Platform(id='debian', name='Debian'), Platform(id='dragonfly_bsd', name='DragonFly BSD'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='freebsd', name='FreeBSD'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='haiku', name='Haiku'), Platform(id='hurd', name='GNU/Hurd'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='illumos', name='illumos'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='macos', name='macOS'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='midnightbsd', name='MidnightBSD'), Platform(id='netbsd', name='NetBSD'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='openbsd', name='OpenBSD'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='os400', name='IBM i'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='solaris', name='Solaris'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='sunos', name='SunOS'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='windows', name='Windows'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

requirement: str | None = '>=11.10.0'ΒΆ

11.10.0 is the first version to ship min-release-age, the purpose-built release-age gate mpm uses for the supply-chain cooldown (see cooldown_env_var). Older npm releases silently ignore the env var, so the floor avoids advertising a gate that does nothing.

cooldown_env_var: ClassVar[str | None] = 'npm_config_min-release-age'ΒΆ

npm honors a release-age cooldown through its min-release-age resolver option.

npm maps any npm_config_<key> environment variable to a config setting, so npm_config_min-release-age sets min-release-age without touching the user’s .npmrc. Once set, npm refuses to resolve any package version younger than the configured age, which covers install and update along with their transitive dependencies. The hyphenated env var passes cleanly through Python’s subprocess.Popen env= mapping (shells that reject export foo-bar=baz are not involved).

The cooldown_env_value() method below is overridden to emit an integer number of days, the unit min-release-age expects.

See https://docs.npmjs.com/cli/v11/using-npm/config#min-release-age.

pre_args: tuple[str, ...] = ('--global', '--no-progress', '--no-update-notifier', '--no-fund', '--no-audit')ΒΆ
$ npm --version
6.13.7
cooldown_env_value()[source]ΒΆ

Render meta_package_manager.execution.CLIExecutor.cooldown as an integer day count for npm’s min-release-age.

Sub-day cooldowns round up so the gate over-protects rather than silently collapses to 0 (the β€œno cooldown” sentinel).

Return type:

str

run_cli(*args, **kwargs)[source]ΒΆ

Like the common run_cli helper, but silence NPM’s JSON output on error.

NPM is prone to breakage if local node version is not in sync:

$ npm --global --no-progress --no-update-notifier --no-fund --no-audit                 --json outdated
{
  "error": {
    "code": "ERR_OUT_OF_RANGE",
    "summary": "The value of "err" is out of range. Received 536870212",
    "detail": ""
  }
}
Return type:

str

property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ npm --global --no-progress --no-update-notifier --no-fund --no-audit                 --json --depth 0 list
{
  "name": "lib",
  "dependencies": {
    "@eslint/json": {
      "version": "0.9.0",
      "overridden": false
    },
    "@mermaid-js/mermaid-cli": {
      "version": "10.8.0",
      "overridden": false
    },
    "corepack": {
      "version": "0.30.0",
      "overridden": false
    },
    "google-closure-compiler": {
      "version": "20240317.0.0",
      "overridden": false
    },
    "npm": {
      "version": "10.9.2",
      "overridden": false
    },
    "raven": {
      "version": "2.6.4",
      "overridden": false
    },
    "wrangler": {
      "version": "3.51.2",
      "overridden": false
    }
  }
}
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ npm --global --no-progress --no-update-notifier --no-fund --no-audit                 --json outdated
{
  "my-linked-package": {
    "current": "0.0.0-development",
    "wanted": "linked",
    "latest": "linked",
    "location": "/Users/kev/dev/my-linked-package"
  },
  "npm": {
    "current": "3.10.3",
    "wanted": "3.10.5",
    "latest": "3.10.5",
    "location": "/opt/homebrew/lib/node_modules/npm"
  }
}
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Doc: https://docs.npmjs.com/cli/search.html

Caution

Search does not supports exact matching.

$ npm --global --no-progress --no-update-notifier --no-fund --no-audit                 search --json python | jq
[
  {
    "name": "python",
    "description": "Interact with a python child process",
    "maintainers": [
      {
        "username": "drderidder",
        "email": "drderidder@gmail.com"
      }
    ],
    "version": "0.0.4",
    "date": "2015-01-25T02:48:07.820Z"
  },
  {
    "name": "raven",
    "description": "A standalone (Node.js) client for Sentry",
    "maintainers": [
      {
        "username": "benvinegar",
        "email": "ben@benv.ca"
      },
      {
        "username": "lewisjellis",
        "email": "me@lewisjellis.com"
      },
      {
        "username": "mattrobenolt",
        "email": "m@robenolt.com"
      },
      {
        "username": "zeeg",
        "email": "dcramer@gmail.com"
      }
    ],
    "keywords": [
      "raven",
      "sentry",
      "python",
      "errors",
      "debugging",
      "exceptions"
    ],
    "version": "1.1.2",
    "date": "2017-02-09T02:54:07.723Z"
  },
  {
    "name": "brush-python",
    "description": "Python brush module for SyntaxHighlighter.",
    "maintainers": [
      {
        "username": "alexgorbatchev",
        "email": "alex.gorbatchev@gmail.com"
      }
    ],
    "keywords": [
      "syntaxhighlighter",
      "brush",
      "python"
    ],
    "version": "4.0.0",
    "date": "2016-02-07T21:32:39.597Z"
  },
  (...)
]
$ npm --global --no-progress --no-update-notifier --no-fund --no-audit                 search --json --no-description python | jq
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ npm --global --no-progress --no-update-notifier --no-fund --no-audit                 install markdown

added 3 packages in 3s
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all outdated packages.

$ npm --global --no-progress --no-update-notifier --no-fund --no-audit                 update
Return type:

tuple[str, ...]

cli_names: tuple[str, ...] = ('npm',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'npm'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the package provided as parameter.

$ npm --global --no-progress --no-update-notifier --no-fund --no-audit                 upgrade raven
Return type:

tuple[str, ...]

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

remove(package_id)[source]ΒΆ

Remove one package and one only.

$ npm --global --no-progress --no-update-notifier --no-fund --no-audit                 uninstall raven
Return type:

str

cleanup()[source]ΒΆ

Removes things we don’t need anymore.

$ npm --global --no-progress --no-update-notifier --no-fund --no-audit                 cache clean --force
Return type:

None

meta_package_manager.managers.pacman moduleΒΆ

class meta_package_manager.managers.pacman.Pacman[source]ΒΆ

Bases: PackageManager

Arch Linux’s native package manager, covering the official repositories.

mpm forces --noconfirm and --color never on every call so pacman runs unattended and prints uncolored text the regexes can parse. Installed packages come from --query and upgradable ones from --query --upgrades; searches hit the sync databases via --sync --search.

The Pacaur, Paru and Yay subclasses are AUR helpers that reuse every parser and forced argument here unchanged, overriding only the binary (and, for yay, adding a release-age cooldown).

See command equivalences at: https://wiki.archlinux.org/title/Pacman/Rosetta.

Caution

--query --upgrades only reports updates for packages tracked in a sync database, so foreign packages (installed with pacman -U, as AUR helpers do) stay invisible to the base pacman binary. The subclasses escape this because their own binary also queries the AUR RPC. This upstream behavior is not confirmed on a live Arch box: see Pacman.outdated().

Initialize cli_errors list.

name: str = 'Arch Linux pacman'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://wiki.archlinux.org/title/pacman'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='aix', name='IBM AIX'), Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='cygwin', name='Cygwin'), Platform(id='debian', name='Debian'), Platform(id='dragonfly_bsd', name='DragonFly BSD'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='freebsd', name='FreeBSD'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='haiku', name='Haiku'), Platform(id='hurd', name='GNU/Hurd'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='illumos', name='illumos'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='midnightbsd', name='MidnightBSD'), Platform(id='netbsd', name='NetBSD'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='openbsd', name='OpenBSD'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='os400', name='IBM i'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='solaris', name='Solaris'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='sunos', name='SunOS'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

default_sudo: bool = TrueΒΆ

Built-in escalation default, used when sudo is None.

False on the base: most managers install into user-writable trees and never need root. The system package managers whose privileged operations require root (apt, dnf, pacman, zypper, …) set this to True so their build_cli(..., sudo=True) operations escalate out of the box, while staying switchable off through sudo (--no-sudo or config) for rootless setups.

requirement: str | None = '>=5.0.0'ΒΆ

Version requirement specifier.

Supports a comma-separated range of constraints (e.g. ">=1.20.0,<2.0.0"). A bare version string like "1.20.0" is treated as >=1.20.0.

Parsed by meta_package_manager.version.VersionRange.

Defaults to None, which deactivates version check entirely.

pre_args: tuple[str, ...] = ('--noconfirm', '--color', 'never')ΒΆ
version_regexes: tuple[str, ...] = ('.*Pacman\\s+v(?P<version>\\S+)',)ΒΆ

Search version right after the ``Pacman `` string.

$ pacman --version

 .--.                  Pacman v6.0.1 - libalpm v13.0.1
/ _.-' .-.  .-.  .-.   Copyright (C) 2006-2021 Pacman Development Team
\  '-. '-'  '-'  '-'   Copyright (C) 2002-2006 Judd Vinet
 '--'
                    This program may be freely redistributed under
                    the terms of the GNU General Public License.
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ pacman --noconfirm --query
a52dec 0.7.4-11
aalib 1.4rc5-14
abseil-cpp 20211102.0-2
accountsservice 22.08.8-2
acl 2.3.1-2
acme.sh 3.0.2-1
acpi 1.7-3
acpid 2.0.33-1
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ pacman --noconfirm --query --upgrades
linux 4.19.1.arch1-1 -> 4.19.2.arch1-1
linux-headers 4.19.1.arch1-1 -> 4.19.2.arch1-1

Note

pacman --query --upgrades (-Qu) only reports updates for packages tracked in a sync database (official repos, plus any local repo configured in pacman.conf). Foreign packages, those installed with pacman -U as most AUR helpers do, are invisible to -Qu and surface only under -Qm.

The Pacaur, Paru and Yay subclasses inherit this method verbatim, yet still see AUR updates because their own binary’s -Qu additionally queries the AUR RPC for foreign packages. The per-subclass binary override is therefore load-bearing: routing these helpers through pacman directly would silently drop every AUR update from the results.

Caution

This follows upstream -Qu semantics but has not been confirmed on a live Arch box. Before relying on it, verify that yay --query --upgrades invoked through mpm actually surfaces a pending AUR update.

search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Caution

Search does not supports extended matching.

$ pacman --noconfirm --sync --search fire
extra/dump_syms 0.0.7-1
    Symbol dumper for Firefox
extra/firefox 99.0-1
    Standalone web browser from mozilla.org
extra/firefox-i18n-ach 99.0-1
    Acholi language pack for Firefox
extra/firefox-i18n-af 99.0-1
    Afrikaans language pack for Firefox
extra/firefox-i18n-an 99.0-1
    Aragonese language pack for Firefox
extra/firefox-i18n-ar 99.0-1
    Arabic language pack for Firefox
extra/firefox-i18n-ast 99.0-1
    Asturian language pack for Firefox
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ sudo pacman --noconfirm --color never --sync firefox
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade the package provided as parameter.

$ sudo pacman --noconfirm --color never --sync --refresh --sysupgrade
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the package provided as parameter.

$ sudo pacman --noconfirm --color never --sync firefox
Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Removes a package.

$ sudo pacman --noconfirm --color never --remove firefox
Return type:

str

sync()[source]ΒΆ

Sync package metadata.

$ pacman --noconfirm --color never --sync --refresh
Return type:

None

cleanup()[source]ΒΆ

Removes things we don’t need anymore.

$ sudo pacman --noconfirm --color never --sync --clean --clean
Return type:

None

cli_names: tuple[str, ...] = ('pacman',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'pacman'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

class meta_package_manager.managers.pacman.Pacaur[source]ΒΆ

Bases: Pacman

AUR helper wrapping pacman, driven through the pacaur binary.

Inherits every operation, parser and forced argument from Pacman; only the binary and version probe differ. Routing through pacaur is what lets --query --upgrades report AUR updates on top of the official repositories.

Unlike pacman, the helper must run as the regular user: it aborts under root (you cannot perform this operation as root) because makepkg refuses to build as root, and it invokes sudo pacman itself for the privileged steps. mpm therefore never wraps it in sudo.

Initialize cli_errors list.

name: str = 'Arch Linux pacaur'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://github.com/E5ten/pacaur'ΒΆ

Home page of the project, only used in documentation for reference.

default_sudo: bool = FalseΒΆ

pacaur aborts its sync-class operations under root and runs sudo pacman itself, so the escalation default inherited from Pacman must not wrap it.

internal_sudo: bool = TrueΒΆ

pacaur calls sudo pacman from inside its own commands for the install, upgrade and removal steps.

requirement: str | None = '>=4.0.0'ΒΆ

Version requirement specifier.

Supports a comma-separated range of constraints (e.g. ">=1.20.0,<2.0.0"). A bare version string like "1.20.0" is treated as >=1.20.0.

Parsed by meta_package_manager.version.VersionRange.

Defaults to None, which deactivates version check entirely.

version_regexes: tuple[str, ...] = ('pacaur\\s+(?P<version>\\S+)',)ΒΆ

Search version right after the pacaur string.

$ pacaur --version
pacaur 4.8.6
cli_names: tuple[str, ...] = ('pacaur',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'pacaur'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

class meta_package_manager.managers.pacman.Paru[source]ΒΆ

Bases: Pacman

AUR helper wrapping pacman, driven through the paru binary.

Inherits every operation, parser and forced argument from Pacman; only the binary and version probe differ. Its own --query --upgrades reports AUR updates on top of the official repositories. The >=1.9.3 floor is the first paru release to implement --sysupgrade, the flag the inherited upgrade_all_cli builds.

Unlike pacman, the helper must run as the regular user: any transaction building AUR packages aborts under root (can't install AUR package as root), and paru invokes sudo pacman itself for the privileged steps. mpm therefore never wraps it in sudo.

Initialize cli_errors list.

name: str = 'Arch Linux paru'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://github.com/Morganamilo/paru'ΒΆ

Home page of the project, only used in documentation for reference.

default_sudo: bool = FalseΒΆ

paru refuses to build AUR packages under root and runs sudo pacman itself, so the escalation default inherited from Pacman must not wrap it.

internal_sudo: bool = TrueΒΆ

paru calls sudo from inside its own commands (the Sudo/SudoFlags settings of paru.conf) for the install, upgrade and removal steps.

requirement: str | None = '>=1.9.3'ΒΆ

Version requirement specifier.

Supports a comma-separated range of constraints (e.g. ">=1.20.0,<2.0.0"). A bare version string like "1.20.0" is treated as >=1.20.0.

Parsed by meta_package_manager.version.VersionRange.

Defaults to None, which deactivates version check entirely.

version_regexes: tuple[str, ...] = ('paru\\s+v(?P<version>\\S+)',)ΒΆ

Search version right after the paru string.

$ paru --version
paru v1.10.0 - libalpm v13.0.1
cli_names: tuple[str, ...] = ('paru',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'paru'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

class meta_package_manager.managers.pacman.Yay[source]ΒΆ

Bases: Pacman

AUR helper wrapping pacman, driven through the yay binary.

Inherits every operation, parser and forced argument from Pacman; the binary, version probe and the release-age cooldown below are what differ. Its own --query --upgrades reports AUR updates on top of the official repositories.

Unlike pacman, the helper must run as the regular user: yay warns under root (Avoid running yay as root/sudo.) and any AUR build then dies in makepkg, which refuses to run as root. yay drives sudo itself for the privileged steps (its --sudo, --sudoflags and --sudoloop options), so mpm never wraps it in sudo. That also keeps the injected XDG_CONFIG_HOME cooldown overlay below visible to yay, where a sudo wrap would have reset the environment.

Note

yay exposes no release-age flag, so mpm enforces the supply-chain cooldown by overlaying a generated init.lua through a private XDG_CONFIG_HOME (see Yay.cooldown_env()). This needs yay >= 13.0.0, when the Lua UpgradeSelect/AURPreInstall hooks landed; an older yay stays a usable manager but cannot honor a cooldown. The upstream request for a less invasive injection point is https://github.com/Jguer/yay/issues/2883.

Initialize cli_errors list.

name: str = 'Arch Linux yay'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://github.com/Jguer/yay'ΒΆ

Home page of the project, only used in documentation for reference.

default_sudo: bool = FalseΒΆ

yay discourages root runs (makepkg hard-refuses them for AUR builds) and drives sudo itself, so the escalation default inherited from Pacman must not wrap it. A wrap would also strip the XDG_CONFIG_HOME cooldown overlay through sudo’s environment reset.

cli_names: tuple[str, ...] = ('yay',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'yay'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

internal_sudo: bool = TrueΒΆ

yay calls the escalation binary from inside its own commands, configurable through its --sudo, --sudoflags and --sudoloop options.

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

requirement: str | None = '>=11.0.0'ΒΆ

Version requirement specifier.

Supports a comma-separated range of constraints (e.g. ">=1.20.0,<2.0.0"). A bare version string like "1.20.0" is treated as >=1.20.0.

Parsed by meta_package_manager.version.VersionRange.

Defaults to None, which deactivates version check entirely.

cooldown_env_var: ClassVar[str | None] = 'XDG_CONFIG_HOME'ΒΆ

yay reads no release-age option of its own, so mpm repurposes XDG_CONFIG_HOME to point yay at the throwaway config overlay built by cooldown_env().

Unlike the single-value variables of pip/uv/npm, the value is a directory; the cutoff itself rides alongside it in MPM_COOLDOWN_EPOCH. Set so the structural supports_cooldown check (and the --cooldown help text) still recognize yay as cooldown-capable.

version_regexes: tuple[str, ...] = ('yay\\s+v(?P<version>\\S+)',)ΒΆ

Search version right after the yay string.

$ yay --version
yay v11.1.2 - libalpm v13.0.1
cooldown_requirement = '>=13.0.0'ΒΆ

Minimum yay version whose Lua hooks the cooldown overlay relies on.

v13.0.0 introduced yay.create_autocmd and the UpgradeSelect/AURPreInstall events. Kept apart from requirement (>=11.0.0) so a v11/v12 yay stays fully usable for everything except the cooldown.

property supports_cooldown: boolΒΆ

Whether this yay can natively enforce a release-age cooldown.

Reports the structural capability while idle (cooldown is None) so the import-time COOLDOWN_SUPPORTED_MANAGERS help text stays I/O-free, and only probes the manager version once a cooldown is active, gating on cooldown_requirement. A yay older than that (or undetectable) reports no support, so the fail-closed default skips install/upgrade rather than running them unguarded.

cooldown_env()[source]ΒΆ

Deliver the release-age cooldown through a private XDG_CONFIG_HOME.

yay has no release-age option, so rather than injecting a single value mpm points yay at _cooldown_overlay_dir: a throwaway config tree whose generated init.lua (_YAY_COOLDOWN_INIT_LUA) registers the cooldown Lua hooks. The cutoff travels as MPM_COOLDOWN_EPOCH (Unix seconds of now - cooldown), keeping the init.lua asset static, and MPM_YAY_USER_DIR lets it chain the user’s real config so the redirect stays lossless.

Returns an empty mapping when no cooldown is set or the installed yay predates the Lua hooks (see supports_cooldown).

Return type:

Mapping[str, str | None]

meta_package_manager.managers.pacstall moduleΒΆ

class meta_package_manager.managers.pacstall.Pacstall[source]ΒΆ

Bases: PackageManager

AUR-inspired, source-based package manager for Ubuntu and other Linux distributions.

Pacstall builds packages from β€œpacscripts” and installs the results as .deb archives through dpkg. mpm forces NO_COLOR and DISABLE_PROMPTS so output is uncolored and every call stays non-interactive.

Note

Listing installed packages is a two-step probe: piped --list prints bare names with no versions, so mpm follows each with a --cache-info <pkg> version call to recover its version.

Note

--search matches names only and reports no versions. There is no per-package upgrade verb either, so upgrading one package reinstalls it through --install.

Initialize cli_errors list.

homepage_url: str | None = 'https://pacstall.dev'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='debian', name='Debian'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

requirement: str | None = '>=6.0.0'ΒΆ

Version requirement specifier.

Supports a comma-separated range of constraints (e.g. ">=1.20.0,<2.0.0"). A bare version string like "1.20.0" is treated as >=1.20.0.

Parsed by meta_package_manager.version.VersionRange.

Defaults to None, which deactivates version check entirely.

extra_env: ClassVar = {'DISABLE_PROMPTS': '1', 'NO_COLOR': '1'}ΒΆ

Suppress ANSI colors and disable interactive prompts.

version_regexes: tuple[str, ...] = ('(?P<version>\\d+\\.\\d+\\.\\d+)',)ΒΆ
$ pacstall --version
6.3.7 Vanilla
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ pacstall --list
neofetch
neovim

Note

When piped, pacstall --list outputs bare package names without versions. A follow-up pacstall --cache-info <pkg> version call retrieves the installed version per package.

property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ pacstall --list-upgrades
Upgradable: 2
    neofetch @ pacstall-programs#master ( 7.1.0-2 -> 7.2.0-1 )
    neovim @ pacstall-programs#master ( 0.9.4-1 -> 0.10.0-1 )
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Caution

Search does not support extended or exact matching, and does not provide version information. Returns the best subset of results and lets meta_package_manager.manager.PackageManager.refiltered_search() refine them.

$ pacstall --search neovim
neovim @ pacstall-programs
neovim-git @ pacstall-programs
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ pacstall --install neofetch
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all packages.

$ pacstall --upgrade
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade one package by reinstalling it.

$ pacstall --install neofetch
Return type:

tuple[str, ...]

cli_names: tuple[str, ...] = ('pacstall',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'pacstall'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

name: str = 'Pacstall'ΒΆ

Return package manager’s common name.

Default value is based on class name.

remove(package_id)[source]ΒΆ

Remove one package.

$ pacstall --remove neofetch
Return type:

str

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

sync()[source]ΒΆ

Sync package metadata from remote repositories.

$ pacstall --update
Return type:

None

meta_package_manager.managers.pip moduleΒΆ

class meta_package_manager.managers.pip.Pip[source]ΒΆ

Bases: PackageManager

The pip package installer for Python, driven as a module (python -m pip) rather than through the pip executable.

Calling the module through the interpreter lets pip upgrade itself, an advantage on Windows in particular (https://snarky.ca/why-you-should-use-python-m-pip/).

Installed and outdated packages are read from pip’s list --format=json output. The outdated query adds --not-required to report only top-level packages, since upgrading a transitive dependency can break its parent’s version constraints (#1214). There is no search: PyPI disabled its server-side search API in 2020 under unmanageable load, so pip search no longer works (see pip issue 5216).

Note

All operations target the default pip scope (system site-packages, or the active virtualenv). Per-scope targeting (system vs user vs venv) and multi-binary discovery (multiple pythons via pyenv) are tracked in #1725.

Note

Interpreter discovery probes the running Python first, so an mpm installed inside a virtualenv manages that virtualenv, then the Python(s) on PATH. Two kinds are skipped so the manager only targets a scope the user can install into: mpm’s own distributor-managed bundle (Homebrew stages it under a Cellar prefix) and any externally-managed, non-virtualenv interpreter that PEP 668 forbids pip install into. When every candidate is skipped, the manager reports as unavailable.

Note

Installs, upgrades and removals are marked privileged, so a global install can escalate with --sudo, but escalation is off by default. The supply-chain cooldown needs pip 26.1, the first release to honor --uploaded-prior-to; older pip silently ignores the release-age gate.

Initialize cli_errors list.

name: str = 'Python pip'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://pip.pypa.io'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='aix', name='IBM AIX'), Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='cygwin', name='Cygwin'), Platform(id='debian', name='Debian'), Platform(id='dragonfly_bsd', name='DragonFly BSD'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='freebsd', name='FreeBSD'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='haiku', name='Haiku'), Platform(id='hurd', name='GNU/Hurd'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='illumos', name='illumos'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='macos', name='macOS'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='midnightbsd', name='MidnightBSD'), Platform(id='netbsd', name='NetBSD'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='openbsd', name='OpenBSD'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='os400', name='IBM i'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='solaris', name='Solaris'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='sunos', name='SunOS'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='windows', name='Windows'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

requirement: str | None = '>=26.1.0'ΒΆ

26.1 is the first version to ship --uploaded-prior-to, the release-age gate mpm uses for the supply-chain cooldown (see cooldown_env_var). Older pip releases silently ignore PIP_UPLOADED_PRIOR_TO, so the floor avoids advertising a gate that does nothing.

cooldown_env_var: ClassVar[str | None] = 'PIP_UPLOADED_PRIOR_TO'ΒΆ

pip honors a release-age cooldown through its --uploaded-prior-to resolver option.

pip maps any PIP_<UPPER_SNAKE> environment variable to a config setting, so PIP_UPLOADED_PRIOR_TO sets the option without touching the user’s pip.conf. The flag excludes from resolution any distribution uploaded after the given instant, which covers install and upgrade (with transitive dependencies). pip parses the RFC 3339 timestamp produced by the default meta_package_manager.execution.CLIExecutor.cooldown_env_value().

See https://github.com/pypa/pip/issues/13674.

cli_names: tuple[str, ...] = ('python3', 'python')ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

pre_args: tuple[str, ...] = ('-m', 'pip', '--no-color')ΒΆ
version_cli_options: tuple[str, ...] = ('-m', 'pip', '--no-color', '--version')ΒΆ

CLI options used to produce the version of the package manager.

The raw output produced by the package manager CLI will be parsed with the version_regexes below to extract the version number.

version_regexes: tuple[str, ...] = ('pip\\s+(?P<version>\\S+)',)ΒΆ
$ python -m pip --no-color --version
pip 2.0.2 from /usr/local/lib/python/site-packages/pip (python 3.7)
search_all_cli(cli_names, env=None)[source]ΒΆ

Yield the Python interpreters the pip manager may target.

The running interpreter is probed first, so an mpm installed into a virtualenv manages that virtualenv’s own packages, then the Python(s) found on PATH. Two kinds of interpreter are skipped, so the pip manager only ever targets a scope the user can actually install into:

  • mpm’s own distributor-managed bundle (see _running_from_bundled_app()), and

  • any externally-managed, non-virtualenv interpreter PEP 668 would forbid pip install into (see _pip_install_blocked()).

When every candidate is skipped the manager is left with no cli_path and reports as unavailable, which is correct: there is no user-managed pip environment to act on.

Todo

Evaluate findpython (the maintained MIT rewrite of pythonfinder) to replace the discovery loop here. It would only cover discovery: the eligibility filters (_running_from_bundled_app(), _pip_install_blocked()) stay mpm’s job, since findpython locates interpreters but does not judge whether pip install is allowed into one.

Return type:

Generator[Path, None, None]

property version: TokenizedString | NoneΒΆ

Print Python’s own version before Pip’s.

This gives much more context to the user about the environment when a Python executable is found but Pip is not.

Runs:

$ python --version --version
Python 3.10.10 (Feb  8 2023, 05:34) [Clang 14.0.0 (clang-1400.0.29.202)]
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ python -m pip --no-color list --format=json --verbose --quiet
[
 {
    "version": "1.3",
    "name": "backports.functools-lru-cache",
    "location": "/usr/local/lib/python3.7/site-packages",
    "installer": "pip"
  },
  {
    "version": "0.9999999",
    "name": "html5lib",
    "location": "/usr/local/lib/python3.7/site-packages",
    "installer": "pip"
  },
  {
    "name": "setuptools",
    "version": "46.0.0",
    "location": "/usr/local/lib/python3.7/site-packages",
    "installer": ""
  },
  {
    "version": "2.8",
    "name": "Jinja2",
    "location": "/usr/local/lib/python3.7/site-packages",
    "installer": ""
  }
]
package_metadata_batch(packages)[source]ΒΆ

Enrich installed pip packages via importlib.metadata.

Each installed distribution exposes its METADATA file (the Core Metadata from PEP 621) plus RECORD, WHEEL, and INSTALLER files in its .dist-info directory. This method reads them in-process: no shell-outs, no network, fast enough to enumerate hundreds of distributions in a fraction of a second.

Maps Home-page / Project-URL lines into the portable homepage / vcs_url / issue_tracker_url slots, walks Requires-Dist into typed meta_package_manager.package.Dependency edges, and promotes the upstream author or maintainer to meta_package_manager.package.Originator.

Return type:

Iterator[tuple[Package, PackageMetadata]]

property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

Note

The --not-required flag filters out transitive dependencies, restricting results to top-level packages only. Upgrading transitive dependencies can break version constraints of their parent packages. See #1214.

$ python -m pip --no-color list --format=json --outdated             > --not-required --verbose --quiet
[
  {
    "latest_filetype": "wheel",
    "version": "0.7.9",
    "name": "alabaster",
    "latest_version": "0.7.10",
    "location": "/usr/local/lib/python3.7/site-packages",
    "installer": "pip"
  },
  {
    "latest_filetype": "wheel",
    "version": "0.9999999",
    "name": "html5lib",
    "latest_version": "0.999999999",
    "location": "/usr/local/lib/python3.7/site-packages",
    "installer": "pip"
   },
  {
    "latest_filetype": "wheel",
    "version": "2.8",
    "name": "Jinja2",
    "latest_version": "2.9.5",
    "location": "/usr/local/lib/python3.7/site-packages",
    "installer": "pip"
   },
  {
    "latest_filetype": "wheel",
    "version": "0.5.3",
    "name": "mccabe",
    "latest_version": "0.6.1",
    "location": "/usr/local/lib/python3.7/site-packages",
    "installer": "pip"
   },
  {
    "latest_filetype": "wheel",
    "version": "2.2.0",
    "name": "pycodestyle",
    "latest_version": "2.3.1",
    "location": "/usr/local/lib/python3.7/site-packages",
    "installer": "pip"
   },
  {
    "latest_filetype": "wheel",
    "version": "2.1.3",
    "name": "Pygments",
    "latest_version": "2.2.0",
    "location": "/usr/local/lib/python3.7/site-packages",
    "installer": ""
   }
]
id: str = 'pip'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

install(package_id, version=None)[source]ΒΆ

Install one package.

$ python -m pip --no-color install arrow
Collecting arrow
  Using cached arrow-1.1.1-py3-none-any.whl (60 kB)
Collecting python-dateutil>=2.7.0
  Using cached python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
Requirement already satisfied: six>=1.5 in python3.9/site-packages (1.16.0)
Installing collected packages: python-dateutil, arrow
Successfully installed arrow-1.1.1 python-dateutil-2.8.2
Return type:

str

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the package provided as parameter.

$ python -m pip --no-color install --upgrade six
Collecting six
  Using cached six-1.15.0-py2.py3-none-any.whl (10 kB)
Installing collected packages: six
  Attempting uninstall: six
    Found existing installation: six 1.14.0
    Uninstalling six-1.14.0:
      Successfully uninstalled six-1.14.0
Successfully installed six-1.15.0

Note

Pip lacks support of a proper full upgrade command. Raising an error let the parent class upgrade packages one by one.

See: https://github.com/pypa/pip/issues/59

Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Remove one package.

$ python -m pip --no-color uninstall --yes arrow
Return type:

str

cleanup()[source]ΒΆ

Removes things we don’t need anymore.

$ python -m pip --no-color cache purge
Return type:

None

meta_package_manager.managers.pipx moduleΒΆ

class meta_package_manager.managers.pipx.Pipx[source]ΒΆ

Bases: PackageManager

pipx installs Python CLI applications, each in its own isolated venv.

Installed applications come from pipx list --json; only each venv’s main package is tracked, never the packages injected beside it. There is no search operation: the request was closed as not planned, since PyPI exposes no search API and custom search is out of pipx’s scope (see pipx issue 777).

Note

The outdated query prefers pipx 1.16.0’s native pipx list --outdated, which checks every venv in one call, each against its own backend (pip or uv). An older pipx falls back to probing each venv with its embedded pip, one call per application. The version floor stays at 1.0.0 so an older pipx remains fully usable: only the outdated path degrades.

Note

The supply-chain cooldown rides on the underlying pip and needs that pip to be at least 26.1, the first release to honor --uploaded-prior-to; older pip silently ignores the release-age gate.

Initialize cli_errors list.

name: str = 'Python pipx'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://pipx.pypa.io'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='aix', name='IBM AIX'), Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='cygwin', name='Cygwin'), Platform(id='debian', name='Debian'), Platform(id='dragonfly_bsd', name='DragonFly BSD'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='freebsd', name='FreeBSD'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='haiku', name='Haiku'), Platform(id='hurd', name='GNU/Hurd'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='illumos', name='illumos'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='macos', name='macOS'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='midnightbsd', name='MidnightBSD'), Platform(id='netbsd', name='NetBSD'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='openbsd', name='OpenBSD'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='os400', name='IBM i'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='solaris', name='Solaris'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='sunos', name='SunOS'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='windows', name='Windows'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

requirement: str | None = '>=1.0.0'ΒΆ
$ pipx --version
1.0.0
cooldown_env_var: ClassVar[str | None] = 'PIP_UPLOADED_PRIOR_TO'ΒΆ

pipx defers resolution to pip, so it honors pip’s --uploaded-prior-to gate through the same environment variable.

Setting PIP_UPLOADED_PRIOR_TO on a pipx invocation propagates to the pip subprocess pipx spawns to install the application and its dependencies, so the cutoff applies to the whole resolution. mpm injects the RFC 3339 timestamp from the default meta_package_manager.execution.CLIExecutor.cooldown_env_value().

Caution

Same caveat as meta_package_manager.managers.pip.Pip: the underlying pip must be at least 26.1 for the gate to take effect. Older pip releases silently ignore the env var.

See https://github.com/pypa/pipx/issues/1811.

outdated_requirement = '>=1.16.0'ΒΆ

Minimum pipx version providing the native outdated query.

1.16.0 introduced pipx list --outdated (see https://github.com/pypa/pipx/issues/149). Kept apart from requirement (>=1.0.0) so an older pipx stays fully usable, outdated falling back to one pip probe per venv.

property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ pipx list --json
{
  "pipx_spec_version": "0.1",
  "venvs": {
      "pycowsay": {
        "metadata": {
          "injected_packages": {},
          "main_package": {
            "app_paths": [
              {
                "__Path__": "~/.local/pipx/venvs/pycowsay/bin/pycowsay",
                "__type__": "Path"
              }
            ],
            "app_paths_of_dependencies": {},
            "apps": [
              "pycowsay"
            ],
            "apps_of_dependencies": [],
            "include_apps": true,
            "include_dependencies": false,
            "package": "pycowsay",
            "package_or_url": "pycowsay",
            "package_version": "0.0.0.1",
            "pip_args": [],
            "suffix": ""
          },
        "pipx_metadata_version": "0.2",
        "python_version": "Python 3.10.4",
        "venv_args": []
      }
    }
  }
}
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

pipx 1.16.0 introduced a native outdated query, which checks all venvs in a single call, each against its own backend (pip or uv). Injected packages are excluded by default, so only each venv’s main package is reported. Pinned packages are kept: a newer release exists, even if pipx upgrade skips them.

$ pipx list --outdated --output=json
{
  "command": ["list"],
  "data": {
    "packages_checked": 1,
    "packages": [
      {
        "environment": "pycowsay",
        "package": "pycowsay",
        "version": "0.0.0.1",
        "latest_version": "0.0.0.2",
        "injected": false,
        "pinned": false
      }
    ],
    "skipped": []
  },
  "errors": [],
  "exit_code": 0,
  "pipx_result_version": "1",
  "status": "success"
}

A pipx older than outdated_requirement falls back to probing each venv with its embedded pip, one call per package. Only the venv’s main package is reported; its dependencies also show up in pip list --outdated but are silenced:

$ pipx runpip pycowsay list --no-color --format=json --outdated             > --verbose --quiet
[
  {
    "name": "pycowsay",
    "version": "0.0.0.1",
    "location": "~/.local/pipx/venvs/pycowsay/lib/python3.10/site-packages",
    "installer": "pip",
    "latest_version": "0.0.0.2",
    "latest_filetype": "wheel"
  }
]

Todo

Drop the fallback, which mimics Pip.outdated(), once pipx 1.16.0 is old enough to be required outright.

install(package_id, version=None)[source]ΒΆ

Install one package.

$ pipx install pycowsay
installed package pycowsay 0.0.0.1, installed using Python 3.10.4
These apps are now globally available
    - pycowsay
done! ✨ 🌟 ✨
Return type:

str

cli_names: tuple[str, ...] = ('pipx',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'pipx'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

upgrade_all_cli()[source]ΒΆ

Upgrade all packages.

Return type:

tuple[str, ...]

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Upgrade the package provided as parameter.

Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Remove one package.

$ pipx uninstall pycowsay
uninstalled pycowsay! ✨ 🌟 ✨
Return type:

str

meta_package_manager.managers.pkcon moduleΒΆ

class meta_package_manager.managers.pkcon.Pkcon[source]ΒΆ

Bases: PackageManager

PackageKit’s console client.

Documentation:

pkcon is an unprivileged client handing transactions to the packagekitd daemon over D-Bus, with the distro’s native backend (apt, dnf, zypp, alpm, …) doing the real work. Escalation is polkit’s job, so no operation is marked sudo: under a strict polkit policy, unattended mutations need a policy permitting them without interactive authentication.

Note

pkcon renders packages as a fused name-version.arch (repo) string and never exposes the raw name;version;arch;repo ID. Names and versions both legitimately contain dashes, so the name/version split below anchors on the first dash followed by a digit: a documented heuristic, not an exact science.

Initialize cli_errors list.

name: str = 'PackageKit'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://www.freedesktop.org/software/PackageKit/'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='debian', name='Debian'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

requirement: str | None = '>=0.7.0'ΒΆ

All the commands and flags used here (--plain, --noninteractive, --filter) are present since PackageKit 0.7.0.

extra_env: ClassVar = {'LC_ALL': 'C'}ΒΆ

Additional environment variables to add to the current context.

Automatically applied on each meta_package_manager.manager.PackageManager.run_cli() calls.

post_args: tuple[str, ...] = ('--plain',)ΒΆ

Global list of options used before and after the invoked package manager CLI.

Automatically added to each meta_package_manager.manager.PackageManager.run_cli() call.

Essentially used to force silencing, low verbosity or no-color output.

version_regexes: tuple[str, ...] = ('^(?P<version>[\\d.]+)$',)ΒΆ
$ pkcon --version
1.3.6
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ pkcon get-packages --filter installed --plain
Installed    gzip-1.12-1.fc38.x86_64 (koji-override-0)
Installed    hello-2.12.1-2.fc38.x86_64 (fedora)
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

Result lines carry the update type as their status word (Security, Bug fix, Enhancement, Normal, …) and the version of the pending update.

Caution

With nothing to update, pkcon prints There are no updates available at this time. and exits 5 (PK_EXIT_CODE_NOTHING_USEFUL): a normal empty result, not a failure, so the error recorded for it is discarded.

$ pkcon get-updates --plain
Security     curl-8.0.1-2.fc38.x86_64 (updates)
Normal       hello-2.12.2-1.fc38.x86_64 (updates)
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

$ pkcon search name hello --plain
Available    hello-2.12.1-2.fc38.x86_64 (fedora)
Installed    rubygem-mixlib-shellout-3.2.7-3.fc38.noarch (fedora)
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ pkcon install --noninteractive hello --plain
Return type:

str

cli_names: tuple[str, ...] = ('pkcon',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'pkcon'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all packages.

Note

With nothing to upgrade this exits 5 (β€œnothing useful was done”), which the best-effort maintenance flow reports as a failed manager but never as a non-zero mpm exit.

$ pkcon update --noninteractive --plain
Return type:

tuple[str, ...]

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade one package.

$ pkcon update --noninteractive hello --plain
Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Remove one package.

$ pkcon remove --noninteractive hello --plain
Return type:

str

sync()[source]ΒΆ

Refresh the cached repository metadata.

$ pkcon refresh --plain
Return type:

None

meta_package_manager.managers.pkg moduleΒΆ

FreeBSD package managers.

Two managers share this module because they share the FreeBSD ecosystem and the same on-disk install database:

  • PKG wraps the binary pkg frontend, which fetches pre-compiled artifacts from the official FreeBSD repository.

  • Ports wraps the source-build workflow rooted at /usr/ports, driving make recipes directly and delegating registry queries back to pkg.

References:

meta_package_manager.managers.pkg.PORTS_TREE = PosixPath('/usr/ports')ΒΆ

Canonical location of the FreeBSD ports tree.

The Handbook documents this path as the convention; PORTSDIR can override it, but every tool and consumer in the wild assumes this default.

class meta_package_manager.managers.pkg.PKG[source]ΒΆ

Bases: PackageManager

FreeBSD’s binary pkg frontend, fetching pre-compiled artifacts from the official FreeBSD repository.

Note

outdated parses pkg upgrade --dry-run rather than pkg version, because only the dry-run names the target version each package would move to.

Caution

sync forces IGNORE_OSVERSION=yes: a package built for a newer FreeBSD than the running kernel would otherwise trigger an interactive confirmation that hangs the subprocess. Honoring that variable is also why the version floor is 1.11.

Initialize cli_errors list.

name: str = 'FreeBSD pkg'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://github.com/freebsd/pkg'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='freebsd', name='FreeBSD')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

requirement: str | None = '>=1.11'ΒΆ

1.11 is the first version to support IGNORE_OSVERSION environment variable.

$ pkg --version
1.20.9
pre_args: tuple[str, ...] = ('--quiet',)ΒΆ
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ pkg query "%n %v %c"
7-zip 21.07_2 Console version of the 7-Zip file archiver
ap24-mod_mpm_itk 2.4.7_2 Run each vhost under a separate uid and gid
apache24 2.4.57 Version 2.4.x of Apache web server
aquantia-atlantic-kmod 0.0.5_1 Aquantia AQtion (Atlantic) Network Driver
arcconf 3.07.23971,1 Adaptec SCSI/SAS RAID administration tool
areca-cli-amd64 1.14.7.150519,1 Command Line Interface for ARC-xxxx RAID
base64 1.5_1 Utility to encode and decode base64 files
bash 5.1.12 GNU Project's Bourne Again SHell
beadm 1.4_1 Solaris-like utility to manage Boot Environments on ZFS
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ pkg upgrade --dry-run
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
Checking for upgrades (312 candidates): 100%
Processing candidates (312 candidates): 100%
The following 466 package(s) will be affected (of 0 checked):

Installed packages to be REMOVED:
    freenas-files: 13.0_1700495253
    py39-midcli: 20190509171453
    py39-middlewared: 13.0_1700495253

New packages to be INSTALLED:
    abseil: 20230125.3 [FreeBSD]
    argp-standalone: 1.5.0 [FreeBSD]
    brotli: 1.1.0,1 [FreeBSD]

Installed packages to be UPGRADED:
    7-zip: 21.07_2 -> 23.01 [FreeBSD]
    apache24: 2.4.57 -> 2.4.58_1 [FreeBSD]
    apr: 1.7.0.1.6.1_1 -> 1.7.3.1.6.3_1 [FreeBSD]
    aquantia-atlantic-kmod: 0.0.5_1 -> 0.0.5_2 [FreeBSD]
    bash: 5.1.12 -> 5.2.21 [FreeBSD]

Note

We rely on pkg upgrade instead of pkg version because the latter does not provides the new version:

$ pkg version --like "<"
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
7-zip-21.07_2                      <
apache24-2.4.57                    <
apr-1.7.0.1.6.1_1                  <
aquantia-atlantic-kmod-0.0.5_1     <
bash-5.1.12                        <
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Default search on ID substring:

$ pkg search --raw --raw-format json-compact --search name nginx
{
    "name": "nginx",
    "version": "1.24.0_14,3",
    "comment": "Robust and small WWW server",
    (...)
}
{
    "name": "nginx-devel",
    "version": "1.25.3_9",
    "comment": "Robust and small WWW server",
    (...)
}
{
    "name": "nginx-ultimate-bad-bot-blocker",
    "version": "4.2020.03.2005_1",
    "comment": "Nginx bad bot and other things blocker",
    (...)
}
{
    "name": "p5-Nginx-ReadBody",
    "version": "0.07_1",
    "comment": "Nginx embedded perl module to read a request",
    (...)
}
(...)

Exact search on ID:

$ pkg search --raw --raw-format json-compact --search name --exact nginx
{
    "name": "nginx",
    "origin": "www/nginx",
    "version": "1.24.0_14,3",
    "comment": "Robust and small WWW server",
    "maintainer": "joneum@FreeBSD.org",
    "www": "https://nginx.com/",
    "abi": "FreeBSD:13:amd64",
    "arch": "freebsd:13:x86:64",
    "prefix": "/usr/local",
    "sum": "c39a7696e6eda7bfedba251e4480e50d4c65c520d5a783a584b19b3ef883",
    "flatsize": 1464332,
    "path": "All/nginx-1.24.0_14,3.pkg",
    "repopath": "All/nginx-1.24.0_14,3.pkg",
    "licenselogic": "single",
    "licenses": [
        "BSD2CLAUSE"
    ],
    "pkgsize": 473632,
    "desc": "NGINX is a high performance edge web server with the (...)",
    "deps": {
        "pcre2": {
            "origin": "devel/pcre2",
            "version": "10.42"
        }
    },
    "categories": [
        "www"
    ],
    "shlibs_required": [
        "libpcre2-8.so.0"
    ],
    "options": {
        "AJP": "off",
        "ARRAYVAR": "off",
        "AWS_AUTH": "off",
        "BROTLI": "off",
        "CACHE_PURGE": "off",
        "CLOJURE": "off",
        "COOKIE_FLAG": "off",
        "CT": "off",
        "DEBUG": "off",
        "DEBUGLOG": "off",
        "DEVEL_KIT": "off",
        "DRIZZLE": "off",
        "DSO": "on",
        "DYNAMIC_UPSTREAM": "off",
        "ECHO": "off",
        "ENCRYPTSESSION": "off",
        "FILE_AIO": "on",
        "FIPS_CHECK": "off",
        "FORMINPUT": "off",
        "GOOGLE_PERFTOOLS": "off",
        "GRIDFS": "off",
        "GSSAPI_HEIMDAL": "off",
        "GSSAPI_MIT": "off",
        "HEADERS_MORE": "off",
        "HTTP": "on",
        "HTTPV2": "on",
        "HTTPV3": "off",
        "HTTPV3_BORING": "off",
        "HTTPV3_LSSL": "off",
        "HTTPV3_QTLS": "off",
        "HTTP_ACCEPT_LANGUAGE": "off",
        "HTTP_ADDITION": "on",
        "HTTP_AUTH_DIGEST": "off",
        "HTTP_AUTH_KRB5": "off",
        "HTTP_AUTH_LDAP": "off",
        "HTTP_AUTH_PAM": "off",
        "HTTP_AUTH_REQ": "on",
        "HTTP_CACHE": "on",
        "HTTP_DAV": "on",
        "HTTP_DAV_EXT": "off",
        "HTTP_DEGRADATION": "off",
        "HTTP_EVAL": "off",
        "HTTP_FANCYINDEX": "off",
        "HTTP_SUBS_FILTER": "off",
        "HTTP_TARANTOOL": "off",
        "HTTP_UPLOAD": "off",
        "HTTP_UPLOAD_PROGRESS": "off",
        "HTTP_UPSTREAM_CHECK": "off",
        "HTTP_UPSTREAM_FAIR": "off",
        "HTTP_UPSTREAM_STICKY": "off",
        "HTTP_VIDEO_THUMBEXTRACTOR": "off",
        "HTTP_XSLT": "off",
        "HTTP_ZIP": "off",
        "ICONV": "off",
        "IPV6": "on",
        "LET": "off",
        "LINK": "off",
        "LUA": "off",
        "MAIL": "on",
        "MAIL_IMAP": "off",
        "MAIL_POP3": "off",
        "MAIL_SMTP": "off",
        "MAIL_SSL": "on",
        "MEMC": "off",
        "MODSECURITY3": "off",
        "NAXSI": "off",
        "NJS": "off",
        "NJS_XML": "off",
        "OPENTRACING": "off",
        "PASSENGER": "off",
        "POSTGRES": "off",
        "RDS_CSV": "off",
        "RDS_JSON": "off",
        "REDIS2": "off",
        "RTMP": "off",
        "SET_MISC": "off",
        "SFLOW": "off",
        "SHIBBOLETH": "off",
        "SLOWFS_CACHE": "off",
        "SRCACHE": "off",
        "STREAM": "on",
        "STREAM_REALIP": "on",
        "STREAM_SSL": "on",
        "STREAM_SSL_PREREAD": "on",
        "STS": "off",
        "THREADS": "on",
        "VOD": "off",
        "VTS": "off",
        "WEBSOCKIFY": "off",
        "WWW": "on",
        "XSS": "off"
    },
    "annotations": {
        "FreeBSD_version": "1302001",
        "build_timestamp": "2024-01-07T10:41:34+0000",
        "built_by": "poudriere-git-3.4.0",
        "cpe": "cpe:2.3:a:f5:nginx:1.24.0:::::freebsd13:x64:14",
        "port_checkout_unclean": "no",
        "port_git_hash": "756e18783",
        "ports_top_checkout_unclean": "no",
        "ports_top_git_hash": "756e18783"
    }
}

Extended search:

$ pkg search --raw --raw-format json-compact               --search name --search comment --search description nginx
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ pkg --quiet install --yes dmg2img
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
Checking integrity... done (0 conflicting)
The following 1 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
    dmg2img: 1.6.7 [FreeBSD]

Number of packages to be installed: 1
[1/1] Installing dmg2img-1.6.7...
[1/1] Extracting dmg2img-1.6.7: 100%
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all outdated packages.

$ pkg --quiet upgrade --yes
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the provided package.

$ pkg --quiet upgrade --yes dmg2img
Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Remove one package.

$ pkg --quiet delete --yes dmg2img
Checking integrity... done (0 conflicting)
Deinstallation has been requested for the following 1 packages:

Installed packages to be REMOVED:
    dmg2img: 1.6.7

Number of packages to be removed: 1
[1/1] Deinstalling dmg2img-1.6.7...
[1/1] Deleting files for dmg2img-1.6.7: 100%
pkg: Package database is busy while closing!
Return type:

str

sync()[source]ΒΆ

Sync package metadata.

$ IGNORE_OSVERSION=yes pkg --quiet update
Updating FreeBSD repository catalogue...
Fetching meta.conf: 100%    163 B   0.2kB/s    00:01
Fetching packagesite.pkg: 100%    7 MiB   3.6MB/s    00:02
Processing entries: 100%
FreeBSD repository update completed. 33804 packages processed.
All repositories are up to date.

The IGNORE_OSVERSION=yes prevents blocking update:

$ pkg --quiet update
Updating FreeBSD repository catalogue...
Fetching meta.conf: 100%    163 B   0.2kB/s    00:01
Fetching packagesite.pkg: 100%    7 MiB   3.6MB/s    00:02
Processing entries:   0%
Newer FreeBSD version for package zziplib:
To ignore this error set IGNORE_OSVERSION=yes
- package: 1302001
- running kernel: 1301000
Ignore the mismatch and continue? [y/N]:
Return type:

None

cleanup()[source]ΒΆ

Removes things we don’t need anymore.

$ pkg --quiet autoremove --yes
Checking integrity... done (0 conflicting)
Nothing to do.
$ pkg --quiet clean --yes --all
Nothing to do.
Return type:

None

cli_names: tuple[str, ...] = ('pkg',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'pkg'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

class meta_package_manager.managers.pkg.Ports[source]ΒΆ

Bases: PackageManager

FreeBSD ports tree: the source-build workflow rooted at /usr/ports.

Note

Coexists with PKG on the same system: both share the install database maintained by pkg. Ports builds and tracks ports compiled from source under /usr/ports, while PKG handles binary packages from the FreeBSD repository. Listing operations may overlap because pkg does not distinguish ports-built from binary-installed packages once they are registered.

Note

installed and outdated delegate to the sibling pkg binary, since the ports tree keeps no registry of its own. Builds drive FreeBSD’s make directly with BATCH=yes to accept default build options without prompting. Upgrades shell out to the third-party portmaster: the ports tree ships no batch upgrader. sync refreshes the tree with git (portsnap was removed after FreeBSD 13).

Caution

Mutating operations require root privileges and a populated ports tree at /usr/ports. The manager flags itself unavailable when the tree is missing.

Initialize cli_errors list.

name: str = 'FreeBSD Ports Collection'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://www.freebsd.org/ports/'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='freebsd', name='FreeBSD')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

default_sudo: bool = TrueΒΆ

Built-in escalation default, used when sudo is None.

False on the base: most managers install into user-writable trees and never need root. The system package managers whose privileged operations require root (apt, dnf, pacman, zypper, …) set this to True so their build_cli(..., sudo=True) operations escalate out of the box, while staying switchable off through sudo (--no-sudo or config) for rootless setups.

cli_names: tuple[str, ...] = ('make',)ΒΆ

The ports tree is driven by FreeBSD’s make.

No dedicated frontend exists; each port is a directory whose Makefile targets are invoked directly.

extra_env: ClassVar = {'BATCH': 'yes'}ΒΆ

Force non-interactive builds.

Many ports prompt for build option dialogs by default. BATCH=yes accepts the saved or default options without user interaction, which is the only sensible behavior for an automated tool. See ports(7).

version_cli_options: tuple[str, ...] = ('-V', '.MAKE.VERSION')ΒΆ

FreeBSD make exposes its version via internal variable expansion.

GNU Make’s --version flag does not work on BSD make; using -V .MAKE.VERSION keeps the probe portable and avoids accidentally matching a GNU Make installation shadowing the BSD binary.

version_regexes: tuple[str, ...] = ('(?P<version>\\d{8,})',)ΒΆ

BSD make reports its version as a date-like integer (e.g. 20240218).

property available: boolΒΆ

Available only when make is found and the ports tree exists.

The make binary alone is not enough: without a populated /usr/ports directory, every operation would fail. Treat the tree as part of the manager’s runtime requirement.

property installed: Iterator[Package]ΒΆ

Fetch packages currently registered as installed.

Delegates to pkg query because the ports tree itself maintains no registry: ports installs are recorded in the same database as binary pkg installs.

$ pkg query "%n %v %o %c"
curl 8.7.1 ftp/curl Non-interactive tool to get files from FTP/HTTP servers
python311 3.11.9 lang/python311 Interpreted object-oriented programming language
id: str = 'ports'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

property outdated: Iterator[Package]ΒΆ

Fetch packages whose installed version lags the ports tree.

Uses pkg version in ports-comparison mode (-PL=): it walks the local tree for each installed package and reports those with a newer Makefile version available.

$ pkg version -vIPL=
curl-8.7.1                         <   needs updating (port has 8.8.0)
python311-3.11.9                   <   needs updating (port has 3.11.10)
vim-9.1.0                          =   up-to-date with port
virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

install(package_id, version=None)[source]ΒΆ

Build and install a port from source.

package_id may be either a bare port name (e.g. nginx) or its full origin (e.g. www/nginx). When given a bare name, the origin is resolved through pkg search -o against the active repository.

$ cd /usr/ports/www/nginx && sudo make BATCH=yes install clean
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generate the CLI to upgrade every outdated port.

The ports tree has no first-party batch upgrader; the workflow relies on the third-party portmaster tool. We build the command line without checking that portmaster is installed, because upgrade commands are typically printed for the user to inspect before running.

$ sudo portmaster --no-confirm --no-term-title -a
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generate the CLI to upgrade one port via portmaster.

$ sudo portmaster --no-confirm --no-term-title www/nginx
Return type:

tuple[str, ...]

removeΒΆ

Reuses PKG.remove(): the ports tree has no native uninstaller, and removal goes through the shared install database regardless of how the package was originally built.

sync()[source]ΒΆ

Refresh the local ports tree from upstream.

Modern FreeBSD distributes the ports tree via Git; portsnap was deprecated and removed after FreeBSD 13. We pull from whatever remote the tree was checked out from.

$ sudo git -C /usr/ports pull --ff-only
Return type:

None

cleanup()[source]ΒΆ

Remove cached build artifacts from the ports tree.

Walks the tree once and invokes make clean at the root, which recursively cleans every port’s work directory. DISTCLEAN=yes also removes downloaded distfiles.

$ sudo make -C /usr/ports clean DISTCLEAN=yes BATCH=yes
Return type:

None

meta_package_manager.managers.pnpm moduleΒΆ

class meta_package_manager.managers.pnpm.PNPM[source]ΒΆ

Bases: PackageManager

A Node.js package manager with a content-addressable global store.

Like meta_package_manager.managers.npm.NPM, mpm drives pnpm in global mode (--global on every operation) and parses its --json output. Command equivalences with the sibling JS managers are listed at https://github.com/antfu-collective/ni?tab=readme-ov-file#ni.

Note

pnpm enforces a supply-chain cooldown through its minimumReleaseAge setting (counted in minutes), refusing to install any release published more recently than the configured age. The version floor is set by search, which first shipped in 11.0.0; that release also clears the earlier minimumReleaseAge floor, so one requirement guards every advertised operation.

Caution

pnpm outdated exits 1 when it finds outdated packages, printing the report to <stdout> with an empty <stderr>. The query passes must_succeed so this benign non-zero exit is tolerated instead of raising.

Initialize cli_errors list.

name: str = 'Node pnpm'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://pnpm.io'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='aix', name='IBM AIX'), Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='cygwin', name='Cygwin'), Platform(id='debian', name='Debian'), Platform(id='dragonfly_bsd', name='DragonFly BSD'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='freebsd', name='FreeBSD'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='haiku', name='Haiku'), Platform(id='hurd', name='GNU/Hurd'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='illumos', name='illumos'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='macos', name='macOS'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='midnightbsd', name='MidnightBSD'), Platform(id='netbsd', name='NetBSD'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='openbsd', name='OpenBSD'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='os400', name='IBM i'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='solaris', name='Solaris'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='sunos', name='SunOS'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='windows', name='Windows'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

requirement: str | None = '>=11.0.0'ΒΆ

11.0.0 is the first version to ship the search subcommand. It also clears the 10.16.0 floor of minimumReleaseAge, the release-age gate mpm drives for the supply-chain cooldown (see cooldown_env_var), so a single floor covers every advertised operation. Older pnpm releases either lack search or silently ignore the cooldown setting.

cooldown_env_var: ClassVar[str | None] = 'pnpm_config_minimum_release_age'ΒΆ

pnpm honors a release-age cooldown through its minimumReleaseAge setting.

pnpm reads any setting from an environment variable built by snake-casing the setting name behind a pnpm_config_ prefix (the docs render pmOnFail as pnpm_config_pm_on_fail), so pnpm_config_minimum_release_age sets minimumReleaseAge without touching pnpm-workspace.yaml. Once set, pnpm refuses to install any version published more recently than the configured age, across direct and transitive dependencies.

minimumReleaseAge is expressed in minutes, so cooldown_env_value() is overridden to emit a minute count.

See https://pnpm.io/settings#minimumreleaseage.

cooldown_env_value()[source]ΒΆ

Render meta_package_manager.execution.CLIExecutor.cooldown as an integer minute count for pnpm’s minimumReleaseAge.

Sub-minute cooldowns round up so the gate over-protects rather than silently collapsing to 0 (the β€œno cooldown” sentinel).

Return type:

str

property installed: Iterator[Package]ΒΆ

Fetch installed packages.

pnpm list --json returns an array of project objects; the global scope resolves to a single one whose dependencies map holds the installed packages.

$ pnpm list --global --json --depth 0
[
  {
    "name": "global",
    "dependencies": {
      "eslint": {
        "from": "eslint",
        "version": "9.15.0"
      },
      "typescript": {
        "from": "typescript",
        "version": "5.6.3"
      }
    }
  }
]
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

pnpm outdated exits with code 1 when it finds outdated packages, but writes the report to <stdout> and leaves <stderr> empty. Passing must_succeed keeps the lenient failure gate that tolerates a non-zero exit with an empty <stderr> as a benign status code, so the call does not raise (see meta_package_manager.execution.CLIExecutor.run()).

$ pnpm outdated --global --json
{
  "eslint": {
    "current": "9.10.0",
    "latest": "9.15.0",
    "wanted": "9.15.0",
    "isDeprecated": false,
    "dependencyType": "dependencies"
  }
}
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

pnpm queries the registry’s /-/v1/search endpoint and, with --json, emits an array of the matched packages (an empty [] when none match).

Caution

Search does not support exact matching: the registry endpoint matches on names, descriptions and keywords, so the framework refilters the raw results for exact queries.

$ pnpm search --json is-positive
[
  {
    "name": "is-positive",
    "version": "3.1.0",
    "description": "Check if something is a positive number",
    "date": "2017-10-24T15:24:08.180Z",
    "maintainers": [
      {
        "username": "sindresorhus"
      }
    ]
  }
]
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ pnpm add --global markdown
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all packages.

$ pnpm update --global --latest
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the package provided as parameter.

$ pnpm update --global --latest markdown
Return type:

tuple[str, ...]

cli_names: tuple[str, ...] = ('pnpm',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'pnpm'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

remove(package_id)[source]ΒΆ

Remove one package.

$ pnpm remove --global markdown
Return type:

str

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

cleanup()[source]ΒΆ

Remove orphan packages from the global content-addressable store.

$ pnpm store prune
Return type:

None

meta_package_manager.managers.scoop moduleΒΆ

class meta_package_manager.managers.scoop.Scoop[source]ΒΆ

Bases: PackageManager

Scoop is a user-level command-line installer for Windows.

Apps unpack under ~/scoop without elevation, so no operation is marked sudo.

Documentation:

Note

The installed, outdated and search listings are column tables introduced by a --- separator line: mpm drops everything up to that separator, then splits each row positionally on whitespace.

Attention

scoop --version does not reliably print a clean version: it often emits the raw git log line of the checkout instead. The probe therefore carries fallbacks that recover the version from a tag: vX.Y.Z ref or a Bump to version commit subject. See Scoop’s own version-reporting issue.

Caution

remove uninstalls with --purge, so a package’s persisted data directory is deleted with it rather than kept for a later reinstall.

Initialize cli_errors list.

name: str = 'Scoop'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://scoop.sh'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='windows', name='Windows')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

requirement: str | None = '>=0.2.4'ΒΆ

Version requirement specifier.

Supports a comma-separated range of constraints (e.g. ">=1.20.0,<2.0.0"). A bare version string like "1.20.0" is treated as >=1.20.0.

Parsed by meta_package_manager.version.VersionRange.

Defaults to None, which deactivates version check entirely.

version_regexes: tuple[str, ...] = ('^v(?P<version>\\S+)\\s.+', '^.+,\\stag:\\sv(?P<version>\\S+),\\s.+', '^.+\\sBump\\sto\\sversion\\s(?P<version>\\S+)\\s.+')ΒΆ

Search version at the start of a line.

> scoop --version
Current Scoop version:
v0.2.4 - Released at 2022-08-08

'main' bucket:
5a5b13b6c (HEAD -> master, origin/HEAD) oh-my-posh: Update to version 11.1.1

Attention

Scoop does not always provide a clean version string.

So we fallback on parsing various git log output:

> scoop --version
Current Scoop version:
b588a06e (HEAD -> master, tag: v0.5.3, origin/master, origin/HEAD) Bump 0.5.3

'main' bucket:
46c50c6b0 (HEAD -> master, origin/master, origin/HEAD) fix arm64 version
> scoop --version
Current Scoop version:
b588a06e chore(release): Bump to version 0.5.3 (resync) (#6436)

'main' bucket:
46c50c6b0 aqua: fix arm64 version (#7071)
static remove_headers(text)[source]ΒΆ
Return type:

str

property installed: Iterator[Package]ΒΆ

Fetch installed packages.

>  scoop list
Installed apps:

Name   Version          Source Updated             Info
----   -------          ------ -------             ----
7zip   22.01            main   2022-09-27 08:03:30
dark   3.11.2           main   2022-09-27 08:04:26
git    2.37.3.windows.1 main   2022-09-27 08:03:58
python 3.10.7           main   2022-09-27 08:04:53
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

> scoop status
Name           Installed Version Latest Version Missing Dependencies Info
----           ----------------- -------------- -------------------- ----
demulshooter   16.7.2            18.7.3
eduke32        20220611-10112    20220709-10115
Teracopy-np
yuzu-pineapple EA-2804           EA-2830
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Caution

Search does not support extended or exact matching. So we return the best subset of results and let meta_package_manager.manager.PackageManager.refiltered_search() refine them.

> scoop search zip
Results from local buckets...

Name             Version         Source Binaries
----             -------         ------ --------
7zip             22.01           main
7zip19.00-helper 19.00           main
busybox          4716-g31467ddfc main   bunzip2 | gunzip | gzip | unzip
bzip2            1.0.8.0         main
gow              0.8.0           main   bunzip2.exe | bzip2.exe | zip.exe
gzip             1.3.12          main
lzip             1.20            main
unzip            6.00            main
zip              3.0             main
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

> scoop install 7zip
Installing '7zip' (22.01) [64bit] from main bucket
7z2201-x64.msi (1.8 MB) [====================] 100%
Checking hash of 7z2201-x64.msi ... ok.
Extracting 7z2201-x64.msi ... done.
Linking ~\scoopppszip\current => ~\scoopppszip.01
Creating shim for '7z'.
Creating shortcut for 7-Zip (7zFM.exe)
Persisting Codecs
Persisting Formats
Running post_install script...
'7zip' (22.01) was installed successfully!

Notes
-----
Add 7-Zip as a context menu by running: "C:\scoop\...install-context.reg"
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all outdated packages.

> scoop update --all
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the provided package.

> scoop update 7zip
Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Remove one package.

> scoop uninstall 7zip --purge
Uninstalling '7zip' (22.01).
Removing shim '7z.shim'.
Removing shim '7z.exe'.
Removing shortcut ~\AppData\Roaming\Scoop Apps-Zip.lnk
Unlinking ~\scoopppszip\current
'7zip' was uninstalled.
Return type:

str

sync()[source]ΒΆ

Sync package metadata.

> scoop status
WARN  Scoop out of date. Run 'scoop update' to get the latest changes.
> scoop update
Updating Scoop...
Updating 'main' bucket...
Converting 'main' bucket to git repo...
Checking repo... OK
The main bucket was added successfully.
Scoop was updated successfully!
> scoop status
Scoop is up to date.
Everything is ok!
Return type:

None

cleanup()[source]ΒΆ

Removes things we don’t need anymore.

> scoop cleanup --all --cache
Everything is shiny now!
Return type:

None

cli_names: tuple[str, ...] = ('scoop',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'scoop'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

meta_package_manager.managers.sdkman moduleΒΆ

class meta_package_manager.managers.sdkman.SDKMAN[source]ΒΆ

Bases: PackageManager

SDKMAN! manages parallel versions of multiple Software Development Kits on Unix-based systems.

Note

SDKMAN! primarily serves the JVM ecosystem: Java, Gradle, Maven, Kotlin, Scala, and ~115 other candidates. Each candidate is treated as a package.

Caution

The sdk command is a shell function, not a standalone binary, so mpm detects SDKMAN by its init script (sdkman-init.sh) rather than a binary on PATH and wraps every invocation in bash -c 'source <init> && sdk <args>'.

Note

SDKMAN has no read-only β€œoutdated” verb, so outdated pipes n into sdk upgrade to capture the candidate list without applying any upgrade.

Initialize cli_errors list.

homepage_url: str | None = 'https://sdkman.io'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='debian', name='Debian'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='macos', name='macOS'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

requirement: str | None = '>=5.0.0'ΒΆ

Version requirement specifier.

Supports a comma-separated range of constraints (e.g. ">=1.20.0,<2.0.0"). A bare version string like "1.20.0" is treated as >=1.20.0.

Parsed by meta_package_manager.version.VersionRange.

Defaults to None, which deactivates version check entirely.

cli_names: tuple[str, ...] = ('sdkman-init.sh',)ΒΆ

Detect SDKMAN by the presence of its init script.

cli_search_path: tuple[str, ...] = ('/home/runner/.sdkman/bin',)ΒΆ

List of additional path to help mpm hunt down the package manager CLI.

Must be a list of strings whose order dictates the search sequence.

Most of the time unnecessary: meta_package_manager.manager.PackageManager.cli_path() works well on all platforms.

extra_env: ClassVar = {'sdkman_auto_answer': 'true', 'sdkman_colour_enable': 'false'}ΒΆ

Disable ANSI colors and auto-accept interactive prompts.

version_cli_options: tuple[str, ...] = ('version',)ΒΆ

CLI options used to produce the version of the package manager.

The raw output produced by the package manager CLI will be parsed with the version_regexes below to extract the version number.

version_regexes: tuple[str, ...] = ('script:\\s+(?P<version>\\S+)',)ΒΆ
$ sdk version
SDKMAN!
script: 5.18.2
native: 0.4.6
build_cli(*args, **kwargs)[source]ΒΆ

Wrap all CLI invocations to source the SDKMAN init script in bash.

Note

The **kwargs accepted by the base class (auto_pre_args, sudo, etc.) are accepted but ignored because every invocation goes through the bash -c wrapper and SDKMAN never requires elevated privileges.

Return type:

tuple[str, ...]

property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ sdk current
Using:
groovy: 4.0.22
java: 21.0.4-tem
scala: 3.4.2
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ echo n | sdk upgrade
Available defaults:
gradle (local: 2.3, 1.11; default: 8.9)
java (local: 21.0.4-tem; default: 25.0.2-tem)

Use prescribed default version(s)? (Y/n):

Note

Pipes n to sdk upgrade to obtain the outdated list without actually performing the upgrade. Overrides sdkman_auto_answer to false so the command prints the candidate list before prompting.

install(package_id, version=None)[source]ΒΆ

Install one package.

$ sdk install java 21.0.4-tem
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all packages.

$ sdk upgrade
Return type:

tuple[str, ...]

id: str = 'sdkman'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

name: str = 'SDKMAN'ΒΆ

Return package manager’s common name.

Default value is based on class name.

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade one package.

$ sdk upgrade java
Return type:

tuple[str, ...]

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

remove(package_id)[source]ΒΆ

Remove one package.

SDKMAN’s uninstall command requires both the candidate and a specific version. The currently installed version is looked up from installed() and passed to the CLI.

$ sdk uninstall java 21.0.4-tem
Return type:

str

sync()[source]ΒΆ

Sync package metadata.

$ sdk update
Return type:

None

cleanup()[source]ΒΆ

Clear SDKMAN caches.

$ sdk flush
Return type:

None

meta_package_manager.managers.sfsu moduleΒΆ

class meta_package_manager.managers.sfsu.SFSU[source]ΒΆ

Bases: PackageManager

sfsu (Scoop For Speed and Usability) is a Rust reimplementation of Scoop’s slower read paths, working against the same buckets and ~/scoop install tree.

mpm reaches for sfsu only where it is both faster than Scoop and speaks JSON: installed, outdated and search all pass --json and are parsed as structured objects instead of the whitespace tables Scoop prints.

Note

sfsu implements no mutating verbs, so install, remove and both upgrade commands are bound straight to Scoop through the Delegate descriptor: those operations run the scoop binary, and a host with sfsu but no Scoop cannot mutate anything.

Initialize cli_errors list.

name: str = 'Scoop sfsu'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://github.com/winpax/sfsu'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='windows', name='Windows')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

requirement: str | None = '>=1.16.0'ΒΆ

Version requirement specifier.

Supports a comma-separated range of constraints (e.g. ">=1.20.0,<2.0.0"). A bare version string like "1.20.0" is treated as >=1.20.0.

Parsed by meta_package_manager.version.VersionRange.

Defaults to None, which deactivates version check entirely.

post_args: tuple[str, ...] = ('--no-color',)ΒΆ

Global list of options used before and after the invoked package manager CLI.

Automatically added to each meta_package_manager.manager.PackageManager.run_cli() call.

Essentially used to force silencing, low verbosity or no-color output.

version_regexes: tuple[str, ...] = ('sfsu\\s+(?P<version>\\S+)',)ΒΆ
> sfsu --version
sfsu 1.17.2
sprinkles 0.22.0 (crates.io published version)
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

> sfsu list --json
[
  {
    "name": "7zip",
    "version": "26.00",
    "source": "main",
    "updated": "2026-03-18 17:54:32",
    "notes": ""
  },
  {
    "name": "git",
    "version": "2.53.0.3",
    "source": "main",
    "updated": "2026-03-15 09:12:04",
    "notes": ""
  }
]
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

Uses sfsu status --only apps --json which returns packages with available updates.

> sfsu status --only apps --json
{
  "packages": [
    {
      "name": "git",
      "current": "2.53.0.2",
      "available": "2.53.0.3",
      "missing_dependencies": [],
      "info": null
    }
  ]
}
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Caution

Search does not support extended or exact matching. Results are refiltered by meta_package_manager.manager.PackageManager.refiltered_search().

> sfsu search --json git
{
  "main": [
    {
      "name": "git",
      "bucket": "main",
      "version": "2.53.0.3",
      "installed": true,
      "bins": []
    },
    ...
  ],
  ...
}
Return type:

Iterator[Package]

installΒΆ

Install one package.

> scoop install 7zip
Installing '7zip' (22.01) [64bit] from main bucket
7z2201-x64.msi (1.8 MB) [====================] 100%
Checking hash of 7z2201-x64.msi ... ok.
Extracting 7z2201-x64.msi ... done.
Linking ~\scoopppszip\current => ~\scoopppszip.01
Creating shim for '7z'.
Creating shortcut for 7-Zip (7zFM.exe)
Persisting Codecs
Persisting Formats
Running post_install script...
'7zip' (22.01) was installed successfully!

Notes
-----
Add 7-Zip as a context menu by running: "C:\scoop\...install-context.reg"
upgrade_all_cliΒΆ

Generates the CLI to upgrade all outdated packages.

> scoop update --all
upgrade_one_cliΒΆ

Generates the CLI to upgrade the provided package.

> scoop update 7zip
removeΒΆ

Remove one package.

> scoop uninstall 7zip --purge
Uninstalling '7zip' (22.01).
Removing shim '7z.shim'.
Removing shim '7z.exe'.
Removing shortcut ~\AppData\Roaming\Scoop Apps-Zip.lnk
Unlinking ~\scoopppszip\current
'7zip' was uninstalled.
sync()[source]ΒΆ

Sync package metadata.

Uses sfsu’s native update command which updates Scoop and all buckets.

> sfsu update --no-color
Return type:

None

cleanup()[source]ΒΆ

Removes old versions of all installed apps and clears the cache.

> sfsu cleanup --all --cache --no-color
Return type:

None

cli_names: tuple[str, ...] = ('sfsu',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'sfsu'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

meta_package_manager.managers.snap moduleΒΆ

class meta_package_manager.managers.snap.Snap[source]ΒΆ

Bases: PackageManager

Canonical’s snap installs sandboxed, self-updating packages.

snaps refresh themselves on a schedule, so upgrade merely forces a snap refresh sooner. No operation is marked sudo: the snapd daemon performs the privileged work.

Note

snap localizes and colorizes its table headers with no terminal detection. mpm pins nothing to English: --color=never strips the ANSI, the header row is dropped, and every row is split on whitespace and read by column position, so the translated headers never reach the parser.

Note

snap refresh --list reports only the available version, so outdated looks each installed version up by ID from the cached installed set. search runs snap find, which matches summaries as well as names, so mpm refilters the results.

Initialize cli_errors list.

homepage_url: str | None = 'https://snapcraft.io'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='aix', name='IBM AIX'), Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='cygwin', name='Cygwin'), Platform(id='debian', name='Debian'), Platform(id='dragonfly_bsd', name='DragonFly BSD'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='freebsd', name='FreeBSD'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='haiku', name='Haiku'), Platform(id='hurd', name='GNU/Hurd'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='illumos', name='illumos'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='midnightbsd', name='MidnightBSD'), Platform(id='netbsd', name='NetBSD'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='openbsd', name='OpenBSD'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='os400', name='IBM i'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='solaris', name='Solaris'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='sunos', name='SunOS'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

requirement: str | None = '>=2.0.0'ΒΆ

Version requirement specifier.

Supports a comma-separated range of constraints (e.g. ">=1.20.0,<2.0.0"). A bare version string like "1.20.0" is treated as >=1.20.0.

Parsed by meta_package_manager.version.VersionRange.

Defaults to None, which deactivates version check entirely.

post_args: tuple[str, ...] = ('--color=never',)ΒΆ

Global list of options used before and after the invoked package manager CLI.

Automatically added to each meta_package_manager.manager.PackageManager.run_cli() call.

Essentially used to force silencing, low verbosity or no-color output.

version_regexes: tuple[str, ...] = ('snap\\s+(?P<version>\\S+)',)ΒΆ
$ snap --version
snap       2.44.1
snapd      2.44.1
series     16
linuxmint  19.3
kernel     4.15.0-91-generic
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ snap list --color=never
Name    Version    Rev   Aufzeichnung   Herausgeber     Hinweise
core    16-2.44.1  8935  latest/stable  canonicalβœ“      core
wechat  2.0        7     latest/stable  ubuntu-dawndiy  -
pdftk   2.02-4     9     latest/stable  smoser          -
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ snap refresh --list --color=never
Name            Version  Rev  Herausgeber     Hinweise
standard-notes  3.3.5    8    standardnotesβœ“  -
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Caution

Search is extended by default. So we return the best subset of results and let meta_package_manager.manager.PackageManager.refiltered_search() refine them.

$ snap find doc --color=never
Name       Version      Herausgeber  Hinweise  Zusammenfassung
journey    2.14.3       2appstudio   -         Your private diary.
nextcloud  17.0.5snap1  nextcloudβœ“   -         Nextcloud Server
skype      8.58.0.93    skypeβœ“       classic   One Skype for all.
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ snap install standard-notes --color=never
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all outdated packages.

$ snap refresh --color=never
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the provided package.

$ snap refresh standard-notes --color=never
Return type:

tuple[str, ...]

cli_names: tuple[str, ...] = ('snap',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'snap'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

name: str = 'Snap'ΒΆ

Return package manager’s common name.

Default value is based on class name.

remove(package_id)[source]ΒΆ

Remove one package.

$ snap remove standard-notes --color=never
Return type:

str

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

meta_package_manager.managers.sun_tools moduleΒΆ

class meta_package_manager.managers.sun_tools.Sun_Tools[source]ΒΆ

Bases: PackageManager

Solaris’ legacy System V Release 4 packaging tools.

Documentation:

The suite spans several binaries: pkginfo (the read-only query tool, used as the main CLI), pkgadd and pkgrm.

Note

SVR4 packages come from local media or datastream files, not a network repository: there is no catalog to search, refresh or diff against, and pkgadd installs a specific local artifact rather than resolving a name. Only installed and remove are therefore implemented; Solaris 11’s modern repository-based interface is IPS (pkg), a different manager.

Initialize cli_errors list.

name: str = 'Solaris SVR4 package tools'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://docs.oracle.com/cd/E86824_01/html/E54763/pkginfo-1.html'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='solaris', name='Solaris')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

default_sudo: bool = TrueΒΆ

Built-in escalation default, used when sudo is None.

False on the base: most managers install into user-writable trees and never need root. The system package managers whose privileged operations require root (apt, dnf, pacman, zypper, …) set this to True so their build_cli(..., sudo=True) operations escalate out of the box, while staying switchable off through sudo (--no-sudo or config) for rootless setups.

cli_names: tuple[str, ...] = ('pkginfo',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

cli_search_path: tuple[str, ...] = ('/usr/sbin',)ΒΆ

List of additional path to help mpm hunt down the package manager CLI.

Must be a list of strings whose order dictates the search sequence.

Most of the time unnecessary: meta_package_manager.manager.PackageManager.cli_path() works well on all platforms.

version_cli: str | None = 'uname'ΒΆ

None of the SVR4 tools has a version flag: pkginfo -v matches a package version and pkgadd/pkgrm only take -v as verbose. The suite ships with the base system, so its version is the OS release reported by uname -r (5.11 on Solaris 11).

version_cli_options: tuple[str, ...] = ('-r',)ΒΆ

CLI options used to produce the version of the package manager.

The raw output produced by the package manager CLI will be parsed with the version_regexes below to extract the version number.

version_regexes: tuple[str, ...] = ('(?P<version>[\\d.]+)',)ΒΆ
$ uname -r
5.11
id: str = 'sun-tools'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

property installed: Iterator[Package]ΒΆ

Fetch installed packages.

Plain pkginfo prints no version column (only category, package instance and name), so the long -l listing is parsed instead: each package is a multi-line block carrying PKGINST:, VERSION: and STATUS: fields. Only completely-installed packages are yielded.

$ pkginfo -l
  PKGINST:  SUNWcar
      NAME:  Core Architecture, (Root)
  CATEGORY:  system
      ARCH:  i386.i86pc
   VERSION:  11.10.0,REV=2005.01.21.16.34
   BASEDIR:  /
    VENDOR:  Oracle Corporation
    STATUS:  completely installed
virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

remove(package_id)[source]ΒΆ

Remove one package.

-n runs non-interactively: pkgrm exits instead of prompting, so a removal requiring interaction (like a dependency confirmation) fails fast rather than hanging mpm’s subprocess.

$ sudo pkgrm -n SUNWzlib
Return type:

str

meta_package_manager.managers.tazpkg moduleΒΆ

class meta_package_manager.managers.tazpkg.Tazpkg[source]ΒΆ

Bases: PackageManager

SliTaz GNU/Linux’s package manager.

Documentation:

Note

tazpkg decorates every listing with localized, colorized titles, separators and count footers, with no terminal detection: LC_ALL=C pins the text to English, --output=raw switches the decorations to plain text, and any remaining ANSI sequence is stripped before parsing. Data rows are then matched by their digit-led version column, which no decoration line carries.

Note

No outdated operation: tazpkg up --check requires root and recharges the package lists from the mirror even when only listing, so there is no cleanly read-only upgradable listing.

Initialize cli_errors list.

name: str = 'TazPkg'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://slitaz.org'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='slitaz', name='SliTaz GNU/Linux')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

default_sudo: bool = TrueΒΆ

Built-in escalation default, used when sudo is None.

False on the base: most managers install into user-writable trees and never need root. The system package managers whose privileged operations require root (apt, dnf, pacman, zypper, …) set this to True so their build_cli(..., sudo=True) operations escalate out of the box, while staying switchable off through sudo (--no-sudo or config) for rootless setups.

extra_env: ClassVar = {'LC_ALL': 'C'}ΒΆ

Additional environment variables to add to the current context.

Automatically applied on each meta_package_manager.manager.PackageManager.run_cli() calls.

post_args: tuple[str, ...] = ('--output=raw',)ΒΆ

Global list of options used before and after the invoked package manager CLI.

Automatically added to each meta_package_manager.manager.PackageManager.run_cli() call.

Essentially used to force silencing, low verbosity or no-color output.

version_cli: str | None = 'awk'ΒΆ

tazpkg has no version command at all: its own version only exists as the tazpkg row of the installed-packages database. This probe mirrors, verbatim, how tazpkg resolves its VERSION variable for itself:

export VERSION=$(awk -F$'\t' '$1=="tazpkg"{print $2}' \
    "$PKGS_DB/installed.info")
version_cli_options: tuple[str, ...] = ('-F\t', '$1=="tazpkg"{print $2}', '/var/lib/tazpkg/installed.info')ΒΆ

CLI options used to produce the version of the package manager.

The raw output produced by the package manager CLI will be parsed with the version_regexes below to extract the version number.

version_regexes: tuple[str, ...] = ('^(?P<version>[\\d.]+)$',)ΒΆ

A bare integer Mercurial revision on cooking releases (944) or a dotted version on stable ones (4.9.2).

property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ tazpkg list --output=raw
List of all installed packages
================================================================================
busybox                            1.36.0            base-system
nano                               6.2               editors
================================================================================
2 packages installed.
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

tazpkg matches the query as a case-insensitive substring of name-version, over installed then mirrored packages.

$ tazpkg search nano --output=raw
Installed packages
--------------------------------------------------------------------------------
nano                    6.2               editors
--------------------------------------------------------------------------------
1 installed package found for: nano
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package from the mirror.

--forced skips the already-installed guard, keeping the call non-interactive.

$ sudo tazpkg get-install nano --forced --output=raw
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all packages.

-i (no long form) auto-confirms, upgrading every outdated package; the command recharges the package lists first.

$ sudo tazpkg up -i --output=raw
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade one package.

tazpkg has no per-package upgrade verb: its own upgrade loop re-runs get-install --forced on each outdated package.

$ sudo tazpkg get-install nano --forced --output=raw
Return type:

tuple[str, ...]

cli_names: tuple[str, ...] = ('tazpkg',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'tazpkg'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

remove(package_id)[source]ΒΆ

Remove one package.

No --auto on purpose: it would also auto-confirm the β€œremove dependents?” follow-up and cascade. On a non-terminal stdout (mpm’s subprocess pipe) the (y/N) prompt is skipped and only the target package is removed.

$ sudo tazpkg remove nano --output=raw
Return type:

str

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

sync()[source]ΒΆ

Recharge the package lists from the mirror.

$ sudo tazpkg recharge --output=raw
Return type:

None

cleanup()[source]ΒΆ

Delete every downloaded package from the cache.

$ sudo tazpkg clean-cache --output=raw
Return type:

None

meta_package_manager.managers.uv moduleΒΆ

class meta_package_manager.managers.uv.UVBase[source]ΒΆ

Bases: PackageManager

Virtual base shared by the UV and UVX managers defined below.

Initialize cli_errors list.

homepage_url: str | None = 'https://docs.astral.sh/uv'ΒΆ

Home page of the project, only used in documentation for reference.

requirement: str | None = '>=0.5.0'ΒΆ

0.5.0 is the first version to introduce pip list --outdated command.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='aix', name='IBM AIX'), Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='cygwin', name='Cygwin'), Platform(id='debian', name='Debian'), Platform(id='dragonfly_bsd', name='DragonFly BSD'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='freebsd', name='FreeBSD'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='haiku', name='Haiku'), Platform(id='hurd', name='GNU/Hurd'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='illumos', name='illumos'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='macos', name='macOS'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='midnightbsd', name='MidnightBSD'), Platform(id='netbsd', name='NetBSD'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='openbsd', name='OpenBSD'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='os400', name='IBM i'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='solaris', name='Solaris'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='sunos', name='SunOS'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='windows', name='Windows'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

virtual: bool = TrueΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

cooldown_env_var: ClassVar[str | None] = 'UV_EXCLUDE_NEWER'ΒΆ

uv honors a release-age cooldown through its exclude-newer resolver option.

UV_EXCLUDE_NEWER mirrors the --exclude-newer flag and is read by every resolving subcommand (pip install, pip list --outdated, tool install, tool upgrade), so a single environment variable covers install, upgrade and outdated at once. uv accepts an RFC 3339 timestamp, which is exactly what the default meta_package_manager.execution.CLIExecutor.cooldown_env_value() produces.

See https://docs.astral.sh/uv/reference/settings/#exclude-newer.

pre_args: tuple[str, ...] = ('--color', 'never', '--no-progress')ΒΆ
  • --color color-choice

    Control colors in output [default: auto]

    Possible values: - auto: Enables colored output only when the output is going to a terminal or TTY with support - always: Enables colored output regardless of the detected environment - never: Disables colored output

  • --no-progress

    Hide all progress outputs.

    For example, spinners or progress bars.

version_regexes: tuple[str, ...] = ('uv\\s+(?P<version>\\S+)',)ΒΆ
$ uv --version
uv 0.2.21 (ebfe6d8fc 2024-07-03)
cli_names: tuple[str, ...] = ('uvbase',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'uvbase'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

name: str = 'UVBase'ΒΆ

Return package manager’s common name.

Default value is based on class name.

class meta_package_manager.managers.uv.UV[source]ΒΆ

Bases: UVBase

Python packages managed with uv’s uv pip interface.

Installed and outdated packages are read with uv pip list (adding --outdated and --format=json), acting on whatever environment uv resolves, exactly as a bare uv pip call in the same shell would. The --outdated listing sets the >=0.5.0 version floor, the first uv release to ship it. The release-age cooldown rides on uv’s --exclude-newer resolver option, which every resolving subcommand honors, so one cutoff covers install, upgrade and outdated together.

Hint

Package specs are passed unquoted, working around uv parse failures on quoted specs.

Initialize cli_errors list.

name: str = 'Python uv'ΒΆ

Return package manager’s common name.

Default value is based on class name.

property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ uv --color never --no-progress pip list --format=json
[
  {
    "name": "markupsafe",
    "version": "2.1.5"
  },
  {
    "name": "meta-package-manager",
    "version": "5.17.0",
    "editable_project_location": "/Users/kde/meta-package-manager"
  },
  {
    "name": "myst-parser",
    "version": "3.0.1"
  }
]
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ uv --color never --no-progress pip list --outdated --format=json
[
  {
    "name": "lark-parser",
    "version": "0.7.8",
    "latest_version": "0.12.0",
    "latest_filetype": "wheel"
  },
  {
    "name": "types-setuptools",
    "version": "75.3.0.20241107",
    "latest_version": "75.3.0.20241112",
    "latest_filetype": "wheel"
  }
]
install(package_id, version=None)[source]ΒΆ

Install one package.

$ uv --color never --no-progress pip install arrow
Return type:

str

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the package provided as parameter.

$ uv --color never --no-progress pip install --upgrade arrow
Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Remove one package.

$ uv --color never --no-progress pip uninstall arrow
Return type:

str

cleanup()[source]ΒΆ

Removes things we don’t need anymore.

$ uv --color never --no-progress cache clean
Clearing cache at: /Users/kde/Library/Caches/uv
Removed 97279 files (2.0GiB)
$ uv --color never --no-progress cache prune
No cache found at: /Users/kde/.cache/uv
Return type:

None

cli_names: tuple[str, ...] = ('uv',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'uv'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

class meta_package_manager.managers.uv.UVX[source]ΒΆ

Bases: UVBase

uv’s tool manager for isolated Python applications, like pipx.

mpm drives the uv tool subcommands; each application lives in its own venv. Installed and outdated tools are parsed from the plain-text tool list and tool list --outdated output: unlike the uv pip interface, uv tool emits no JSON. The --outdated listing sets the >=0.10.10 version floor, the first uv release to ship it. The release-age cooldown rides on uv’s --exclude-newer resolver option, covering install, upgrade and outdated through one cutoff.

Hint

Package specs are passed unquoted, working around uv parse failures on quoted specs.

Initialize cli_errors list.

name: str = 'Python uvx'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://docs.astral.sh/uv/guides/tools/'ΒΆ

Home page of the project, only used in documentation for reference.

brewfile_entry_type: ClassVar[str | None] = 'uv'ΒΆ

uv is mapped to Homebrew Bundle’s uv entry type, which installs via uv tool install β€” the same mechanism UVX wraps. The pip-style UV manager intentionally has no Brewfile mapping: its packages live inside a Python environment, not as top-level tools, so the semantics do not round-trip through brew bundle.

requirement: str | None = '>=0.10.10'ΒΆ

0.10.10 is the first version to introduce tool list --outdated command.

cli_names: tuple[str, ...] = ('uv',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'uvx'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ uv --color never --no-progress tool list
pycowsay v0.0.0.1
- pycowsay
virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ uv --color never --no-progress tool list --outdated
pycowsay v0.0.0.1 [latest: 0.0.0.2]
- pycowsay
install(package_id, version=None)[source]ΒΆ

Install one package.

$ uv --color never --no-progress tool install pycowsay
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all packages.

$ uv --color never --no-progress tool upgrade --all
Updated pycowsay v0.0.0.1 -> v0.0.0.2
    - pycowsay
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the package provided as parameter.

$ uv --color never --no-progress tool upgrade pycowsay
Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Remove one package.

$ uv --color never --no-progress tool uninstall pycowsay
Return type:

str

meta_package_manager.managers.winget moduleΒΆ

class meta_package_manager.managers.winget.WinGet[source]ΒΆ

Bases: PackageManager

Microsoft’s official Windows package manager.

mpm reads inventory from winget list --details, whose Key: Value blocks carry the installed version and an Available Upgrades section, and reads search from winget’s fixed-width column table.

Note

installed and outdated keep only rows whose Origin Source is winget, dropping packages winget merely tracks (sideloaded, portable or Microsoft Store). Store entries still surface in search, but their real version cannot be queried through winget, so mpm tags them with an msstore sentinel version and sorts them below winget-native ones.

Warning

Two Windows-only, process-level workarounds keep winget from taking the calling process down with it:

  • winget is spawned with DETACHED_PROCESS. Its COM server and installer children call GenerateConsoleCtrlEvent as they shut down, broadcasting a CTRL_C_EVENT to every process sharing their console: detaching removes winget from that console, so the signal never reaches the caller.

  • WindowsPackageManagerServer.exe is killed by image name after each call. This COM server is activated out-of-process, so it never inherits mpm’s pipes and is never reaped by communicate().

Initialize cli_errors list.

homepage_url: str | None = 'https://github.com/microsoft/winget-cli'ΒΆ

Home page of the project, only used in documentation for reference.

brewfile_entry_type: ClassVar[str | None] = 'winget'ΒΆ

Name of the Brewfile DSL entry type this manager maps to, or None if the manager has no Brewfile equivalent.

Set by the subset of managers covered by Homebrew Bundle’s DSL (brew, cask, mas, vscode, npm, cargo, uv, winget, flatpak). Consumed by meta_package_manager.brewfile when rendering the output of mpm dump --brewfile.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='windows', name='Windows')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

requirement: str | None = '>=1.28.190'ΒΆ

Version requirement specifier.

Supports a comma-separated range of constraints (e.g. ">=1.20.0,<2.0.0"). A bare version string like "1.20.0" is treated as >=1.20.0.

Parsed by meta_package_manager.version.VersionRange.

Defaults to None, which deactivates version check entirely.

post_args: tuple[str, ...] = ('--accept-source-agreements', '--disable-interactivity')ΒΆ
--accept-source-agreements:

Used to accept the source license agreement, and avoid the following prompt:

PS C:\Users\kev> winget list
The "msstore' source requires that you view the following agreements before using.
Terms of Transaction: https://aka.ms/microsoft-store-terms-of-transaction
The source requires the current machine's 2-letter geographic region to be sent to the backend service to function prope rly (ex. "US").

Do you agree to all the source agreements terms?
[Y] Yes [N] No:
--disable-interactivity:

Disable interactive prompts.

version_regexes: tuple[str, ...] = ('v(?P<version>\\S+)',)ΒΆ
PS C:\Users\kev> winget --version
v1.28.220
windows_creation_flags: int = 0ΒΆ

Detach winget from the calling process’s console.

When winget runs, the Windows COM infrastructure activates WindowsPackageManagerServer.exe as a separate process. Installer EXEs launched by winget upgrade or winget install are also spawned as grandchildren. Both the COM server and any installer EXEs call GenerateConsoleCtrlEvent(0) during their own shutdown, which broadcasts a CTRL_C_EVENT to every process sharing the same console β€” including the Python test runner β€” causing it to exit with code 1 even after all tests pass.

DETACHED_PROCESS breaks the shared-console link: winget has no console, so neither the COM server nor any installer EXE can broadcast console events that reach us. Output is still captured because stdout and stderr are redirected to pipes, which are independent of console attachment.

windows_processes_to_cleanup: tuple[str, ...] = ('WindowsPackageManagerServer.exe',)ΒΆ

Kill winget’s COM server after each call.

WindowsPackageManagerServer.exe is activated by the Windows COM infrastructure when winget runs, not as a direct child process. It therefore does not inherit our pipe handles and is not reaped by communicate(). Kill it by image name after each call to avoid accumulating orphan COM server processes.

property installed: Iterator[Package]ΒΆ

Fetch installed packages.

PS C:\Users\kev> winget list --details --accept-source-agreements --disable-interactivity
(1/7) CCleaner [CCleaner]
Version: 6.08
Publisher: Piriform Software Ltd
Local Identifier: ARP\Machine\X64\CCleaner
Product Code: CCleaner
Installer Category: exe
Installed Scope: Machine
Installed Architecture: X64
Installed Locale: en-US
Origin Source: winget
Available Upgrades:

(2/7) Git [Git.Git]
Version: 2.37.3
Publisher: The Git Development Community
Origin Source: winget

Only returns packages with Origin Source: winget to exclude packages installed via other sources (e.g., sideload, portable).

property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

PS C:\Users\kev> winget list --upgrade-available --details --accept-source-agreements --disable-interactivity
(1/4) Git [Git.Git]
Version: 2.37.3
Publisher: The Git Development Community
Origin Source: winget
Available Upgrades:
  winget [2.45.1]

(2/4) Microsoft Edge [Microsoft.Edge]
Version: 109.0.1518.70
Publisher: Microsoft
Origin Source: winget
Available Upgrades:
  winget [125.0.2535.51]

Only returns packages with Origin Source: winget to exclude packages installed via other sources (e.g., sideload, portable).

search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

PS C:\Users\kev> winget search --query vscode --accept-source-agreements --disable-interactivity
Name                             Id                               Version      Match               Source
---------------------------------------------------------------------------------------------------------
Microsoft Visual Studio Code     Microsoft.VisualStudioCode       1.89.1       Moniker: vscode     winget
MrCode                           zokugun.MrCode                   1.82.0.23253 Tag: vscode         winget
VSCodium Insiders                VSCodium.VSCodium.Insiders       1.88.0.24095 Tag: vscode         winget
VSCodium                         VSCodium.VSCodium                1.89.1.24130 Tag: vscode         winget
Upgit                            pluveto.Upgit                    0.2.18       Tag: vscode         winget
vscli                            michidk.vscli                    0.3.0        Tag: vscode         winget
Huawei QuickApp IDE              Huawei.QuickAppIde               14.0.1       Tag: vscode         winget
TheiaBlueprint                   EclipseFoundation.TheiaBlueprint 1.44.0       Tag: vscode         winget
Codium                           Alex313031.Codium                1.86.2.24053 Tag: vscode         winget
Cursor Editor                    CursorAI,Inc.Cursor              latest       Tag: vscode         winget
Microsoft Visual Studio Code CLI Microsoft.VisualStudioCode.CLI   1.89.1       Moniker: vscode-cli winget
PS C:\Users\kev> winget search --query vscode --exact --accept-source-agreements --disable-interactivity
Name                         Id                               Version      Match           Source
-------------------------------------------------------------------------------------------------
Microsoft Visual Studio Code Microsoft.VisualStudioCode       1.89.1       Moniker: vscode winget
MrCode                       zokugun.MrCode                   1.82.0.23253 Tag: vscode     winget
VSCodium Insiders            VSCodium.VSCodium.Insiders       1.88.0.24095 Tag: vscode     winget
VSCodium                     VSCodium.VSCodium                1.89.1.24130 Tag: vscode     winget
Upgit                        pluveto.Upgit                    0.2.18       Tag: vscode     winget
vscli                        michidk.vscli                    0.3.0        Tag: vscode     winget
Huawei QuickApp IDE          Huawei.QuickAppIde               14.0.1       Tag: vscode     winget
TheiaBlueprint               EclipseFoundation.TheiaBlueprint 1.44.0       Tag: vscode     winget
Codium                       Alex313031.Codium                1.86.2.24053 Tag: vscode     winget
Cursor Editor                CursorAI,Inc.Cursor              latest       Tag: vscode     winget
PS C:\Users\kev> winget search --id VSCodium.VSCodium --accept-source-agreements --disable-interactivity
Name              Id                         Version      Source
----------------------------------------------------------------
VSCodium Insiders VSCodium.VSCodium.Insiders 1.88.0.24095 winget
VSCodium          VSCodium.VSCodium          1.89.1.24130 winget
PS C:\Users\kev> winget search --name Codium --accept-source-agreements --disable-interactivity
Name              Id                         Version      Source
----------------------------------------------------------------
Codium            Alex313031.Codium          1.86.2.24053 winget
VSCodium Insiders VSCodium.VSCodium.Insiders 1.88.0.24095 winget
VSCodium          VSCodium.VSCodium          1.89.1.24130 winget
PS C:\Users\kev> winget search --id VSCodium.VSCodium  --exact --accept-source-agreements --disable-interactivity
Name     Id                Version      Source
----------------------------------------------
VSCodium VSCodium.VSCodium 1.89.1.24130 winget
PS C:\Users\kev> winget search --name Codium --exact --accept-source-agreements --disable-interactivity
Name   Id                Version      Source
--------------------------------------------
Codium Alex313031.Codium 1.86.2.24053 winget
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

PS C:\Users\kev> winget install --id Microsoft.PowerToys --accept-package-agreements --version 0.15.2 --accept-source-agreements --disable-interactivity
Found Power Toys [Microsoft.PowerToys] Version 0.15.2
This application is licensed to you by its owner.
Microsoft is not responsible for, nor does it grant any licenses to, third-party packages.
Successfully verified installer hash
Starting package install...
  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ  100%
Successfully installed
Return type:

str

cli_names: tuple[str, ...] = ('winget',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'winget'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

name: str = 'WinGet'ΒΆ

Return package manager’s common name.

Default value is based on class name.

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all outdated packages.

PS C:\Users\kev> winget upgrade --all --accept-package-agreements --accept-source-agreements --disable-interactivity
Name                            Id                            Version       Available     Source
------------------------------------------------------------------------------------------------
Microsoft Edge                  Microsoft.Edge                109.0.1518.70 125.0.2535.51 winget
Microsoft Edge WebView2 Runtime Microsoft.EdgeWebView2Runtime 109.0.1518.70 125.0.2535.51 winget
Python Launcher                 Python.Launchez               < 3.12.0      3.12.0        winget
Microsoft Visual C++ (x86)...   Microsoft.VCRedist.2015+.X86  14.34.31931.0 14.38.33135.0 winget
4 upgrades available.

Installing dependencies:
This package requires the following dependencies:
  - Packages
      Microsoft.UI.Xaml.2.8 [>= 8.2306.22001.0]
(1/3) Found Microsoft Edge WebView2 Runtime [Microsoft.EdgeWebView2Runtime] Version 125. 0.2535.51
This application is licensed to you by its owner.
Microsoft is not responsible for, nor does it grant any licenses to, third-party packages.
Downloading https://msedge.sf.dl.delivery.mp.microsoft.com/filestreamingservice/files/e5dd841e-17ff-43b7-a2c0-ff759f55c202/MicrosoftEdgeWebView2RuntimeInstallerARM64.exe
  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ  166 MB /  166 MB
Successfully verified installer hash
Starting package install...
Successfully installed

(...)
Return type:

tuple[str, ...]

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the provided package.

PS C:\Users\kev> winget upgrade --id Git.Git --accept-package-agreements --accept-source-agreements --disable-interactivity
Found Git [Git.Git] Version 2.45.1
This application is licensed to you by its owner.
Microsoft is not responsible for, nor does it grant any licenses to, third-party packages.
Downloading https://github.com/git-for-windows/git/releases/download/v2.45.1.windows.1/Git-2.45.1-64-bit.exe
  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ  64.7 MB / 64.7 MB
Successfully verified installer hash
Starting package install...
Successfully installed

Todo

Automatically uninstall the package if the technology is different:

PS C:\Users\kev> winget upgrade --id Microsoft.Edge
A newer version was found, but the install technology is different from the current version installed. Please uninstall the package and install the newer version.
Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Remove one package.

PS C:\Users\kev> winget uninstall --id Microsoft.PowerToys --source winget --accept-source-agreements --disable-interactivity
Found PowerToys (Preview) [Microsoft.PowerToys]
Starting package uninstall...
  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ  100%
Successfully uninstalled
Return type:

str

sync()[source]ΒΆ

Sync package metadata from remote sources.

PS C:\Users\kev> winget source update --accept-source-agreements --disable-interactivity
Return type:

None

meta_package_manager.managers.xbps moduleΒΆ

class meta_package_manager.managers.xbps.XBPS[source]ΒΆ

Bases: PackageManager

X Binary Package System used by Void Linux.

Note

XBPS is split across several sibling binaries: xbps-query for read-only operations, xbps-install for installs, sync and upgrades, and xbps-remove for uninstalls and cache cleanup. mpm resolves the siblings from the same directory as cli_path.

Initialize cli_errors list.

name: str = 'Void XBPS'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://github.com/void-linux/xbps'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='debian', name='Debian'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

default_sudo: bool = TrueΒΆ

Built-in escalation default, used when sudo is None.

False on the base: most managers install into user-writable trees and never need root. The system package managers whose privileged operations require root (apt, dnf, pacman, zypper, …) set this to True so their build_cli(..., sudo=True) operations escalate out of the box, while staying switchable off through sudo (--no-sudo or config) for rootless setups.

requirement: str | None = '>=0.59'ΒΆ

Version 0.59 is the first to ship the long-form options (--list-pkgs, --repository, --search, --update, --dry-run, --sync, --yes, --clean-cache, --remove-orphans) that the methods below depend on.

cli_names: tuple[str, ...] = ('xbps-install',)ΒΆ

Use xbps-install as the canonical entry point.

The other XBPS binaries (xbps-query, xbps-remove) are looked up in the same directory as xbps-install via cli_path.

property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ xbps-query --list-pkgs
ii base-files-0.144_1            Void Linux base system files
ii cmark-gfm-0.29.0.gfm.13_1     CommonMark parsing and rendering library
ii curl-8.5.0_1                  Command line tool for transferring data
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

Caution

Reads from the local repository cache. Run sync() first to refresh the index.

$ xbps-install --update --dry-run
firefox-120.0_1 update x86_64 https://repo-default.voidlinux.org/current 45MB 12MB
python3-3.11.6_2 update x86_64 https://repo-default.voidlinux.org/current 30MB 8MB
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Caution

xbps-query --search matches against pkgver and short_desc properties at the same time. Extended and exact matching are not supported, so the best subset of results is returned and refined later by meta_package_manager.manager.PackageManager.refiltered_search().

$ xbps-query --repository --search firefox
[-] firefox-120.0_1            Standalone web browser from mozilla.org
[*] firefox-esr-115.5.0_1      Extended support release of Firefox
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ sudo xbps-install --yes firefox
Return type:

str

id: str = 'xbps'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all packages.

$ sudo xbps-install --sync --update --yes
Return type:

tuple[str, ...]

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade one package.

$ sudo xbps-install --update --yes firefox
Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Remove one package, recursively dropping orphaned dependencies.

$ sudo xbps-remove --recursive --yes firefox
Return type:

str

sync()[source]ΒΆ

Synchronize remote repository indexes.

$ sudo xbps-install --sync --yes
Return type:

None

cleanup()[source]ΒΆ

Remove orphaned packages and clean the binary package cache.

$ sudo xbps-remove --remove-orphans --clean-cache --yes
Return type:

None

meta_package_manager.managers.yarn moduleΒΆ

class meta_package_manager.managers.yarn.Yarn[source]ΒΆ

Bases: PackageManager

Virtual base shared by Yarn Classic and Yarn Berry.

The two Yarn lines grew incompatible CLIs, so mpm models them as separate managers, YarnClassic and YarnBerry, both invoking the same yarn binary. The reported version decides which one is active: Classic claims the 1.x range, Berry 2.x and later. Only the shared cache-cleanup operation lives on this base.

Command equivalences with the sibling JS managers are listed at https://github.com/antfu-collective/ni?tab=readme-ov-file#ni.

Initialize cli_errors list.

homepage_url: str | None = 'https://yarnpkg.com'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='aix', name='IBM AIX'), Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='cygwin', name='Cygwin'), Platform(id='debian', name='Debian'), Platform(id='dragonfly_bsd', name='DragonFly BSD'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='freebsd', name='FreeBSD'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='haiku', name='Haiku'), Platform(id='hurd', name='GNU/Hurd'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='illumos', name='illumos'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='macos', name='macOS'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='midnightbsd', name='MidnightBSD'), Platform(id='netbsd', name='NetBSD'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='openbsd', name='OpenBSD'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='os400', name='IBM i'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='solaris', name='Solaris'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='sunos', name='SunOS'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='windows', name='Windows'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

virtual: bool = TrueΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

cleanup()[source]ΒΆ

Removes things we don’t need anymore.

See: https://yarnpkg.com/cli/cache/clean

$ yarn cache clean --all
yarn cache v1.22.19
success Cleared cache.
✨  Done in 0.35s.
Return type:

None

cli_names: tuple[str, ...] = ('yarn',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'yarn'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

name: str = 'Yarn'ΒΆ

Return package manager’s common name.

Default value is based on class name.

class meta_package_manager.managers.yarn.YarnClassic[source]ΒΆ

Bases: Yarn

Yarn Classic, the 1.x line.

mpm claims this class for any yarn binary reporting a 1.x version and drives it through the yarn global command family, so installs, upgrades and removals target the global prefix. Its --json output is a stream of one JSON object per line, not a single document, so every query is parsed line by line.

Warning

Yarn Classic has been in maintenance mode since January 2020, taking only critical and security patches. Yarn Berry (2.x and later) is the actively developed line but exposes a different CLI surface, so mpm handles it through a separate YarnBerry manager.

Note

Yarn has no dedicated search command by maintainer decision, so search is simulated with yarn info and only resolves exact package names.

Initialize cli_errors list.

id: str = 'yarn'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

name: str = 'Yarn Classic'ΒΆ

Return package manager’s common name.

Default value is based on class name.

requirement: str | None = '>=1.20.0,<2.0.0'ΒΆ

Version requirement specifier.

Supports a comma-separated range of constraints (e.g. ">=1.20.0,<2.0.0"). A bare version string like "1.20.0" is treated as >=1.20.0.

Parsed by meta_package_manager.version.VersionRange.

Defaults to None, which deactivates version check entirely.

cli_names: tuple[str, ...] = ('yarn',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

pre_args: tuple[str, ...] = ('--silent',)ΒΆ
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ yarn global --json list --depth 0
{"type":"activityStart","data":{"id":0}}
{"type":"activityTick","data":{"id":0,"name":"awesome-lint@^0.18.0"}}
{"type":"activityTick","data":{"id":0,"name":"arrify@^2.0.1"}}
{"type":"activityTick","data":{"id":0,"name":"case@^1.6.3"}}
{"type":"activityTick","data":{"id":0,"name":"emoji-regex@^9.2.0"}}
{"type":"activityEnd","data":{"id":0}}
{"type":"progressStart","data":{"id":0,"total":327}}
{"type":"progressTick","data":{"id":0,"current":1}}
{"type":"progressTick","data":{"id":0,"current":2}}
{"type":"progressTick","data":{"id":0,"current":3}}
{"type":"progressTick","data":{"id":0,"current":4}}
{"type":"progressTick","data":{"id":0,"current":5}}
{"type":"progressFinish","data":{"id":0}}
{"type":"info","data":""awesome-lint@0.18.0" has binaries:"}
{"type":"list","data":{"type":"bins-awesome-lint","items":["awesome-lint"]}}
$ yarn global list --depth 0
yarn global v1.22.19
info "awesome-lint@0.18.0" has binaries:
   - awesome-lint
✨  Done in 0.13s.
property global_dir: strΒΆ

Locate the global directory.

$ yarn global dir
~/.config/yarn/global
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

Yarn emits its --json output as a stream of one JSON object per line (the sample below elides the info color-legend object; the human-readable transcript further down shows it):

$ yarn --json outdated --cwd ~/.config/yarn/global
{"type":"warning","data":"package.json: No license field"}
{"type":"table","data":{"head":["Package","Current","Wanted","Latest","Package Type","URL"],"body":[["markdown","0.4.0","0.4.0","0.5.0","dependencies","git://github.com/evilstreak/markdown-js.git"]]}}
$ yarn outdated --cwd ~/.config/yarn/global
yarn outdated v1.22.19
warning package.json: No license field
info Color legend :
"<red>"    : Major Update backward-incompatible updates
"<yellow>" : Minor Update backward-compatible features
"<green>"  : Patch Update backward-compatible bug fixes
Package  Current Wanted Latest Package Type URL
markdown 0.4.0   0.4.0  0.5.0  dependencies git://github.com/.../md-js.git
✨  Done in 0.95s.
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Warning

Yarn maintainers have decided to not implement a dedicated search command.

Search is simulated by a direct call to yarn info, and as a result only works for exact match.

$ yarn --json info python | jq
{
  "type": "inspect",
  "data": {
    "name": "python",
    "description": "Interact with python child process",
    "dist-tags": {
      "latest": "0.0.4"
    },
    "versions": [
      "0.0.0",
      "0.0.1",
      "0.0.2",
      "0.0.3",
      "0.0.4"
    ],
    "maintainers": [
      {
        "name": "drderidder",
        "email": "drderidder@gmail.com"
      }
    ],
    "time": {
      "modified": "2017-09-16T05:26:13.151Z",
      "created": "2011-07-11T01:59:04.362Z",
      "0.0.0": "2011-07-11T01:59:05.137Z",
      "0.0.1": "2011-07-17T05:23:33.166Z",
      "0.0.2": "2011-07-20T03:42:50.379Z",
      "0.0.3": "2014-06-08T00:39:08.562Z",
      "0.0.4": "2015-01-25T02:48:07.820Z"
    },
    "author": {
      "name": "Darren DeRidder"
    },
    "repository": {
      "type": "git",
      "url": "git://github.com/73rhodes/node-python.git"
    },
    "homepage": "https://github.com/73rhodes/node-python",
    "bugs": {
      "url": "https://github.com/73rhodes/node-python/issues"
    },
    "readmeFilename": "README.md",
    "users": {
      "dewang-mistry": true,
      "goliatone": true,
      "sapanbhuta": true,
      "aditcmarix": true,
      "imlucas": true,
      "heyderpd": true,
      "ukuli": true,
      "chbardel": true,
      "asaupup": true,
      "nuwaio": true
    },
    "version": "0.0.4",
    "main": "./lib/python.js",
    "engines": {
      "node": ">= 0.4.1"
    },
    "gitHead": "69754aaa57658193916a1bf5fc391198098f74f6",
    "scripts": {},
    "dist": {
      "shasum": "3094e898ef17a33aa9c3e973b3848a38e47d1818",
      "tarball": "https://registry.npmjs.org/python/-/python-1.tgz"
    },
    "directories": {}
  }
}
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ yarn --silent global add awesome-lint
yarn global v1.22.19
[1/4] πŸ”  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] πŸ”—  Linking dependencies...
[4/4] πŸ”¨  Building fresh packages...

success Installed "awesome-lint@0.18.0" with binaries:
    - awesome-lint
✨  Done in 16.15s.
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all outdated packages.

$ yarn --silent global upgrade --latest
yarn global v1.22.19
[1/4] πŸ”  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] πŸ”—  Linking dependencies...
[4/4] πŸ”¨  Rebuilding all packages...
success Saved lockfile.
success Saved 271 new dependencies.
info Direct dependencies
β”œβ”€ awesome-lint@0.18.0
└─ markdown@0.5.0
info All dependencies
β”œβ”€ @babel/code-frame@7.18.6
β”œβ”€ @babel/helper-validator-identifier@7.18.6
β”œβ”€ @nodelib/fs.scandir@2.1.5
β”œβ”€ array-to-sentence@1.1.0
β”œβ”€ array-union@2.1.0
β”œβ”€ awesome-lint@0.18.0
β”œβ”€ fs.realpath@1.0.0
(...)
└─ zwitch@1.0.5
✨  Done in 19.89s.
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the provided package.

$ yarn --silent global upgrade markdown --latest
yarn global v1.22.19
[1/4] πŸ”  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] πŸ”—  Linking dependencies...
[4/4] πŸ”¨  Rebuilding all packages...
success Saved lockfile.
success Saved 2 new dependencies.
info Direct dependencies
└─ markdown@0.5.0
info All dependencies
β”œβ”€ markdown@0.5.0
└─ nopt@2.1.2
✨  Done in 1.77s.
Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Remove one package.

$ yarn --silent global remove awesome-lint
yarn global v1.22.19
[1/2] πŸ—‘  Removing module awesome-lint...
[2/2] πŸ”¨  Regenerating lockfile and installing missing dependencies...
success Uninstalled packages.
✨  Done in 0.21s.
Return type:

str

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

class meta_package_manager.managers.yarn.YarnBerry[source]ΒΆ

Bases: Yarn

Yarn Berry, the 2.x and later line.

mpm claims this class for any yarn binary reporting a 2.x or newer version.

Warning

Yarn Berry removed the yarn global command family entirely: it has no notion of globally installed packages. Only search is available, while installed, outdated, install, upgrade and remove are all unsupported.

Note

search is simulated with yarn npm info and only resolves exact package names.

Initialize cli_errors list.

id: str = 'yarn-berry'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

name: str = 'Yarn Berry'ΒΆ

Return package manager’s common name.

Default value is based on class name.

requirement: str | None = '>=2.0.0'ΒΆ

Version requirement specifier.

Supports a comma-separated range of constraints (e.g. ">=1.20.0,<2.0.0"). A bare version string like "1.20.0" is treated as >=1.20.0.

Parsed by meta_package_manager.version.VersionRange.

Defaults to None, which deactivates version check entirely.

cli_names: tuple[str, ...] = ('yarn',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

Warning

Search is simulated by a direct call to yarn npm info, and as a result only works for exact match.

$ yarn npm info python --json | jq
{
  "name": "python",
  "description": "Interact with python child process",
  "dist-tags": {
    "latest": "0.0.4"
  },
  "versions": [
    "0.0.0",
    "0.0.1",
    "0.0.2",
    "0.0.3",
    "0.0.4"
  ],
  "version": "0.0.4",
  (...)
}
Return type:

Iterator[Package]

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

meta_package_manager.managers.zypper moduleΒΆ

class meta_package_manager.managers.zypper.Zypper[source]ΒΆ

Bases: PackageManager

openSUSE’s package manager.

mpm drives zypper in XML mode (--xmlout) and parses the result with xmltodict: the most stable machine-readable output zypper offers. Every call is pinned with --no-color and --no-abbrev (untruncated columns), --non-interactive for unattended runs, and --no-cd --no-refresh so it never touches removable media or auto-refreshes metadata (mpm refreshes explicitly through sync).

Note

Both installed and search run search --details --type package: --details is the only mode exposing versions, but it returns one row per source package, architecture and past release. mpm drops other-version rows and keeps the highest edition per package name to collapse those duplicates.

Documentation:

Initialize cli_errors list.

name: str = 'openSUSE Zypper'ΒΆ

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://en.opensuse.org/Portal:Zypper'ΒΆ

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='aix', name='IBM AIX'), Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='cygwin', name='Cygwin'), Platform(id='debian', name='Debian'), Platform(id='dragonfly_bsd', name='DragonFly BSD'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='freebsd', name='FreeBSD'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='haiku', name='Haiku'), Platform(id='hurd', name='GNU/Hurd'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='illumos', name='illumos'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='midnightbsd', name='MidnightBSD'), Platform(id='netbsd', name='NetBSD'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='openbsd', name='OpenBSD'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='os400', name='IBM i'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='solaris', name='Solaris'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='sunos', name='SunOS'), Platform(id='tumbleweed', name='openSUSE Tumbleweed'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})ΒΆ

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

default_sudo: bool = TrueΒΆ

Built-in escalation default, used when sudo is None.

False on the base: most managers install into user-writable trees and never need root. The system package managers whose privileged operations require root (apt, dnf, pacman, zypper, …) set this to True so their build_cli(..., sudo=True) operations escalate out of the box, while staying switchable off through sudo (--no-sudo or config) for rootless setups.

requirement: str | None = '>=1.14.0'ΒΆ

Version requirement specifier.

Supports a comma-separated range of constraints (e.g. ">=1.20.0,<2.0.0"). A bare version string like "1.20.0" is treated as >=1.20.0.

Parsed by meta_package_manager.version.VersionRange.

Defaults to None, which deactivates version check entirely.

pre_args: tuple[str, ...] = ('--no-color', '--no-abbrev', '--non-interactive', '--no-cd', '--no-refresh')ΒΆ
version_regexes: tuple[str, ...] = ('zypper\\s+(?P<version>\\S+)',)ΒΆ
$ zypper --version
zypper 1.14.11
property installed: Iterator[Package]ΒΆ

Fetch installed packages.

$ zypper --no-color --no-abbrev --non-interactive --no-cd --no-refresh                 --xmlout search --details --type package --installed-only
property outdated: Iterator[Package]ΒΆ

Fetch outdated packages.

$ zypper --no-color --no-abbrev --non-interactive --no-cd --no-refresh                 --xmlout list-updates
<?xml version='1.0'?>
<stream>
    <message type="info">Loading repository data...</message>
    <message type="info">Reading installed packages...</message>
    <update-status version="0.6">
        <update-list>
            <update name="git" kind="package" edition="2.34.1-10.9.1"
                    edition-old="2.26.2-3.34.1" arch="x86_64">
                <summary>Fast, scalable revision control system</summary>
                <description>
                    Git is a fast, scalable, distributed revision
                    control system.
                </description>
                <license/>
                <source
                    url="http://download.opensuse.org/updata/leap/15.3/sle"
                    alias="repo-sle-update"/>
            </update>
            <update name="vim" kind="package" edition="9.0.1234-1.1"
                    edition-old="8.2.4956-1.1" arch="x86_64">
                <summary>Vi IMproved text editor</summary>
                <description>
                    Highly configurable text editor.
                </description>
                <license/>
                <source
                    url="http://download.opensuse.org/update/leap/15.3/sle"
                    alias="repo-sle-update"/>
            </update>
        </update-list>
    </update-status>
</stream>
search(query, extended, exact)[source]ΒΆ

Fetch matching packages.

$ zypper --no-color --no-abbrev --non-interactive --no-cd --no-refresh                 --xmlout search --details --type package kopete
$ zypper --no-color --no-abbrev --non-interactive --no-cd --no-refresh                 --xmlout search --details --type package --search-description kopete
$ zypper --no-color --no-abbrev --non-interactive --no-cd --no-refresh                 --xmlout search --details --type package --match-exact kopete
$ zypper --no-color --no-abbrev --non-interactive --no-cd --no-refresh                 --xmlout search --details --type package --search-description                 --match-exact kopete
Return type:

Iterator[Package]

install(package_id, version=None)[source]ΒΆ

Install one package.

$ sudo zypper --no-color --no-abbrev --non-interactive --no-cd                 --no-refresh install kopete
Return type:

str

upgrade_all_cli()[source]ΒΆ

Generates the CLI to upgrade all outdated packages.

$ sudo zypper --no-color --no-abbrev --non-interactive --no-cd                 --no-refresh update
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]ΒΆ

Generates the CLI to upgrade the provided package.

$ sudo zypper --no-color --no-abbrev --non-interactive --no-cd                 --no-refresh update kopete
Return type:

tuple[str, ...]

remove(package_id)[source]ΒΆ

Remove one package.

$ sudo zypper --no-color --no-abbrev --non-interactive --no-cd                 --no-refresh remove kopete
Return type:

str

sync()[source]ΒΆ

Sync package metadata.

$ sudo zypper --no-color --no-abbrev --non-interactive --no-cd                 --no-refresh refresh
Return type:

None

cleanup()[source]ΒΆ

Removes things we don’t need anymore.

$ sudo zypper --no-color --no-abbrev --non-interactive --no-cd                 --no-refresh clean
Return type:

None

cli_names: tuple[str, ...] = ('zypper',)ΒΆ

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

id: str = 'zypper'ΒΆ

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

virtual: bool = FalseΒΆ

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.