meta_package_manager.managers.fisher module¶

class meta_package_manager.managers.fisher.Fisher[source]¶

Bases: PackageManager

Fisher is a plugin manager for the Fish shell.

Fisher clones each plugin from GitHub or any other forge into $fisher_path, and records the set in the user’s fish_plugins file. Plugins are identified by the lower-cased owner/repo slug Fisher both reports and accepts, which is the id mpm keys them on. A plugin may carry an @ref suffix pinning it to a Git tag or branch, and that suffix is what mpm surfaces as the installed version.

Caution

fisher is a Fish function, not a standalone binary: it ships as a functions/fisher.fish file that Fish autoloads, so it cannot serve as the manager’s CLI. Every invocation is therefore wrapped in fish -c. Fish is the binary mpm executes, and Fisher’s own presence is established by the version probe: a host with Fish but no Fisher autoloads nothing, reports no version, and leaves the manager unavailable.

Note

No outdated: Fisher exposes no dry run and no upstream comparison. It tracks a branch rather than a release, so “behind” is not a question it answers. upgrade --all still works, and mpm auto-skips the operation.

Note

No search: Fisher resolves plugins straight from forge URLs and indexes no registry to search.

Documentation: fisher.

Initialize cli_errors list.

name: str = 'Fish fisher'¶

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://github.com/jorgebucaran/fisher'¶

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

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='almalinux', name='AlmaLinux'), 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='endeavouros', name='EndeavourOS'), 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='pikaos', name='PikaOS'), 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='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 = '>=4.0.0'¶

The 4.x rewrite is where this CLI settled.

4.0.0 is the release that introduced the $_fisher_plugins inventory list prints, the fish_plugins file install and remove maintain, and the plugin-scoped update this class builds. Fisher 3.x had a different command set entirely, keyed on a fishfile.

cli_names: tuple[str, ...] = ('fish',)¶

Fish is the binary mpm actually executes.

Fisher is a shell function that Fish autoloads from its functions path, and is never executed as a program, so it cannot be the manager’s CLI: mpm requires an executable. Keying the manager on Fish instead makes the version probe the presence check.

extra_env: ClassVar = {'NO_COLOR': '1'}¶

Fisher prints its progress through Fish’s own coloring, which NO_COLOR disables so the listing parses as clean text.

version_regexes: tuple[str, ...] = ('fisher, version (?P<version>\\S+)',)¶
$ fish -c 'functions --query fisher; or exit 0; fisher --version'
fisher, version 4.4.8
build_cli(*args, **kwargs)[source]¶

Wrap all CLI invocations in the Fish shell Fisher needs.

The version probe is guarded by functions --query, which exits successfully when Fisher is not on the functions path. Fish is a general-purpose shell, so an unguarded probe would turn every host that merely has Fish into a manager reporting errors. A Fisher that is present but broken still fails loudly.

Note

The **kwargs accepted by the base class (auto_pre_args, sudo, etc.) are accepted but ignored because every invocation goes through the fish -c wrapper and Fisher never requires elevated privileges.

Return type:

tuple[str, ...]

property installed: Iterator[Package]¶

Fetch installed packages.

Fisher prints one plugin per line, exactly as recorded: the lower-cased owner/repo slug, optionally suffixed with the @ref it was pinned to. A plugin installed from a local directory is listed by its absolute path instead, and is yielded under that path as its id.

The @ref is a Git tag or branch, which is the only revision Fisher records: an unpinned plugin tracks its default branch and so reports no version at all.

$ fish -c 'fisher list'
jorgebucaran/fisher
ilancosman/tide@v5
jorgebucaran/nvm.fish
id: str = 'fisher'¶

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.

install both clones the plugin and appends it to the user’s fish_plugins file, so a package installed through mpm is loaded by the next shell instead of sitting on disk unreferenced.

A version is passed straight through as Fisher’s @ref suffix. That round-trips exactly: the ref installed() reports is the one Fisher accepts back here.

$ fish -c 'fisher install ilancosman/tide@v5'
fisher installing ilancosman/tide@v5
         Fetching https://codeload.github.com/ilancosman/tide/tar.gz/v5
         Installing ilancosman/tide@v5
         12 functions, 2 completions, 3 conf.d scripts
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_all_cli()[source]¶

Generates the CLI to upgrade all packages.

A bare fisher update re-reads the user’s fish_plugins file and updates every plugin listed in it.

$ fish -c 'fisher update'
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]¶

Generates the CLI to upgrade one package.

$ fish -c 'fisher update jorgebucaran/nvm.fish'
Return type:

tuple[str, ...]

remove(package_id)[source]¶

Remove one package.

remove is the exact counterpart of Fisher.install(): it drops the plugin’s files and its line from the user’s fish_plugins file, so the next shell no longer loads it.

$ fish -c 'fisher remove jorgebucaran/nvm.fish'
fisher removing jorgebucaran/nvm.fish
         5 functions, 1 completion, 1 conf.d script
Return type:

str