on iko/ghcjs-patch-master help sign in
Add support for "latest" as a version (#934)

When using `shellFor { tools = { x = "1.2.3"; }; }` it can be a pain to have to check if you have the latest version of `x` or if a new one has been introduced. This change adds support for passing `"latest"` as the version number to anything built on top of the `haskell-nix.hackage-project` function. When `"latest"` is used the newest version in the hackage.nix snapshot will be selected.

commitc6f83ceeeb7f0f104a0b2051f0b2cb94d9fab727 authorHamish Mackenzie <Hamish.Mackenzie@iohk.io> dateMon 23 Nov 2020, 17:48 (6 years ago) parentcb0d280
2 files changed+19−9
overlays/haskell.nix+15−9 overlays/tools.nix+4
overlays/haskell.nix+15−9
@@ -459,29 +459,35 @@ final: prev: {
459459 hackage-project =
460460 { name
461461 , compiler-nix-name
462− , version
462+ , version ? "latest"
463463 , revision ? "default"
464464 , ... }@args':
465− let args = { caller = "hackage-project"; } // args';
465+ let version' = if version == "latest"
466+ then builtins.head (
467+ builtins.sort
468+ (a: b: builtins.compareVersions a b > 0)
469+ (builtins.attrNames hackage.${name}))
470+ else version;
471+ args = { caller = "hackage-project"; } // args';
466472 tarball = final.pkgs.fetchurl {
467− url = "mirror://hackage/${name}-${version}.tar.gz";
468− inherit (hackage.${name}.${version}) sha256; };
469− rev = hackage.${name}.${version}.revisions.${revision};
473+ url = "mirror://hackage/${name}-${version'}.tar.gz";
474+ inherit (hackage.${name}.${version'}) sha256; };
475+ rev = hackage.${name}.${version'}.revisions.${revision};
470476 cabalFile = final.pkgs.fetchurl {
471− url = "https://hackage.haskell.org/package/${name}-${version}/revision/${toString rev.revNum}.cabal";
477+ url = "https://hackage.haskell.org/package/${name}-${version'}/revision/${toString rev.revNum}.cabal";
472478 inherit (rev) sha256;
473479 };
474480 revSuffix = final.lib.optionalString (rev.revNum > 0) "-r${toString rev.revNum}";
475− in let src = final.buildPackages.pkgs.runCommand "${name}-${version}${revSuffix}-src" { } (''
481+ in let src = final.buildPackages.pkgs.runCommand "${name}-${version'}${revSuffix}-src" { } (''
476482 tmp=$(mktemp -d)
477483 cd $tmp
478484 tar xzf ${tarball}
479− mv "${name}-${version}" $out
485+ mv "${name}-${version'}" $out
480486 '' + final.lib.optionalString (rev.revNum > 0) ''
481487 cp ${cabalFile} $out/${name}.cabal
482488 '');
483489 in cabalProject' (
484− (final.haskell-nix.hackageQuirks { inherit name version; }) //
490+ (final.haskell-nix.hackageQuirks { inherit name; version = version'; }) //
485491 builtins.removeAttrs args [ "version" "revision" ] // { inherit src; });
486492
487493 # This function is like `cabalProject` but it makes the plan-nix available
overlays/tools.nix+4
@@ -163,6 +163,10 @@ in { haskell-nix = prev.haskell-nix // {
163163 # Plan issues with the benchmarks, can try removing later
164164 configureArgs = "--disable-benchmarks";
165165 })).haskell-language-server.components.exes.haskell-language-server;
166+ # When adding new versions here, please set "latest" too the latest version
167+ # so that `tools = { haskell-language-server = "latest"; }`
168+ # will work the same way it does for tools that are in hackage.
169+ "latest" = final.haskell-nix.custom-tools.haskell-language-server."0.6.0";
166170 };
167171 };
168172}; }