Moritz Heidkamp a49ee8d7de chickenPackages.chickenEggs: Preserve version info
Most eggs in the canonical repository don't declare a `version` property in their `.egg` files. This
is because it's provided implicitly when using `chicken-install` to retrieve them. Quoting from [the
manual](https://wiki.call-cc.org/man/5/Egg%20specification%20format#version):

> Eggs from remote egg servers are automatically versioned - the version is part of the protocol to
retrieve the egg and does not have to be specified in the .egg file.

Since we don't use `chicken-install` to retrieve eggs, this leaves us with a version of "unknown" in
most cases, e.g.:

    $ nix-shell -p chickenPackages.chickenEggs.json-abnf chickenPackages.chicken --run chicken-status
    abnf ...................................................... version: unknown
    iset ...................................................... version: unknown
    json-abnf ................................................. version: unknown
    lexgen .................................................... version: unknown
    regex ......................................................... version: 2.0
    srfi-1 .................................................... version: unknown
    srfi-127 .................................................. version: unknown
    srfi-69 ................................................... version: unknown
    utf8 ...................................................... version: unknown

This is usually not an issue unless another egg declares a minimum required version dependency on an
egg with missing version info. In this case, `chicken-install` will fill in "0.0.0" as a fallback
and the check will fail. This has so far been worked around patches (see e.g. #346004 or #358455).

This patch addresses the root cause by following the documentation's recommendation:

> Eggs installed from local directories (see below) should explicitly specify a version.

To do that, `eggDerivation` now simply always adds the version to the generated `.egg-info`
file. This has the added benefit of correcting potentially inconsistent version declarations in
`.egg` files. Note that we cannot patch the original `.egg` file because not all released egg
versions match [the stricter version format validation which currently applies
there](https://bugs.call-cc.org/ticket/1855).

The patch also changes the signature of `eggDerivation` to allow passing in `pname` and `version`
instead of `name` to allow for easy access to the egg version. However, for backwards compatibility,
the old `name` argument is also still supported.

As a result, the aforementioned overrides are removed again and some additional eggs can be marked
as unbroken again.

And finally, this is the output of the above `chicken-status` call with the patch applied:

    $ nix-shell -p chickenPackages.chickenEggs.json-abnf chickenPackages.chicken --run chicken-status
    abnf .......................................................... version: 8.3
    iset .......................................................... version: 2.2
    json-abnf ..................................................... version: 7.0
    lexgen ........................................................ version: 8.2
    regex ......................................................... version: 2.0
    srfi-1 ...................................................... version: 0.5.1
    srfi-127 ...................................................... version: 1.3
    srfi-69 ..................................................... version: 0.4.3
    utf8 ........................................................ version: 3.6.3
2025-08-14 20:12:06 +02:00

82 lines
2.4 KiB
Nix

{
lib,
newScope,
fetchurl,
}:
lib.makeScope newScope (self: {
fetchegg =
{
pname,
version,
sha256,
...
}:
fetchurl {
inherit sha256;
url = "https://code.call-cc.org/egg-tarballs/5/${pname}/${pname}-${version}.tar.gz";
};
eggDerivation = self.callPackage ./eggDerivation.nix { };
chicken = self.callPackage ./chicken.nix {
bootstrap-chicken = self.chicken.override { bootstrap-chicken = null; };
};
chickenEggs = lib.recurseIntoAttrs (
lib.makeScope self.newScope (
eggself:
(lib.mapAttrs (
pname:
eggData@{
version,
synopsis,
dependencies,
license,
...
}:
self.eggDerivation {
inherit pname version;
src = self.fetchegg (eggData // { inherit pname; });
buildInputs = map (x: eggself.${x}) dependencies;
meta.homepage = "https://wiki.call-cc.org/eggref/5/${pname}";
meta.description = synopsis;
meta.license =
(
lib.licenses
// {
"agpl" = lib.licenses.agpl3Only;
"artistic" = lib.licenses.artistic2;
"bsd" = lib.licenses.bsd3;
"bsd-1-clause" = lib.licenses.bsd1;
"bsd-2-clause" = lib.licenses.bsd2;
"bsd-3-clause" = lib.licenses.bsd3;
"gpl" = lib.licenses.gpl3Only;
"gpl-2" = lib.licenses.gpl2Only;
"gplv2" = lib.licenses.gpl2Only;
"gpl-3" = lib.licenses.gpl3Only;
"gpl-3.0" = lib.licenses.gpl3Only;
"gplv3" = lib.licenses.gpl3Only;
"lgpl" = lib.licenses.lgpl3Only;
"lgpl-2" = lib.licenses.lgpl2Only;
"lgpl-2.0+" = lib.licenses.lgpl2Plus;
"lgpl-2.1" = lib.licenses.lgpl21Only;
"lgpl-2.1-or-later" = lib.licenses.lgpl21Plus;
"lgpl-3" = lib.licenses.lgpl3Only;
"lgplv3" = lib.licenses.lgpl3Only;
"public-domain" = lib.licenses.publicDomain;
"srfi" = lib.licenses.bsd3;
"unicode" = lib.licenses.ucd;
"zlib-acknowledgement" = lib.licenses.zlib;
}
).${license} or license;
}
) (lib.importTOML ./deps.toml))
)
);
egg2nix = self.callPackage ./egg2nix.nix { };
})