From a49ee8d7de0f5bdaa307c139d24f4a396c77ad20 Mon Sep 17 00:00:00 2001 From: Moritz Heidkamp Date: Thu, 14 Aug 2025 11:09:09 +0200 Subject: [PATCH] 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 --- .../compilers/chicken/5/default.nix | 2 +- .../compilers/chicken/5/egg2nix.nix | 9 ++---- .../compilers/chicken/5/eggDerivation.nix | 25 ++++++++++++---- .../compilers/chicken/5/overrides.nix | 29 +------------------ 4 files changed, 24 insertions(+), 41 deletions(-) diff --git a/pkgs/development/compilers/chicken/5/default.nix b/pkgs/development/compilers/chicken/5/default.nix index ec930ef13446..41b2283fccf4 100644 --- a/pkgs/development/compilers/chicken/5/default.nix +++ b/pkgs/development/compilers/chicken/5/default.nix @@ -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}"; diff --git a/pkgs/development/compilers/chicken/5/egg2nix.nix b/pkgs/development/compilers/chicken/5/egg2nix.nix index 64393bff2173..22a89e7631d8 100644 --- a/pkgs/development/compilers/chicken/5/egg2nix.nix +++ b/pkgs/development/compilers/chicken/5/egg2nix.nix @@ -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 diff --git a/pkgs/development/compilers/chicken/5/eggDerivation.nix b/pkgs/development/compilers/chicken/5/eggDerivation.nix index 8ac4c0aa0890..a4da9793a1b4 100644 --- a/pkgs/development/compilers/chicken/5/eggDerivation.nix +++ b/pkgs/development/compilers/chicken/5/eggDerivation.nix @@ -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" ] diff --git a/pkgs/development/compilers/chicken/5/overrides.nix b/pkgs/development/compilers/chicken/5/overrides.nix index 28ddfdacf900..36481dbf5828 100644 --- a/pkgs/development/compilers/chicken/5/overrides.nix +++ b/pkgs/development/compilers/chicken/5/overrides.nix @@ -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