OPAM-UNPIN(1)
π OPAM-UNPIN β bestie's guide to unpinning stuff π
Heyyy so welcome to OPAM-UNPIN, part of the Opam Manual fam. This one is literally an alias β it's not even doing its own thing, it's just pin remove in a cute little trench coat. Let's get into it π
β¨ NAME β¨
opam-unpin β it's giving "an alias for pin remove." That's it, that's the whole job π
β¨ SYNOPSIS β¨
opam unpin [OPTION]β¦ [ARG]β¦
β¨ DESCRIPTION β¨
Okay so real talk: opam unpin is an alias for opam pin remove. Same energy, different name πΈ
And if you wanna know the details? Run opam pin --help and it'll spill everything. iykyk π
β¨ PACKAGE BUILD OPTIONS β¨
These are all the build-time knobs and dials, bestie. Buckle up π¦
--assume-depextsβ Skips the install step for any system packages you're missing, and just tries to compile the opam packages anyway. If the install happens to work out, opam won't nag you about those system packages again. Heads up though: this only actually means anything if external dependency handling is turned on.-b,--keep-build-dirβ Keeps the build directories around after compiling packages. Exactly the same as setting$OPAMKEEPBUILDDIRto"true"β¨--build-docβ Nope, removed in 2.1. Use--with-docinstead π--build-testβ Also removed in 2.1. Use--with-testinstead π-d,--with-docβ Builds the package documentation. Only affects packages you listed on the command-line, no sneaky extras. Same as setting$OPAMWITHDOC(or the deprecated$OPAMBUILDDOC) to"true"π--dry-runβ Simulates the command but doesn't actually change anything. You can also flip this on with the$OPAMDEBUGenvironment variable π--fakeβ Registers the actions into the opam database without actually performing them.
β οΈ WARNING: this option is dangerous and likely to break your opam environment. You probably want --dry-run. You've been warned. Fr fr, don't do it π
--ignore-available-on[=PACKAGES](default=) β Forces opam to mark the listed packages as available. Great for testing compatibility, but expect builds to break when you use it. Note that version constraints of the packages' dependencies are unaffected π--ignore-constraints-on[=PACKAGES](default=) β Forces opam to ignore version constraints on all dependencies of the listed packages. Again, cool for compatibility testing, but expect builds to break. Note that availability of the packages, version constraints on optional dependencies, and conflicts are all unaffected. Same as setting$OPAMIGNORECONSTRAINTSπ--inplace-buildβ When compiling a package whose source is bound to a local directory, it processes the build and install actions right there in that directory instead of in a clean copy that opam manages. Only affects packages explicitly listed on the command-line. Same as setting$OPAMINPLACEBUILDto"true"πΈ-j JOBS,--jobs=JOBSβ Sets the max number of concurrent jobs to use. The default gets calculated from the number of cores you've got. You can also set it with the$OPAMJOBSenvironment variable β¨--lock-suffix=SUFFIX(absent=locked) β Sets the locked files suffix toSUFFIXπ--lockedβ In commands that use opam files found from pinned sources, if a variant of the file with an added.lockedextension exists (likefoo.opam.lockedsitting next tofoo.opam), that one gets used instead. This is typically useful for offering a more specific set of dependencies and reproducing similar build contexts β hence the name, bestie. Thelockoption can generate files like that, based on the versions of the dependencies currently installed on your host. Same as setting the$OPAMLOCKEDenvironment variable. Note that this option doesn't generally affect already pinned packages π-m MAKE,--make=MAKEβ Removed in 2.1. Useopam config set[-global] make MAKEinstead π--no-checksumsβ Doesn't verify the checksum of downloaded archives. Same as setting$OPAMNOCHECKSUMSto"true"π¦--no-depextsβ Temporarily disables handling of external dependencies. Use this if a package isn't available on your system package manager but you installed the required dependency by hand. Implies--assume-depexts, and stores the exceptions upon success as well π--require-checksumsβ Rejects installation of packages that don't provide a checksum for the upstream archives. Same as setting$OPAMREQUIRECHECKSUMSto"true"π₯--reuse-build-dirβ Reuses existing build directories (the ones you kept with--keep-build-dir) instead of compiling from a fresh clone of the source. Can be faster, but also can lead to failures if the build systems of the packages don't handle upgrades of dependencies well. Same as setting$OPAMREUSEBUILDDIRto"true"π--show-actionsβ Calls the solver and displays the actions. Doesn't perform any changes. Same as setting$OPAMSHOWβ¨--skip-updatesβ When you run an install, upgrade or reinstall on source-pinned packages, they normally get updated from their origin first. This flag disables that behaviour and keeps them at their version in cache. Same as setting$OPAMSKIPUPDATEπ-t,--with-testβ Builds and runs the package unit-tests. Only affects packages listed on the command-line. Same as setting$OPAMWITHTEST(or the deprecated$OPAMBUILDTEST) to"true"π--unlock-baseβ Removed in 2.1. Use--update-invariantinstead π--update-invariantβ Allows changes to the packages set as switch base (typically, the main compiler). Use with caution! Same as setting the$OPAMUNLOCKBASEenvironment variable β--verbose-on=PACKAGESβ Gets more verbose on specific packages. Same as setting$OPAMVERBOSEπ--with-dev-setupβ Includes development tools only dependencies π§
β¨ OPTIONS β¨
The main-character options, let's gooo π«Ά
--allβ When unpinning, removes all pins in the given switch π--currentβ When pinning, uses the currently installed version and metadata of the package: this avoids reinstallations caused by upstream metadata changes, and can also be used to keep a package that was removed upstream π--dev-repoβ Pins to the upstream package source for the latest development version π₯-e,--editβ Withopam pin add, edits the opam file as withopam pin editafter pinning β¨-k KIND,--kind=KINDβ Sets the kind of pinning. Must be one ofversion,path,http,git,darcs,hg,noneorauto. If it's unset orauto, it gets inferred from the format of the target β defaulting to the appropriate version control if one is detected in the given directory, or topathotherwise.OPAMPINKINDAUTOcan be set to"0"to disable automatic detection of version control. Usenoneto pin without a target (for virtual packages) πΈ-n,--no-actionβ Just records the new pinning status, and doesn't prompt for (re)installation or removal of affected packages π--normaliseβ Prints a list of available packages to pin in the formatname.version^url, which is comprehensible byopam pin add. Available only with thescansubcommand. An example of use isopam pin scan . --normalise | grep foo | xargs opam pin addπ--recursiveβ Allows recursive lookups of*.opamfiles. Cf.--subpathalso π¦-s,--shortβ Outputs raw lists of names, one per line, skipping any details π--subpath=PATHβ*.opamfiles get retrieved from the given sub directory instead of the top directory. Sources are then taken from the targeted sub directory β internally only this subdirectory is copied/fetched. Can be combined with--recursiveto get a recursive lookup on the subpath π--with-version=VERSIONβ Sets the pinning version toVERSIONfor namedPACKAGESor packages retrieved fromTARGET. It has priority over any other version specification (opam file version field,name.versargument). When pinning to a version, the package source from that version is used, but declared as beingVERSIONto opam. Using--with-versionis equivalent to using--editand adjusting the version in the package definition file β
more coming bestie, don't go anywhere π
β¨ COMMON OPTIONS β¨
okay bestie, these flags? they work on literally every single opam command. like, the whole squad. let's go π
--best-effortβ don't crash out just because opam couldn't install everything you asked for; it'll try to install as many as it possibly can. heads up tho: not every external solver plays nice with this option (recent versions ofaspcudormccsshould be fine π«Ά). it's the same as setting the$OPAMBESTEFFORTenvironment variable.--cli=MAJOR.MINOR(absent=2.6) β makes opam use the command-line interface syntax and semantics ofMAJOR.MINOR. this is for anyone doing persistent opam stuff β scripts, blog posts, all that β where any opam version in the sameMAJORseries will behave exactly like theMINORrelease you picked. important lore: this flag didn't exist in opam 2.0, so if you want the 2.0 CLI, you gotta set theOPAMCLIenvironment variable to2.0instead of using this parameter. iykyk π--color=WHENβ colorizes the output, obviously π.WHENhas to be one ofalways,neverorauto.--confirm-level=LEVELβ sets the confirmation level.LEVELmust be one ofask,no,yesorunsafe-yes. you can pass it more than once! and if--yesor--noare also hanging around, the value of the last--confirm-levelis the one that counts. this is equivalent to setting$OPAMCONFIRMLEVEL.--criteria=CRITERIAβ tells opam your user preferences for dependency solving, just for this run. it overrides$OPAMCRITERIA,$OPAMFIXUPCRITERIAand$OPAMUPGRADECRITERIA. for the deets on the supported language and which external solvers exist, look athttp://opam.ocaml.org/doc/External_solvers.html. and there's a whole general guide to using solver preferences athttp://www.dicosmo.org/Articles/usercriteria.pdfπ.--cudf=FILENAMEβ debug option bestie π: it saves the CUDF requests sent to the solver intoFILENAME-<n>.cudf, where<n>is the n-th call to the solver during the opam run.--debugβ prints debug messages to stderr. equivalent to setting$OPAMDEBUGto"true".--debug-level=LEVELβ same energy as--debug, but you get to pick the debug level (--debugjust sets it to1). equivalent to setting$OPAMDEBUGto a positive integer.--git-versionβ prints the git version of opam, if it's set (aka you're running a development version), then exits. like a little peek behind the curtain π¦.--help[=FMT](default=auto) β shows this very help in formatFMT.FMTmust be one ofauto,pager,grofforplain. withauto, the format becomespagerorplainwhenever theTERMenv var isdumbor undefined.--ignore-pin-dependsβ ignores the extra pins that pinned packages require β whether they got pinned manually viaopam pinor throughopam install DIR. this is equivalent to settingIGNOREPINDEPENDS=true.--json=FILENAMEβ saves the results of the opam run into a computer-readable file π». if the filename contains the character%, it gets replaced by an index that doesn't overwrite an existing file. similar to setting the$OPAMJSONvariable.--noβ answers no to every opam yes/no question without ever prompting you. see also--confirm-level. this is equivalent to setting$OPAMNOto"true".--no-aspcudβ removed in 2.1. gone. ghosted. π--no-auto-upgradeβ so when opam configures or updates a repository written for an earlier opam version (1.2), it internally converts it to the current format. this flag disables that behaviour. note that repositories should define their format version in a'repo'file at their root, otherwise they'll be assumed to be in the older format. and honestly? it's preferable in any case to upgrade the repositories manually withopam admin upgrade [--mirror URL]when you can πΈ.--no-self-upgradeβ normally opam will replace itself with a newer binary found atOPAMROOT/opamif one's there π. this disables that behaviour.-q,--quietβ disables--verbose.--root=ROOTβ usesROOTas the current root path. equivalent to setting$OPAMROOTtoROOT.--safe,--readonlyβ makes sure nothing gets automatically updated or rewritten. super useful for calling from completion scripts, for example. it'll fail whenever such an operation is needed; it also avoids waiting for locks, skips interactive questions, and overrides the$OPAMDEBUGvariable. equivalent to setting the environment variable$OPAMSAFE.--solver=CMDβ picks the CUDF solver used for resolving package installation problems π§©. this is either a predefined solver (this version of opam supportsbuiltin-mccs+lp(),builtin-mccs+glpk,builtin-dummy-z3-solver,builtin-0install,aspcud,mccs,aspcud-old,packup), or a custom command containing the variables%{input}%,%{output}%,%{criteria}%, and optionally%{timeout}%. equivalent to setting$OPAMEXTERNALSOLVER.--strictβ fails whenever an error turns up in a package definition or a configuration file. the default is to keep going silently if possible π€«.--switch=SWITCHβ usesSWITCHas the current compiler switch. equivalent to setting$OPAMSWITCHtoSWITCH.--use-internal-solverβ disables any external solver and uses the built-in one instead (this requires that opam was compiled with a built-in solver β οΈ). equivalent to setting$OPAMNOASPCUDor$OPAMUSEINTERNALSOLVER.-v,--verboseβ be more verbose π£οΈ. one-vshows all package commands; repeat it to also display commands called internally (liketar,curl,patch, etc.). repeating it n times is equivalent to setting$OPAMVERBOSEto"n".--versionβ shows version information.-w,--working-dirβ whenever opam updates packages that are bound to a local, version-controlled directory, this updates to the current working state of their source instead of the last committed state, or the ref they're pointing to. since the source directory gets copied as it is, if it isn't clean it may result in an opam build failure π¬. this only affects packages explicitly listed on the command-line. can also be set with$OPAMWORKINGDIR.-y,--yesβ answers yes to all opam yes/no questions without prompting. see also--confirm-level. equivalent to setting$OPAMYESto"true"π
πΈ ENVIRONMENT πΈ
okay bestie, this is the part where opam reads your ~vibes~ from the environment π opam makes use of the environment variables listed here, and yes, naming is all-caps-and-no-underscores, that's just the brand.
quick rules for the boolean girlies: set it to 0, no, false, or the empty string to disable it, and 1, yes or true to enable it. that's it, that's the whole vibe check β
OPAMALLPARENSβ surround all filters with parenthesis.OPAMASSUMEDEPEXTSβ see the option--assume-depexts.OPAMAUTOANSWERβ internal use only. not for us, bestie πOPAMAUTOREMOVEβ see the remove option--auto-remove.OPAMBESTEFFORTβ see the option--best-effort.OPAMBESTEFFORTPREFIXCRITERIAβ sets the string that must be prepended to the criteria when the--best-effortoption is set, and it's expected to maximise theopam-queryproperty in the solution.OPAMBUILDDOCβ removed in 2.1. she's gone, we don't talk about her πOPAMBUILDTESTβ removed in 2.1.OPAMCLIβ see the option `--cli'.OPAMCOLORβ when set to always or never, sets a default value for the--coloroption.OPAMCONFIRMLEVELβ see the option--confirm-level. heads up:OPAMCONFIRMLEVELhas priority overOPAMYESandOPAMNO. she's the main character here πOPAMCRITERIAβ specifies user preferences for dependency solving. the default value depends on the solver version, so useconfig reportto know the current setting. see also option--criteria.OPAMCUDFFILEβ save the cudf graph to file-actions-explicit.dot.OPAMCUDFTRIMβ controls the filtering of unrelated packages during CUDF preprocessing.OPAMCURLβ can be used to select a given 'curl' program. seeOPAMFETCHfor more options.OPAMDEBUGβ see options--debugand--debug-level.OPAMDEBUGSECTIONSβ if set, limits debug messages to the space-separated list of sections. sections can optionally have a specific debug level (for example,CLIENT:2orCLIENT CUDF:2), but otherwise use--debug-level.OPAMDIGDEPTHβ defines how aggressive the lookup for conflicts during CUDF preprocessing is.OPAMDOWNLOADJOBSβ sets the maximum number of simultaneous downloads.OPAMDROPWORKINGDIRβ overrides packages previously updated with--working-diron update. without this variable set, opam would keep them unchanged unless explicitly named on the command-line.OPAMDRYRUNβ see option--dry-run.OPAMEDITORβ sets the editor to use for opam file editing, and it overrides$EDITORand$VISUAL. she overrules everyone, periodt.OPAMERRLOGLENβ sets the number of log lines printed when a sub-process fails.0to print all.OPAMEXTERNALSOLVERβ see option--solver.OPAMFAKEβ see option--fake.OPAMFETCHβ specifies how to download files: eitherwget,curlor a custom command where variables%{url}%,%{out}%,%{retry}%,%{compress}%and%{checksum}%will be replaced. overrides the'download-command'value from the main config file.OPAMFIXUPCRITERIAβ same asOPAMUPGRADECRITERIA, but specific to fixup and reinstall.OPAMIGNOREAVAILABLEβ see the install option--ignore-available-on.OPAMIGNORECONSTRAINTSβ see the install option--ignore-constraints-on.OPAMIGNOREPINDEPENDSβ see option--ignore-pin-depends.OPAMINPLACEBUILDβ see option--inplace-build.OPAMJOBSβ sets the maximum number of parallel workers to run.OPAMJSONβ log json output to the given file (use character%to index the files).OPAMKEEPBUILDDIRβ see install option--keep-build-dir.OPAMKEEPLOGSβ tells opam to not remove some temporary command logs and some backups. this skips some finalisers and may also help to get more reliable backtraces.OPAMLOCKEDβ combination of--lockedand--lock-suffixoptions.OPAMLOGSβ logdir sets log directory, default is a temporary directory in/tmp.OPAMMAKECMDβ set the system make command to use.OPAMMERGEOUTβ merge process outputs, stderr on stdout.OPAMNOβ answer no to any question asked, see options--noand--confirm-level.OPAMNOis ignored if eitherOPAMCONFIRMLEVELorOPAMYESis set. sad for her but rules are rules βOPAMNOAGGREGATEβ withopam admin check, don't aggregate packages.OPAMNOASPCUDβ Deprecated. we said what we said π«OPAMNOAUTOUPGRADEβ disables automatic internal upgrade of repositories in an earlier format to the current one, on 'update' or 'init'.OPAMNOCHECKSUMSβ enables option--no-checksumswhen available.OPAMNODEPEXTSβ disables system dependencies handling, see option--no-depexts.OPAMNOENVNOTICEβ Internal.OPAMNOSELFUPGRADEβ see option--no-self-upgrade.OPAMPINKINDAUTOβ sets whether version control systems should be detected when pinning to a local path. enabled by default since 1.3.0.OPAMPRECISETRACKINGβ fine grain tracking of directories.OPAMPREPROβ set this to false to disable CUDF preprocessing. less efficient, but might help debugging solver issue.OPAMREPOSITORYTARRINGβ internally store all non-vcs repositories astar.gzfiles (by default, http repositories are stored as archive). this can be much faster on filesystems that don't cope well with scanning large trees. all operation are done in-memory, no I/O for scanning the repository. lowkey genius ngl β¨OPAMREQUIRECHECKSUMSβ enables option--require-checksumswhen available (e.g. foropam install).OPAMRETRIESβ sets the number of tries before failing downloads.OPAMREUSEBUILDDIRβ see option--reuse-build-dir.OPAMROOTβ see option--root. this is automatically set byopam env --root=DIR --set-root.OPAMROOTISOKβ don't complain when running as root.OPAMSAFEβ see option--safe.OPAMSHOWβ see option--show.OPAMSKIPUPDATEβ see option--skip-updates.OPAMSKIPVERSIONCHECKSβ bypasses some version checks. unsafe, for compatibility testing only. bestie please, only for science π§ͺOPAMSOLVERALLOWSUBOPTIMALβ (defaulttrue) allows some solvers to still return a solution when they reach timeout; while the solution remains assured to be consistent, there is no guarantee in this case that it fits the expected optimisation criteria. iftrue, opam willcontinue with a warning, iffalsea timeout is an error. currently only the builtin-z3 backend handles this degraded case.OPAMSOLVERTIMEOUTβ change the time allowance of the solver. default is60.0, set to0for unlimited. note that all solvers may not support this option.OPAMSOLVERTOLERANCEβ changes the tolerance towards the solver choosing an unoptimized solution (i.e. might pull outdated packages). typical values range from0.0(best solution known to the solver) to1.0(unoptimized solution). default is0.0. this option is useful in case the solver can't find a solution in a reasonable time (see$OPAMSOLVERTIMEOUT). note that all solvers may not support this option.OPAMSTATSβ Removed in 2.4. πͺ¦OPAMSTATUSLINEβ display a dynamic status line showing what's currently going on on the terminal. (one of one of always, never or auto)OPAMSTRICTβ fail on inconsistencies (file reading, switch import, etc.).OPAMSWITCHβ see option--switch. automatically set byopam env --switch=SWITCH --set-switch.OPAMUNLOCKBASEβ see install option--unlock-base.OPAMUPGRADECRITERIAβ specifies user preferences for dependency solving when performing an upgrade. overridesOPAMCRITERIAin upgrades if both are set. see also option--criteria.OPAMUSEINTERNALSOLVERβ see option--use-internal-solver.OPAMUSEOPENSSLβ Removed in 2.2.OPAMUTF8β use UTF8 characters in output (one of one of always, never or auto). by defaultauto, which is determined from the locale). π¦OPAMUTF8MSGSβ use extended UTF8 characters (camels) in opam messages. impliesOPAMUTF8. this is set by default on macOS only. camels!!! iconic πͺOPAMVALIDATIONHOOKβ if set, uses the%{hook}%command to validate an opam repository update.OPAMVERBOSEβ see option--verbose.OPAMVERBOSEONβ see option--verbose-on.OPAMVERSIONLAGPOWERβ do not use. that's the whole description. do not use. π ββοΈOPAMWITHDEVSETUPβ see install option--with-dev-setup.OPAMWITHDOCβ see install option--with-doc.OPAMWITHTESTβ see install option--with-test.OPAMWORKINGDIRβ see option--working-dir.OPAMYESβ see options--yesand--confirm-level.OPAMYEShas priority overOPAMNOand is ignored ifOPAMCONFIRMLEVELis set. she's the queen bee of saying yes πOPAMVAR_varβ overrides the contents of the variable var when substituting%{var}%strings inopamfiles.OPAMVAR_package_varβ overrides the contents of the variable package:var when substituting%{package:var}%strings inopamfiles.
βοΈ CLI VERSION βοΈ
okay so this is the section that future-proofs your whole setup and honestly it's giving responsible queen β¨
all scripts and programmatic invocations of opam should use --cli in order to ensure that they work seamlessly with future versions of the opam client. additionally, blog posts or other documentation can benefit, as it prevents information from becoming stale. no more β¨outdated tutorial energyβ¨ in your life.
although opam only supports roots (~/.opam/) for the current version, it does provide backwards compatibility for its command-line interface.
since CLI version support was only added in opam 2.1, use OPAMCLI to select 2.0 support (as opam 2.0 will just ignore it), and --cli=2.1 for 2.1 (or later) versions, since an environment variable controlling the parsing of syntax is brittle. to this end, opam displays a warning if OPAMCLI specifies a valid version other than 2.0, and also if --cli=2.0 is specified.
the command-line version is selected by using the --cli option or the OPAMCLI environment variable. --cli may be specified morethan once, where the last instance takes precedence. OPAMCLI is only inspected if --cli is not given.
lowkey the whole thing is: say --cli out loud in your scripts, bestie, and future-you will be obsessed with present-you π«Ά
π EXIT STATUS π
ok so before we get into the numbers, there's one lil exception and it's giving main character energy: the exec command does not play by these rules. It returns 127 if the command wasn't found or couldn't be executed, and otherwise it returns the command's own exit value. periodt.
Now the codes, bestie:
0β Success π ortruefor boolean queries.1β False. Comes back when a boolean return value is expected, like when you're running with--check, or for queries likeopam lint.2β Bad command-line arguments, or command-line arguments pointing to an invalid context (e.g. a file that isn't in the format we expected). π«5β Not found. You asked for something (package, version, repository, etc.) and it justβ¦ wasn't there. π10β Aborted. The operation needed confirmation and you didn't give it.15β Couldn't acquire the locks required for the operation. π20β There's literally no solution to the user request. This happens when, say, you try to install two packages that hate each other.30β Error in package definition, or other metadata files. Using--strictraises this error more often. π31β Package script error. Some package operations were unsuccessful. Could be an error in the packages, or an incompatibility with your system. This can be a partial error.40β Sync error. Couldn't fetch some remotes from the network. Also can be a partial error.50β Configuration error. Opam or your system config doesn't allow the operation and needs fixing.60β Solver failure. The solver failed to return a sound answer. Could be a broken external solver, or an error in solver configuration.99β Internal error. Something went wrong, most likely a bug in opam itself. π130β User interrupt.SIGINTwas received, generally because the user pressed Ctrl+C.0β on success.123β on indiscriminate errors reported on standard error.124β on command line parsing errors.125β on unexpected internal errors (bugs).
no cap, that list really does have0in it twice, and123,124,125sitting right at the bottom. we don't make the rules, we just report them faithfully. β¨
π FURTHER DOCUMENTATION π
See https://opam.ocaml.org/doc. that's it, that's the link, go read, it's giving well-documented queen π
π AUTHORS π
the icons who made this happen, the literal founding mothers and fathers of your favourite package manager:
- David Allsopp
<david@tarides.com> - Vincent Bernardoff
<vb@luminar.eu.org> - Raja Boujbel
<raja.boujbel@ocamlpro.com> - Kate Deplaix
<kit-ty-kate@exn.st> - Roberto Di Cosmo
<roberto@dicosmo.org> - Thomas Gazagnaire
<thomas@gazagnaire.org> - Louis Gesbert
<louis.gesbert@ocamlpro.com> - Fabrice Le Fessant
<Fabrice.Le_fessant@inria.fr> - Anil Madhavapeddy
<anil@recoil.org> - Guillem Rieu
<guillem.rieu@ocamlpro.com> - Ralf Treinen
<ralf.treinen@pps.jussieu.fr> - Frederic Tuong
<tuong@users.gforge.inria.fr>
periodt. absolute legends, every single one. π
π SEE ALSO π
iya, iykyk π¦
π BUGS π
found something cursed? Check bug reports at https://github.com/ocaml/opam/issues. they're waiting for you bestie, go file it π«Ά
okay that's the whole page!! this was Opam 2.6.1, from the OPAM-UNPIN(1) manual page β go forth and unpin responsibly, mwah π
β¨πΈ
π¦ where this page comes from
- arch rolling: opam 2.6.1-1 Β· LGPL-2.1-only
- fedora 44: opam 2.6.1-1.fc44 Β· LGPL-2.1-only WITH OCaml-LGPL-linking-exception
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms