Announcing Lix 2.91 "Dragon's Breath"

We at the Lix team are proud to announce our second major release, version 2.91 “Dragon’s Breath”. This release contains unspecified bug fixes and performance improvements—no of course we will tell you what is in it.

Dragon’s Breath is a frozen dessert made of spheres of cereal frozen in liquid nitrogen

Lix is a Nix implementation focused on reliability, predictability, friendliness, developed by a community of people from around the world. We have long term plans to incrementally evolve Nix to work in more places, to make it more reliable and secure, and to update the language and semantics to correct past mistakes and reduce errors, all the while providing an amazing tooling experience.

Upgrading from CppNix or previous Lix versions

The upgrade procedure depends on how you installed Lix or CppNix, and is fully described in the Lix installation guide.

If you are using Lix from nixpkgs on NixOS, you just need to upgrade your nixpkgs once the upgrade pull request has passed through the build farm into your channel; no other action is required. The build progress can be checked on the unofficial pull request tracker.

If you want to help us test the next version of Lix, consider running main by following the beta guide.

Changes

The general theme of Lix 2.91 is to perform another wave of refactorings and design improvements in preparation for our evolution plans.

Nevertheless, there are a few exciting user facing changes:

  • Lix now supports --log-format multiline and --log-format multiline-with-logs that show current activities in progress, thanks to kloenk.

    The following is a snapshot in time of the output; that is, the activities shown at the bottom are just the ones in progress and each disappears after it finishes.

    ~ » nix build --log-format multiline nixpkgs#chromium
    [0/1 built, 3/3/7 copied (12.8/598.7 MiB), 1.1/127.3 MiB DL]
    fetching adwaita-icon-theme-46.0 from https://cache.nixos.org
    fetching gtk4-4.14.4 from https://cache.nixos.org
    fetching chromium-unwrapped-126.0.6478.126 from https://cache.nixos.org
    
  • nix flake metadata now prints the date inputs were updated, thanks to jade.

    lix » nix flake metadata .
    ...
    Description:   Lix: A modern, delicious implementation of the Nix package manager
    Path:          /nix/store/w44z74qv8g8nrxacn931qsbjxp8dz9g5-source
    Revision:      35c9069c665fd776a377c179231403f9877e3e2f-dirty
    Last modified: 2024-08-09 19:03:08
    Inputs:
    ├───flake-compat: github:edolstra/flake-compat/0f9255e01c2351cc7d116c072cb317785dd33b33
    │   Last modified: 2023-10-04 06:37:54
    ├───nix2container: github:nlewo/nix2container/3853e5caf9ad24103b13aa6e0e8bcebb47649fe4
    │   Last modified: 2024-07-10 13:15:56
    ├───nixpkgs: github:NixOS/nixpkgs/e21630230c77140bc6478a21cd71e8bb73706fce
    │   Last modified: 2024-07-25 11:26:27
    ├───nixpkgs-regression: github:NixOS/nixpkgs/215d4d0fd80ca5163643b03a33fde804a29cc1e2
    │   Last modified: 2022-01-24 11:20:45
    └───pre-commit-hooks: github:cachix/git-hooks.nix/f451c19376071a90d8c58ab1a953c6e9840527fd
        Last modified: 2024-07-15 04:21:09
    
  • nix flake show now prints output descriptions, thanks to kjeremy and isabelroses.

    lix/lix2 » nix flake show .
    git+file:///home/jade/lix/lix2
    ├───checks
    ........
    │   └───x86_64-linux
    │       ├───binaryTarball: derivation 'lix-binary-tarball-2.91.0-devpre20240810_446668b' - 'Distribution-independe...'
    │       ├───dockerImage: derivation 'image-lix.json' - 'Docker image for Lix. This is built with nix2container; se...'
    ........
    │       └───rl-next: derivation 'test-rl-next-release-notes'
    
  • Hash-mismatch diagnostics now include a guess at the URL based on the derivation fields, thanks to jade. The URL may or may not be able to be directly passed to nix-prefetch-url to obtain the correct hash, so it is primarily intended just to identify which fixed-output derivation failed.

    error: hash mismatch in fixed-output derivation '/nix/store/sjfw324j4533lwnpmr5z4icpb85r63ai-x1.drv':
            likely URL: https://meow.puppy.forge/puppy.tar.gz
             specified: sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
                got:    sha256-a1Qvp3FOOkWpL9kFHgugU1ok5UtRPSu+NwCZKbbaEro=
    
  • The Nix language pipe operator, RFC 148, has been implemented as an experimental feature pipe-operator in Lix by piegames. As usual with experimental features, the pipe operator is subject to potentially-breaking change as the design evolves.

    Here is an impractical example for illustration:

    nix-repl> 2 |> builtins.mul 5 |> builtins.add 2
    12
    
  • There is now a setting build-dir which allows changing the temporary directory used for builds, thanks to K900’s backport of Robert Hensing and Tom Bereknyei’s implementation in CppNix.

  • The environment variables NOCOLOR/NO_COLOR and CLICOLOR_FORCE/FORCE_COLOR are heeded in the expected way for all Lix output, thanks to jade.

Various little annoyances have been fixed:

  • :edit of a file in the repl does not reload the repl if the file is in the Nix store, since the file is immutable so could not possibly change the evaluation result. Thanks to goldstein for implementing this.

  • Lix now respects your consent when you tell it to accept-flake-config = false and rejects the flake config instead of asking every time, thanks to alois31.

  • nix-collect-garbage --dry-run now actually prints out the paths it was going to delete instead of doing nothing, thanks to Quantum Jump.

  • Due to a bug, nix copy to various stores, especially s3, used to be exceptionally slow at querying paths in the remote store, to the tune of Lix releases taking an hour just to figure out what was in the binary cache before uploading the release.

    This has now been made nproc times faster thanks to jade fixing the threading bug.

  • The nix upgrade-nix logic is finally fixed thanks to Qyriad and should correctly handle upgrading from CppNix without workarounds.

Lix now makes various erroneous conditions clearer:

  • Unknown flake URI parameters are now reported as an error, thanks to ma27.

    » nix flake metadata '.?meow=true'
    error: unsupported Git input attribute 'meow'
    
  • Evaluation errors are clearer:

    • The component in an attribute path causing an error is correctly diagnosed, thanks to Qyriad. In particular, if an evaluation error occurs when accessing an attribute path foo.bar.baz, the error will now point to which of foo, bar, or baz caused the error.
    • Errors caused by an explicit builtins.throw are diagnosed as such, rather than “while calling the ’throw’ builtin”, which could equally be because the arguments to throw themselves threw. This is now unambiguous thanks to Qyriad.
  • Integer overflow in the Nix language is now considered an evaluation error, thanks to jade. This has also been ported to CppNix, effectively changing the language definition.

    » nix eval --expr '9223372036854775807 + 1'
    error: integer overflow in adding 9223372036854775807 + 1
    

    Fun fact: Lix 2.90 also rejects integer overflow in the Nix language, by aborting the interpreter, due to our strict compiler flags. The fact that nobody noticed the interpreter crash for months has emboldened us to remove it from the language with confidence.

We have, as usual, made various changes behind the scenes to enable future work:

  • The parser has been rewritten using pegtl instead of the haunted and legacy GNU Bison, yielding a performance improvement around 5% to Lix evaluation.

    This also improves the contributor experience and technical debt by removing many memory leaks and making the parser much easier to deal with as a normal C++ file.

    This is all thanks to the hard work of eldritch horrors.

  • Several refactorings have been implemented to improve maintainability, thanks to Artemis Tosini, Qyriad, jade, alois31, eldritch horrors, ma27, V. and several others.

  • clang-tidy is finally implemented in an enforcing mode in CI, which means that work can be done to add more lints to the enforced list, thanks to jade.

    • Since 2.90, Lix had a custom clang-tidy lint plugin in-tree, and as of 2.91, it is now being run on every change in CI. As of this release, the first useful custom lint is now operational, requiring that certain already-safe reinterpret_cast invocations are replaced with a template wrapper charptr_cast that strictly checks its arguments.

      This is thanks to jade.

  • Several lints have been added to the hard-fail list and eliminated altogether from the codebase, thanks to eldritch horrors and jade.

  • Lix now fully builds and passes its test suite with AddressSanitizer (assuming the garbage collector is disabled, which a helpful error will tell you), thanks to eldritch horrors and jade.

    • Boost coroutines, which blocked AddressSanitizer usage, have been completely excised from the codebase by the claws of eldritch horrors and replaced with C++ standard stackless coroutines.
  • Overall the release process has been simplified and bugs fixed in it thanks to jade. The docker image of 2.91 should have a latest tag as intended, for example.

You can read the full changelog in the manual.

Thanks, as always, to the following groups:

  • The several dozen people who beta tested the upcoming release by running main in production since the 2.91 branch-off. We really appreciate having immediate feedback on our work, and the trust of running main alongside us means a lot to us.

    If you want to run Lix main yourself, see the beta guide for details.

  • Everyone who contributed by filing bugs and giving us feedback on Matrix.

  • All the first time contributors who made their first contributions to a Nix implementation in Lix. We are eternally grateful to everyone who helped us out on the numerous important but tedious issues.

  • All the contributors who have helped us with the backlog of bugs.

  • The CppNix contributors and CppNix team, without whom we would not have this software, and who wrote some of the improvements ported into this release.

Onwards and upwards for the next release. We look forward to continuing to work together with everyone to build a better foundation for the future evolution of Nix.