meta_package_manager.managers.oh_my_fish module

meta_package_manager.managers.oh_my_fish.omf_source_path()[source]

Locate the init.fish file every invocation sources.

Oh My Fish installs itself into $OMF_PATH, falling back to ~/.local/share/omf when the variable is unset, as its own installer does. The path is returned whether or not it exists, so the built command stays well-formed and simply fails to source, which is what makes the version probe double as Oh My Fish’s presence check.

Return type:

Path

class meta_package_manager.managers.oh_my_fish.OhMyFish[source]

Bases: PackageManager

Oh My Fish is a framework and plugin manager for the Fish shell.

Packages are cloned under $OMF_PATH and recorded in the user’s bundle file. Oh My Fish manages two kinds of package, plugins and themes, and reports both from one listing: mpm yields them together, since a name is unique across the two and every mutating command takes either.

Caution

omf is a Fish function, not a standalone binary: it is defined by sourcing $OMF_PATH/init.fish, so it cannot serve as the manager’s CLI. Every invocation is therefore wrapped in fish -c. Fish is the binary mpm executes, and Oh My Fish’s own presence is established by the version probe: a host with Fish but no Oh My Fish fails to source and reports no version, which leaves the manager unavailable.

Note

No outdated: Oh My Fish compares nothing against its remotes short of performing the update. upgrade --all still works, and mpm auto-skips the operation.

Note

No search: omf search exists and would map cleanly, but its results are printed by a private __omf.cli.search.output helper whose format no upstream sample pins down, so declaring it would mean guessing at a parser.

Documentation: Oh My Fish.

Initialize cli_errors list.

id: str = 'oh-my-fish'

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 = 'Fish Oh My Fish'

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://github.com/oh-my-fish/oh-my-fish'

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 = '>=6.0.0'

The 6.x series is where this command set settled.

omf list, omf install, omf remove and the package-scoped omf update all predate it, but 6.0.0 is the release that moved the framework to $OMF_PATH with the init.fish entry point this manager sources.

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

Fish is the binary mpm actually executes.

Oh My Fish is a shell function defined by an init.fish file that is sourced, never executed, so it cannot serve as 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'}

Oh My Fish underlines its section headers through Fish’s set_color, which NO_COLOR disables so the listing parses as clean text.

version_regexes: tuple[str, ...] = ('Oh My Fish version (?P<version>\\S+)',)

Oh My Fish derives what it reports from git describe –tags –match ‘v*’ –always`, with the leading``v` cut off, so a checkout sitting on a release tag reports that release and one ahead of it reports a describe string.

$ fish -c 'source ~/.local/share/omf/init.fish; and omf --version'
Oh My Fish version 7
build_cli(*args, **kwargs)[source]

Wrap all CLI invocations in the Fish shell Oh My Fish needs.

The version probe is guarded by a readability test that exits successfully when init.fish is absent, so a host that merely has Fish installed does not turn into a manager reporting errors. An init.fish 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 Oh My Fish never requires elevated privileges.

Return type:

tuple[str, ...]

property installed: Iterator[Package]

Fetch installed packages.

Oh My Fish pipes both of its listings through column, so packages arrive several per line in a layout that depends on the terminal width, under an underlined Plugins and Themes header. Every token that is not one of those two headers is a package name: names carry no whitespace, which is what makes splitting on it sound.

No version is reported for any of them: a package is a Git clone tracking a branch, and Oh My Fish records no revision per package.

$ fish -c 'source ~/.local/share/omf/init.fish; and omf list'
Plugins
bang-bang     brew          fish-spec     osx
percol        pyenv         tab           z

Themes
agnoster      bobthefish    default       scorphish

The block above is an illustration rather than a harvested fixture: the column layout is computed from the terminal width, so no sample can be byte-accurate across hosts.

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]

Install one package.

A theme is additionally set as the active one by Oh My Fish itself, which is its own behavior and not something mpm asks for.

$ omf install z
Return type:

str

upgrade_all_cli()[source]

Generates the CLI to upgrade all packages.

Note

A bare omf update also updates the Oh My Fish core, which is the manager rather than a package. The core is left in, deliberately: unlike Antidote’s --bundles, Oh My Fish offers no flag to scope an update to packages only, and naming every package instead would race the listing.

$ omf update
Return type:

tuple[str, ...]

upgrade_one_cli(package_id, version=None)[source]

Generates the CLI to upgrade one package.

Naming a package keeps the core out of the update: Oh My Fish only refreshes itself when omf is one of the names passed.

$ omf update z
Return type:

tuple[str, ...]

remove(package_id)[source]

Remove one package.

$ omf remove z
Return type:

str