Skip to content

Commit b057264

Browse files
committed
Use revTimestamp to only pick revisions in our index-state
1 parent 885aa4b commit b057264

File tree

7 files changed

+51
-13
lines changed

7 files changed

+51
-13
lines changed

modules/hackage-project.nix

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{ lib, config, pkgs, haskellLib, ... }:
22
let
3-
inherit (config) name version revision;
3+
inherit (config) name version revision index-state;
44
in {
55
_file = "haskell.nix/modules/hackage-project.nix";
66
options = {
@@ -21,6 +21,19 @@ in {
2121
type = lib.types.str;
2222
default = "default";
2323
description = ''Hackage revision to use ("default", "r1", "r2", etc.)'';
24+
apply = r: if r == "default"
25+
then (lib.attrsets.foldlAttrs
26+
(acc: name: value:
27+
if value.revTimestamp > acc.rTimestamp
28+
then { rName = name; rTimestamp = value.revTimestamp; }
29+
else acc
30+
)
31+
({ rName = "default"; rTimestamp = "0"; })
32+
(
33+
lib.attrsets.filterAttrs (_: a: builtins.isAttrs a && a.revTimestamp <= index-state)
34+
(pkgs.haskell-nix.hackage.${config.name}.${version}.revisions)
35+
)).rName
36+
else r;
2437
};
2538
};
2639
config = {

modules/hackage.nix

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{ lib, config, pkgs, ... }:
1+
{ lib, config, pkgs, index-state, ... }:
22

33
let
44
# hackage looks like the following:
@@ -87,7 +87,21 @@ let
8787
revisions =
8888
lib.mapAttrs
8989
(_: rev2Config { inherit pname vnum; inherit (version) sha256; })
90-
(makeContentAddressed version.revisions);
90+
(makeContentAddressed
91+
(
92+
let maxAllowedRev = (lib.attrsets.foldlAttrs
93+
(acc: name: value:
94+
if value.revTimestamp > acc.rTimestamp
95+
then { rName = name; rTimestamp = value.revTimestamp; }
96+
else acc
97+
)
98+
({ rName = "default"; rTimestamp = "0"; })
99+
(
100+
lib.attrsets.filterAttrs (_: a: builtins.isAttrs a && a.revTimestamp <= index-state)
101+
version.revisions
102+
)).rName;
103+
in (version.revisions // {"default" = version.revisions."${maxAllowedRev}";}))
104+
);
91105
}));
92106

93107
in

nix-tools/cabal.project

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,5 @@ allow-newer:
2727
source-repository-package
2828
type: git
2929
location: https://github.com/michaelpj/hackage-db.git
30-
tag: f3b9240212b036391871e4ea09891e91efcea7a1
31-
--sha256: sha256-n0ATmkwtR68E2FuZK3QIQgZirVmWbd21vIQmzhGKsRw=
30+
tag: 83f819cb08742d3c86a83b407d45c1f6c1c7e299
31+
--sha256: sha256-8NTfSb1fE/so843qG59XpvPE2HIYTa0D1UrpnHdJ44U=

nix-tools/nix-tools/hackage2nix/Main.hs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import qualified Data.ByteString.Char8 as BS
1414
import Data.Foldable ( toList
1515
, for_
1616
)
17+
import Data.Int
1718
import Data.List ( intersperse )
1819
import Data.Map ( Map )
1920
import qualified Data.Map as Map
@@ -25,6 +26,8 @@ import Data.String ( IsString(fromString)
2526
import Data.Text ( Text )
2627
import qualified Data.Text as T ( pack )
2728
import Data.Text.Encoding ( decodeUtf8 )
29+
import Data.Time.Format.ISO8601 ( iso8601Show )
30+
import Data.Time.Clock.POSIX ( posixSecondsToUTCTime )
2831
import Distribution.Hackage.DB ( hackageTarball )
2932
import qualified Distribution.Hackage.DB.Parsed
3033
as P
@@ -136,22 +139,25 @@ version2nix pname vnum (U.VersionData { U.cabalFileRevisions, U.metaFile }) =
136139
revBindingJson
137140
:: PackageName
138141
-> Version
139-
-> BS.ByteString
142+
-> (Int64, BS.ByteString)
143+
-- ^ (EpochTime, Cabal File)
140144
-> Integer
141145
-> GPDWriter (Text, NExpr)
142-
revBindingJson pname vnum cabalFile revNum = do
146+
revBindingJson pname vnum (epochTime, cabalFile) revNum = do
143147
let qualifiedName = mconcat $ intersperse
144148
"-"
145149
[prettyPname, fromPretty vnum, revName, BS.unpack cabalHash]
146150
revName :: (Semigroup a, IsString a) => a
147151
revName = "r" <> fromString (show revNum)
148152
revPath = "." </> "hackage" </> qualifiedName <.> "nix"
153+
revTimestamp = iso8601Show (posixSecondsToUTCTime (fromIntegral epochTime))
149154
prettyPname = fromPretty pname
150155
cabalHash = Base16.encode $ hash cabalFile
151156
modify' $ mappend $ Seq.singleton
152157
(cabalFile, prettyPname ++ ".cabal", revPath)
153158
return (revName, mkNonRecSet
154159
[ "nix" $= mkSym "import" @@ mkSym (T.pack ("../hackage/" <> qualifiedName <> ".nix"))
155160
, "revNum" $= mkInt revNum
161+
, "revTimestamp" $= mkStr (T.pack revTimestamp)
156162
, "sha256" $= mkStr (decodeUtf8 cabalHash)
157163
])

nix-tools/nix-tools/nix-tools.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ executable hackage-to-nix
140140
, containers
141141
, bytestring
142142
, text
143+
, time
143144
, cryptohash-sha256
144145
, base16-bytestring
145146
, base64-bytestring

overlays/haskell.nix

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,14 +70,15 @@ final: prev: {
7070
, pkg-def-extras ? [] # Additional packages to augment the Base package set `pkg-def` with.
7171
, modules ? []
7272
, extra-hackages ? [] # Extra Hackage repositories to use besides main one.
73+
, index-state
7374
}@args:
7475

7576
let
7677
hackageAll = builtins.foldl' final.lib.recursiveUpdate hackage extra-hackages;
7778
in
7879

7980
import ../package-set.nix {
80-
inherit (args) pkg-def pkg-def-extras;
81+
inherit (args) pkg-def pkg-def-extras index-state;
8182
modules = defaultModules ++ modules;
8283
pkgs = final;
8384
hackage = hackageAll;
@@ -141,6 +142,7 @@ final: prev: {
141142
, extra-hackages ? []
142143
, compiler-nix-name ? null
143144
, compilerSelection ? p: p.haskell-nix.compiler
145+
, index-state
144146
}:
145147

146148
let
@@ -163,7 +165,7 @@ final: prev: {
163165
Make sure you didn't forget to update plan-sha256.''
164166
);
165167
mkPkgSet {
166-
inherit pkg-def;
168+
inherit pkg-def index-state;
167169
pkg-def-extras = [ plan-pkgs.extras
168170
# Using the -unchecked version here to avoid infinite
169171
# recursion issues when checkMaterialization = true
@@ -652,7 +654,7 @@ final: prev: {
652654
projectModule: haskellLib.evalProjectModule ../modules/cabal-project.nix projectModule (
653655
{ config, options, ... }:
654656
let
655-
inherit (config) compiler-nix-name compilerSelection evalPackages;
657+
inherit (config) compiler-nix-name compilerSelection evalPackages index-state;
656658

657659
callProjectResults = callCabalProjectToNix config;
658660
plan-pkgs = importAndFilterProject {
@@ -671,7 +673,7 @@ final: prev: {
671673
};
672674
}
673675
else mkCabalProjectPkgSet
674-
{ inherit compiler-nix-name compilerSelection plan-pkgs;
676+
{ inherit compiler-nix-name compilerSelection plan-pkgs index-state;
675677
pkg-def-extras = config.pkg-def-extras or [];
676678
modules = [ { _module.args.buildModules = final.lib.mkForce buildProject.pkg-set; } ]
677679
++ (config.modules or [])

package-set.nix

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
let f = { hackage, pkgs, pkg-def, pkg-def-extras ? [], modules ? [] }: let
2-
buildModules = f { inherit hackage pkg-def pkg-def-extras modules; pkgs = pkgs.buildPackages; };
1+
let f = { hackage, pkgs, pkg-def, pkg-def-extras ? [], modules ? [], index-state }: let
2+
buildModules = f { inherit hackage pkg-def pkg-def-extras modules index-state; pkgs = pkgs.buildPackages; };
33
in pkgs.lib.evalModules {
44
modules = modules ++ [
55
({ config, lib, ... }: {
@@ -15,6 +15,8 @@ in pkgs.lib.evalModules {
1515
pkgs = import ./lib/system-pkgs.nix pkgs;
1616
pkgconfPkgs = import ./lib/pkgconf-nixpkgs-map.nix pkgs;
1717

18+
inherit index-state;
19+
1820
inherit buildModules;
1921
};
2022

0 commit comments

Comments
 (0)