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
This commit is contained in:
Moritz Heidkamp 2025-08-14 11:09:09 +02:00
parent 4ff3ec314a
commit a49ee8d7de
4 changed files with 24 additions and 41 deletions

View File

@ -37,7 +37,7 @@ lib.makeScope newScope (self: {
...
}:
self.eggDerivation {
name = "${pname}-${version}";
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}";

View File

@ -5,12 +5,6 @@
chickenEggs,
}:
# Note: This mostly reimplements the default.nix already contained in
# the tarball. Is there a nicer way than duplicating code?
let
version = "c5-git";
in
eggDerivation {
src = fetchFromGitHub {
owner = "corngood";
@ -19,7 +13,8 @@ eggDerivation {
sha256 = "1vfnhbcnyakywgjafhs0k5kpsdnrinzvdjxpz3fkwas1jsvxq3d1";
};
name = "egg2nix-${version}";
pname = "egg2nix";
version = "c5-git";
buildInputs = with chickenEggs; [
args
matchable

View File

@ -6,7 +6,6 @@
makeWrapper,
}:
{
name,
src,
buildInputs ? [ ],
chickenInstallFlags ? [ ],
@ -15,14 +14,24 @@
}@args:
let
nameVersionAssertion =
pred: lib.assertMsg pred "either name or both pname and version must be given";
pname =
if args ? pname then
assert nameVersionAssertion (!args ? name && args ? version);
args.pname
else
assert nameVersionAssertion (args ? name && !args ? version);
lib.getName args.name;
version = if args ? version then args.version else lib.getVersion args.name;
name = if args ? name then args.name else "${args.pname}-${args.version}";
overrides = callPackage ./overrides.nix { };
baseName = lib.getName name;
override =
if builtins.hasAttr baseName overrides then builtins.getAttr baseName overrides else lib.id;
override = if builtins.hasAttr pname overrides then builtins.getAttr pname overrides else lib.id;
in
(stdenv.mkDerivation (
{
name = "chicken-${name}";
pname = "chicken-${pname}";
inherit version;
propagatedBuildInputs = buildInputs;
nativeBuildInputs = [
chicken
@ -47,6 +56,10 @@ in
export CHICKEN_INSTALL_REPOSITORY=$out/lib/chicken/${toString chicken.binaryVersion}
chicken-install -cached -host ${lib.escapeShellArgs chickenInstallFlags}
# Patching generated .egg-info instead of original .egg to work around https://bugs.call-cc.org/ticket/1855
csi -e "(write (cons '(version \"${version}\") (read)))" < "$CHICKEN_INSTALL_REPOSITORY/${pname}.egg-info" > "${pname}.egg-info.new"
mv "${pname}.egg-info.new" "$CHICKEN_INSTALL_REPOSITORY/${pname}.egg-info"
for f in $out/bin/*
do
wrapProgram $f \
@ -67,6 +80,8 @@ in
}
// builtins.removeAttrs args [
"name"
"pname"
"version"
"buildInputs"
"meta"
]

View File

@ -60,13 +60,6 @@ in
srfi-13
]) old);
cmark = addToBuildInputs pkgs.cmark;
comparse = old: {
# For some reason lazy-seq 2 gets interpreted as lazy-seq 0.0.0??
postPatch = ''
substituteInPlace comparse.egg \
--replace-fail 'lazy-seq "0.1.0"' 'lazy-seq "0.0.0"'
'';
};
epoxy =
old:
(addToPropagatedBuildInputsWithPkgConfig pkgs.libepoxy old)
@ -122,13 +115,6 @@ in
(addToBuildInputs (lib.optional stdenv.hostPlatform.isDarwin pkgs.libinotify-kqueue) old)
// lib.optionalAttrs stdenv.hostPlatform.isDarwin (addToCscOptions "-L -linotify" old);
leveldb = addToBuildInputs pkgs.leveldb;
lowdown = old: {
# For some reason comparse version gets interpreted as 0.0.0
postPatch = ''
substituteInPlace lowdown.egg \
--replace-fail 'comparse "3"' 'comparse "0.0.0"'
'';
};
magic = addToBuildInputs pkgs.file;
mdh =
old:
@ -139,13 +125,6 @@ in
"-Wno-error=implicit-int"
];
};
medea = old: {
# For some reason comparse gets interpreted as comparse 0.0.0
postPatch = ''
substituteInPlace medea.egg \
--replace-fail 'comparse "0.3.0"' 'comparse "0.0.0"'
'';
};
# missing dependency in upstream egg
mistie = addToPropagatedBuildInputs (with chickenEggs; [ srfi-1 ]);
mosquitto = addToPropagatedBuildInputs ([ pkgs.mosquitto ]);
@ -286,12 +265,8 @@ in
};
# mark broken
"ephem-v1.1" = broken;
F-operator = broken;
atom = broken;
begin-syntax = broken;
ephem = broken;
canvas-draw = broken;
chicken-doc-admin = broken;
coops-utils = broken;
crypt = broken;
hypergiant = broken;
@ -301,10 +276,8 @@ in
mpi = broken;
pyffi = broken;
qt-light = broken;
salmonella-html-report = broken;
sundials = broken;
svn-client = broken;
system = broken;
tokyocabinet = broken;
# mark broken darwin