Home Explore Blog Models CI



nixpkgs

3rd chunk of `pkgs/development/misc/resholve/README.md`
724e37e78bdda577f32c08e8c3fcd8febffc6ec31fbb9af40000000100000c89
| prologue | `<file>` | insert file before resolved script |
| epilogue | `<file>` | insert file after resolved script |

<!-- TODO: section below is largely custom for nixpkgs, but I would LIKE to wurst it. -->

## Controlling resolution with directives

In order to resolve a script, resholve will make you disambiguate how it should
handle any potential problems it encounters with directives. There are currently
3 types:
1. `fake` directives tell resholve to pretend it knows about an identifier
   such as a function, builtin, external command, etc. if there's a good reason
   it doesn't already know about it. Common examples:
   - builtins for a non-bash shell
   - loadable builtins
   - platform-specific external commands in cross-platform conditionals
2. `fix` directives give resholve permission to fix something that it can't
   safely fix automatically. Common examples:
   - resolving commands in aliases (this is appropriate for standalone scripts
     that use aliases non-interactively--but it would prevent profile/rc
     scripts from using the latest current-system symlinks.)
   - resolve commands in a variable definition
   - resolve an absolute command path from inputs as if it were a bare reference
   - force resholve to resolve known security wrappers
3. `keep` directives tell resholve not to raise an error (i.e., ignore)
   something it would usually object to. Common examples:
   - variables used as/within the first word of a command
   - pre-existing absolute or user-relative (~) command paths
   - dynamic (variable) arguments to commands known to accept/run other commands

> NOTE: resholve has a (growing) number of directives detailed in `man resholve`
> via `nixpkgs.resholve` (though protections against run-time use of python2 in nixpkgs mean you'll have to set `NIXPKGS_ALLOW_INSECURE=1` to pull resholve into nix-shell).

Each of these 3 types is represented by its own attrset, where you can think
of the key as a scope. The value should be:
- `true` for any directives that the resholve CLI accepts as a single word
- a list of strings for all other options
<!--
TODO: these should be fully-documented here, but I'm already maintaining
more copies of their specification/behavior than I like, and continuing to
add more at this early date will only ensure that I spend more time updating
docs and less time filling in feature gaps.

Full documentation may be greatly accelerated if someone can help me sort out
single-sourcing. See: https://github.com/abathur/resholve/issues/19
-->

This will hopefully make more sense when you see it. Here are CLI examples
from the manpage, and the Nix equivalents:

```nix
{
  # --fake 'f:setUp;tearDown builtin:setopt source:/etc/bashrc'
  fake = {
    # fake accepts the initial of valid identifier types as a CLI convenience.
    # Use full names in the Nix API.
    function = [
      "setUp"
      "tearDown"
    ];
    builtin = [ "setopt" ];
    source = [ "/etc/bashrc" ];
  };

  # --fix 'aliases $GIT:gix /bin/bash'
  fix = {
    # all single-word directives use `true` as value
    aliases = true;
    "$GIT" = [ "gix" ];
    "/bin/bash" = true;
  };

  # --keep 'source:$HOME /etc/bashrc ~/.bashrc'
  keep = {

Title: Controlling resholve Script Resolution with Directives: fake, fix, and keep
Summary
This chunk details how to control `resholve`'s script resolution with 'directives': `fake`, `fix`, and `keep`. `fake` directives tell `resholve` to assume knowledge of specific identifiers (functions, builtins, external commands) it might not otherwise detect. `fix` directives allow `resholve` to automatically resolve issues it wouldn't normally touch, like commands in aliases or variable definitions. `keep` directives tell `resholve` to ignore patterns it would usually flag (e.g., variables as commands, absolute paths). The Nix API represents these directives as attrsets, with keys as scopes and values as `true` for single-word CLI directives or a list of strings for others. Examples translate command-line `resholve` syntax into equivalent Nix API structures for `fake` and `fix` directives.