Nixtamal Manifest(5)()
Name
Nixtamal Manifest(5) - Setting up for pinning down inputs
Synopsis
Nixtamal uses KDL for its manifest describing inputs. At the highest level, this includes:
- manifest version
- default hashing algorithm
- patches (optional)
- list of inputs
- the input kind & its specific attributes
- a command to check if âfreshâ
- hashing information
- patches to apply to the input
Note:
Default manifest.kdl
version "0.5.0"
inputs {
nixpkgs {
archive {
url "https://github.com/NixOS/nixpkgs/archive/{{fresh_value}}.tar.gz"
}
hash algorithm=SHA-256
fetch-time eval
fresh-cmd {
$ git ls-remote "https://github.com/NixOS/nixpkgs.git" --refs "refs/heads/nixos-unstable"
| cut -f1
}
}
}
Top-level nodes
- version
- Version of the Nixtamal spec the manifest.kdl is using.
- default-hash-algorithm
- Hash algorithm to use by default for inputs when the input does not note its hash algorithm. Defaults to SHA-256.
- patches
- Map of patches to be applied to inputs where the patch name should be unique. Each patch has a URL (first argument). See Patches.
- default-fetch-time
- Default fetch time for inputs when not specified at the input level. Can be eval (fetch during Nix evaluation using builtins.fetch*) or build (fetch during build using pkgs.fetch*). Defaults to eval.
- inputs
- Map of inputs to be pinned where the input+node name should be unique & will be used in the Nix output as well as logs & errors. See Input node.
Fetch Time
Inputs can be fetched either during Nix evaluation or during build time:
- eval
- Fetch the input during Nix evaluation using builtins.fetch* functions. This is the default behavior and is suitable for inputs that need to be available during evaluation, such as the bootstrap Nixpkgs.
- build
- Fetch the input during build time using pkgs.fetch* functions. This is suitable for most inputs and allows for better caching and parallel fetching.
The fetch time can be set globally using default-fetch-time or per-input using the fetch-time property on file, archive, and git input types.
Caution!:
Patches
Patches are defined at the top-level and can be applied to any input. This allows defining a patch once and applying it to multiple inputs.
- url
- Templated node URL or file reference for the patch. Supports https://, http://, and file:// URLs.
- hash
- Optional node for hash algorithm information. The algorithm property will be used when prefetching, locking, & for integrity verification. The optional expected property may be used to assert a known hash. If not specified, no hash verification is performed. Defaults to the top-level default-hash-algorithm or SHA-256.
Input node
At a high level these should be seen as
- prop: frozen
- A boolean (frozen=#true) that prevents trying refresh or otherwise get a new fresh value for this input.
- âkindâ
- There are specific nodes for each different type of supported fetchers/prefetchers: file, archive, git, darcs, pijul, fossil (with more to come in the future).
- hash
-
An optional node for hash algorithm information for a input. The
algorithm property will be used when prefetching, locking, &
for importing (which falls back to top-level default-hash-algorithm
or defined default SHA-256). The optional expected property
may be used to assert a known hash.
Caution!:
- fresh-cmd
- Command (with or without pipes using $ & | nodes) that can shelled out to to return a string that will be locked as the fresh command value which can be used both to prevent unnecessary prefectching, but also for use in a Templated node.
- patches
- List of patch names (as arguments) to apply to this input. Patches are defined at the top-level in the Patches section.
File
- prop: fetch-time
- Property to set when to fetch this input: eval or build. Defaults to the top-level default-fetch-time or build.
- url
- Templated node URL reference for the input
- mirrors
- Templated node URL mirror references for the input
Archive
- prop: fetch-time
- Property to set when to fetch this input: eval or build. Defaults to the top-level default-fetch-time or build.
- url
- Templated node URL reference for the input
- mirrors
- Templated node URL mirror references for the input
Git
- prop: fetch-time
- Property to set when to fetch this input: eval or build. Defaults to the top-level default-fetch-time or build.
- repository
- Templated node repository reference for the input
- mirrors
-
Templated node repository mirror references for the input
Warning:
- "reference"
- branch or tag or ref node as the reference point for getting stable reference. tag provides convenience over using ref with full tag paths.
- submodules
- Leaf node for enabling submodules on a repository
- lfs
- Leaf node for enabling Git LFS on a repository
Darcs
- repository
- Templated node repository reference for the input
- mirrors
-
Templated node repository mirror references for the input
Note:
- âreferenceâ
- context or tag node as the reference point for getting stable reference; in the case of Darcs, if neither is supplied a context will be assumed & copied from nix-prefetch-darcs
Pijul
- remote
- Templated node remote reference for the input
- mirrors
-
Templated node remote mirror references for the input
Note:
- âreferenceâ
- channel or state or change (not recommended) node as the reference point for getting stable reference; if unsure, try channel main
Fossil
- repository
- Templated node repository reference for the input
- âreferenceâ
- branch or tag or check-in node as the reference point for getting stable reference
Templated node
Some nodes have values with string substitution via Jingoo <https://tategakibunko.github.io/jingoo/templates/templates.en.html>, which is probably overkill, but could give you flexibilty with if statements. The templated nodes include:
- inputs >> file > url
- inputs >> file > mirrors
- inputs >> archive > url
- inputs >> archive > mirrors
- inputs >> git > repository
- inputs >> git > mirrors
- inputs >> darcs > repository
- inputs >> darcs > mirrors
- inputs >> pijul > remote
- inputs >> pijul > mirrors
- inputs >> fossil > repository
- inputs >> fresh-cmd > $
- inputs >> fresh-cmd > |
The input kind affects the values for substition:
file
| Key | Type | Description |
| name | string | input name |
| fresh_value | string nullable | fresh command return value |
archive
| Key | Type | Description |
| name | string | input name |
| fresh_value | string nullable | fresh command return value |
git
| Key | Type | Description |
| name | string | input name |
| fresh_value | string nullable | fresh command return value |
| branch | string nullable | branch name |
| ref | string nullable | reference name |
| datetime | string nullable | Datetime of latest revision |
| lfs | bool | repository uses LFS |
| submodules | bool | repository uses submodules |
| rev / revision | string nullable | latest revision |
darcs
| Key | Type | Description |
| name | string | input name |
| fresh_value | string nullable | fresh command return value |
| context | string nullable | path to context file |
| tag | string nullable | tag |
| datetime | string nullable | datetime of latest patch |
| weak_hash | string nullable | latest weak hash of the repository |
pijul
| Key | Type | Description |
| name | string | input name |
| fresh_value | string nullable | fresh command return value |
| channel | string nullable | remote channel |
| change | string nullable | change |
| datetime | string nullable | datetime of latest patch |
| state | string nullable | latest state of the remote or supplied state |
fossil
| Key | Type | Description |
| name | string | input name |
| fresh_value | string nullable | fresh command return value |
| branch | string nullable | branch name |
| tag | string nullable | tag |
| checkin | string nullable | check-in |
| date | string nullable | date of latest patch |
Input showcase
Darcs using exposed WeakHash to avoid needless refresh
nixtamal {
darcs {
repository "https://darcs.toastal.in.th/nixtamal/stable/"
mirrors "https://smeder.ee/~toastal/nixtamal.darcs"
}
fresh-cmd {
$ curl -sL "https://darcs.toastal.in.th/nixtamal/stable/_darcs/weak_hash"
}
}
Local directory checking for latest modification
soupault-plugins {
file {
url "file:///home/toastal/my-project"
}
fresh-cmd {
$ find "/home/toastal/my-project" "-print0"
| xargs "-0" stat -c %Y
| sort -n
| tail -n1
}
}
Eval time file with mirror + templated nodes
mozilla-tls-guidelines {
file fetch-time=eval {
url "https://ssl-config.mozilla.org/guidelines/{{fresh_value}}.json"
mirrors "https://raw.githubusercontent.com/mozilla/ssl-config-generator/refs/tags/v{{fresh_value}}/src/static/guidelines/{{fresh_value}}.json"
}
fresh-cmd {
$ curl -sL "https://wiki.mozilla.org/Security/Server_Side_TLS"
| htmlq -w -t "table.wikitable:last-of-type > tbody > tr:nth-child(2) > td:first-child"
| head -n1
}
}
Basic Pijul with BLAKE3 hash
pijul {
pijul {
remote "https://nest.pijul.com/pijul/pijul"
channel main
}
hash algorithm=BLAKE3
}
Inputs with patches
patches {
nixpkgs-pr123 "https://github.com/NixOS/nixpkgs/pull/123.diff"
my-fix "./patches/my-fix.patch"
}
inputs {
nixpkgs {
git {
repository "https://github.com/NixOS/nixpkgs.git"
ref "refs/heads/nixos-unstable"
}
patches "nixpkgs-pr123" "my-fix"
}
nixpkgs-stable {
git {
repository "https://github.com/NixOS/nixpkgs.git"
ref "refs/heads/nixos-24.05"
}
patches "my-fix"
}
}
Local patches (starting with ./ or ../) are applied directly from the repository and & be tracked by your VCS. âRemoteâ patches (meaning not local to the repository such as HTTPS, absolute paths with file:, & so forth) are fetched & hashed during nixtamal lock.
Author
toastal
| 0.5.0 |