1{-# LANGUAGE PatternGuards #-}
3module Main ( main ) where
6 I use the following shell script to re-build "hackage-packages.nix":
13 | make --quiet cabal2nix.cabal
14 | cabal build -j hackage2nix
15 | time dist/build/hackage2nix/hackage2nix >hackage-packages.nix
16 | mv hackage-packages.nix ~/.nix-defexpr/pkgs/development/haskell-modules/hackage-packages.nix
17 | nix-env -qaP -A haskellngPackages | tail -1
19 Make sure that "nix-env -qaP" shows the top-level Nixpkgs attributes at the
20 top level, i.e. without any prefix like "nixos.pkgs". Otherwise, the code
21 that resolver in Distribution/Nixpkgs/PackageMap.hs will produce bogus
25-- Run: cabal build -j hackage2nix && time dist/build/hackage2nix/hackage2nix >hackage-packages.nix && mv hackage-packages.nix ~/.nix-defexpr/pkgs/development/haskell-modules/hackage-packages.nix && nix-env -qaP -A haskellngPackages | tail -1
27import Cabal2Nix.Flags ( configureCabalFlags )
28import Cabal2Nix.Generate ( cabal2nix' )
29import Cabal2Nix.Hackage ( readHashedHackage, Hackage )
30import Cabal2Nix.Package
34import Control.Monad.Par.Combinator
35import Control.Monad.Par.IO
36import Control.Monad.Trans ( liftIO )
37import Data.Map.Strict ( Map )
38import qualified Data.Map.Strict as Map
41import Data.Set ( Set )
42import qualified Data.Set as Set
43import Distribution.Compiler
44import Distribution.Nixpkgs.Haskell
45import Distribution.Nixpkgs.PackageMap
46import Distribution.Nixpkgs.Util.PrettyPrinting hiding ( attr, (<>) )
47import Distribution.Package
48import Distribution.PackageDescription hiding ( buildDepends, extraLibs, buildTools )
49import Distribution.PackageDescription.Configuration
50import Distribution.System
51import Distribution.Text
52import Distribution.Version
54type Nixpkgs = PackageMap -- Map String (Set [String])
55type PackageSet = Map String Version
56type PackageMultiSet = Map String (Set Version)
58type Constraint = Dependency
60resolveConstraint :: Constraint -> Hackage -> Version
61resolveConstraint c = fromMaybe (error ("constraint " ++ display c ++ " cannot be resolved in Hackage")) .
64resolveConstraint' :: Constraint -> Hackage -> Maybe Version
65resolveConstraint' (Dependency (PackageName name) vrange) hackage | Set.null vs = Nothing
66 | otherwise = Just (Set.findMax vs)
67 where vs = Set.filter (`withinRange` vrange) (Map.keysSet (hackage Map.! name))
69data Configuration = Configuration
71 -- |Target architecture. Used by 'finalizePackageDescription' to
72 -- choose appropriate flags and dependencies.
75 -- |Target compiler. Used by 'finalizePackageDescription' to choose
76 -- appropriate flags and dependencies.
77 , compilerInfo :: CompilerInfo
79 -- |Core packages found on Hackageg
80 , corePackages :: [PackageIdentifier]
82 -- |Core packages not found on Hackage.
83 , hardCorePackages :: [PackageIdentifier]
85 -- |These packages replace the latest respective version during
86 -- dependency resolution.
87 , defaultPackageOverrides :: [Constraint]
89 -- |These packages are added to the generated set, but the play no
90 -- role during dependency resolution.
91 , extraPackages :: [Constraint]
93 -- |These packages have not succeeded a build yet, so we give them an
94 -- empty meta.hydraPlatforms attribute to avoid cluttering our Hydra
95 -- output with lots of broken builds.
96 , brokenPackages :: Set PackageName
102 hackage <- readHashedHackage
103 nixpkgs <- readNixpkgPackageMap
104 let fixup = Map.delete "acme-everything" -- TODO: https://github.com/NixOS/cabal2nix/issues/164
105 . Map.delete "type" -- TODO: https://github.com/NixOS/cabal2nix/issues/163
106 runParIO $ generatePackageSet defaultConfiguration (fixup hackage) nixpkgs
108generatePackageSet :: Configuration -> Hackage -> Nixpkgs -> ParIO ()
109generatePackageSet config hackage nixpkgs = do
111 corePackageSet :: PackageSet
112 corePackageSet = Map.fromList [ (name, v) | PackageIdentifier (PackageName name) v <- corePackages config ++ hardCorePackages config ]
114 latestVersionSet :: PackageSet
115 latestVersionSet = Map.map (Set.findMax . Map.keysSet) hackage
117 defaultPackageOverridesSet :: PackageSet
118 defaultPackageOverridesSet = Map.fromList [ (name, resolveConstraint c hackage) | c@(Dependency (PackageName name) _) <- defaultPackageOverrides config ]
120 generatedDefaultPackageSet :: PackageSet
121 generatedDefaultPackageSet = (defaultPackageOverridesSet `Map.union` latestVersionSet) `Map.difference` corePackageSet
123 latestCorePackageSet :: PackageSet
124 latestCorePackageSet = latestVersionSet `Map.intersection` corePackageSet
126 latestOverridePackageSet :: PackageSet
127 latestOverridePackageSet = latestVersionSet `Map.intersection` defaultPackageOverridesSet
129 extraPackageSet :: PackageMultiSet
130 extraPackageSet = Map.unionsWith Set.union
131 [ Map.singleton name (Set.singleton (resolveConstraint c hackage)) | c@(Dependency (PackageName name) _) <- extraPackages config ]
133 db :: PackageMultiSet
134 db = Map.unionsWith Set.union [ Map.map Set.singleton generatedDefaultPackageSet
135 , Map.map Set.singleton latestCorePackageSet
136 , Map.map Set.singleton latestOverridePackageSet
140 knownAttributesSet :: Set String
141 knownAttributesSet = Set.union (Map.keysSet hackage) (Map.keysSet corePackageSet)
143 resolver :: Dependency -> Bool
144 resolver (Dependency (PackageName name) vrange)
145 | Just v <- Map.lookup name corePackageSet = v `withinRange` vrange
146 | Just v <- Map.lookup name generatedDefaultPackageSet = v `withinRange` vrange
149 liftIO $ do putStrLn "/* hackage-packages.nix is an auto-generated file -- DO NOT EDIT! */"
151 putStrLn "{ pkgs, stdenv, callPackage }:"
155 pkgs <- flip parMapM (Map.toAscList db) $ \(name, vs) -> do
156 defs <- forM (Set.toAscList vs) $ \pkgversion -> do
157 srcSpec <- liftIO $ sourceFromHackage Nothing (name ++ "-" ++ display pkgversion)
158 let Just cabalFileHash = lookup "x-cabal-file-hash" (customFieldsPD (packageDescription descr))
160 -- TODO: Include list of broken dependencies in the generated output.
161 descr = hackage Map.! name Map.! pkgversion
162 (missingDeps, _, drv') = cabal2nix resolver descr
163 drv = drv' { src = srcSpec, editedCabalFile = if revision drv == 0 then "" else cabalFileHash
164 , metaSection = (metaSection drv') { broken = not (Set.null missing) -- Missing Haskell dependencies!
165 , hydraPlatforms = if PackageName name `Set.member` brokenPackages config
166 then Set.singleton "stdenv.lib.platforms.none"
167 else hydraPlatforms (metaSection drv')
169 , jailbreak = not (null missingDeps) -- Dependency constraints aren't fulfilled
172 missing :: Set String
173 missing = Set.filter (`Set.notMember` knownAttributesSet) (buildDepends drv `Set.union` testDepends drv)
175 buildInputs :: Map Attribute (Maybe Path)
176 buildInputs = Map.unions
177 [ Map.fromList [ (n, Nothing) | n <- Set.toList missing ]
178 , Map.fromList [ (n, resolveNixpkgsAttribute nixpkgs n) | n <- Set.toAscList (extraLibs drv `Set.union` pkgConfDeps drv) ]
179 , Map.fromList [ (n, resolveNixpkgsOrHackageAttribute nixpkgs hackage n) | n <- Set.toAscList (buildTools drv) ]
182 systemOverrides :: Doc
183 systemOverrides = fsep (map (uncurry formatOverride) (Map.toAscList buildInputs))
185 formatOverride :: Attribute -> Maybe Path -> Doc
186 formatOverride n Nothing = space <> text n <> text " = null;" -- missing attribute
187 formatOverride n (Just []) -- Haskell package:
188 | n == name = formatOverride n Nothing -- refers to a missing system library
189 | otherwise = empty -- found by callPackage
190 formatOverride n (Just p) = (text " inherit" <+> parens (text (intercalate "." p)) <+> text n) <> semi
193 overrides = systemOverrides
195 attr | Just v <- Map.lookup name generatedDefaultPackageSet, v == pkgversion = name
196 | otherwise = name ++ '_' : [ if c == '.' then '_' else c | c <- display pkgversion ]
198 return $ nest 2 $ hang (string attr <+> equals <+> text "callPackage") 2 (parens (pPrint drv)) <+> (braces overrides <> semi)
199 return (intercalate "\n\n" (map render defs))
201 liftIO $ mapM_ (\pkg -> putStrLn pkg >> putStrLn "") pkgs
202 liftIO $ putStrLn "}"
204resolveNixpkgsOrHackageAttribute :: Nixpkgs -> Hackage -> Attribute -> Maybe Path
205resolveNixpkgsOrHackageAttribute nixpkgs hackage name
206 | p@(Just _) <- resolveNixpkgsAttribute nixpkgs name = p
207 | Just _ <- Map.lookup name hackage = Just []
208 | otherwise = Nothing
210resolveNixpkgsAttribute :: Nixpkgs -> Attribute -> Maybe Path
211resolveNixpkgsAttribute nixpkgs name
212 | name `elem` ["clang","lldb","llvm"] = Just ["self","llvmPackages"]
213 | Just paths <- Map.lookup name nixpkgs = getShortestPath (Set.toList (paths `Set.intersection` goodScopes))
214 | otherwise = Nothing
216 goodScopes :: Set Path
217 goodScopes = Set.fromList [[], ["xlibs"], ["gnome"], ["gnome3"], ["kde4"]]
219 getShortestPath :: [Path] -> Maybe Path
220 getShortestPath [] = Nothing
221 getShortestPath ps = Just ("pkgs" : minimumBy (on compare length) ps)
223cabal2nix :: (Dependency -> Bool) -> GenericPackageDescription -> ([Dependency], FlagAssignment, Derivation)
224cabal2nix resolver cabal = (missingDeps, flags, drv)
226 drv = cabal2nix' descr
228 Right (descr, flags) = finalize (if null missingDeps then resolver else const True) cabal
230 missingDeps :: [Dependency]
231 missingDeps = either id (const []) (finalize resolver cabal')
233 finalize :: (Dependency -> Bool) -> GenericPackageDescription -> Either [Dependency] (PackageDescription, FlagAssignment)
234 finalize resolver' = finalizePackageDescription
235 (configureCabalFlags (package (packageDescription cabal)))
237 (platform defaultConfiguration)
238 (compilerInfo defaultConfiguration)
239 [] -- no additional constraints
241 -- A variant of the cabal file that has all test suites enabled to ensure
242 -- that their dependencies are recognized by finalizePackageDescription.
243 cabal' :: GenericPackageDescription
244 cabal' = cabal { condTestSuites = flaggedTests }
246 flaggedTests :: [(String, CondTree ConfVar [Dependency] TestSuite)]
247 flaggedTests = map (\(n, t) -> (n, mapTreeData enableTest t)) (condTestSuites cabal)
249 enableTest :: TestSuite -> TestSuite
250 enableTest t = t { testEnabled = True }
252defaultConfiguration :: Configuration
253defaultConfiguration = Configuration
254 { platform = Platform X86_64 Linux
255 , compilerInfo = unknownCompilerInfo (CompilerId GHC (Version [7,10,1] [])) NoAbiTag
256 , defaultPackageOverrides = map (\s -> fromMaybe (error (show s ++ " is not a valid override selector")) (simpleParse s))
257 [ "blaze-builder < 0.4" -- the new version breaks many builds, like streaming-commons
258 , "blaze-html < 0.8" -- new versions break pandoc
259 , "blaze-markup < 0.7" -- new versions break pandoc
260 , "haddock-library == 1.1.*" -- new versions break pandoc
261 , "HStringTemplate < 0.8" -- 0.8 depends on time >= 1.5, which we cannot provide in GHC 7.8.x
262 , "primitive < 0.6" -- newer versions break lens and others packages
263 , "QuickCheck < 2.8" -- 2.8 breaks chell-quickcheck-0.2.4
264 , "utf8-string < 1" -- version 1 breaks several packages right now, most notably hint
265 , "zlib < 0.6" -- newer versions break cabal-install
268 , corePackages = map (\s -> fromMaybe (error (show s ++ " is not a valid core package")) (simpleParse s))
273 , "bytestring-0.10.6.0"
274 , "containers-0.5.6.2"
276 , "directory-1.2.2.0"
279 , "haskeline-0.7.2.1"
282 , "integer-gmp-1.0.0.0"
285 , "template-haskell-2.10.0.0"
288 , "transformers-0.4.2.0"
293 , hardCorePackages = map (\s -> fromMaybe (error (show s ++ " is not a valid core package")) (simpleParse s))
294 [ "bin-package-db-0.0.0.0"
299 , extraPackages = map (\s -> fromMaybe (error (show s ++ " is not a valid extra package selector")) (simpleParse s))
300 [ "aeson < 0.8" -- newer versions don't work with GHC 6.12.3
301 , "annotated-wl-pprint <0.6" -- required by idris-0.9.17.1
302 , "blaze-html < 0.7.1" -- required by idris-0.9.17.1
303 , "blaze-markup >=0.5.2.1 && <0.6.3.0" -- required by idris-0.9.17.1
304 , "c2hs < 0.21" -- newer versions cannot compile ncurses
305 , "Cabal == 1.18.*" -- required for cabal-install et al on old GHC versions
306 , "Cabal == 1.20.*" -- required for cabal-install et al on old GHC versions
307 , "cabal-install == 1.18.*" -- required for ghc-mod on 7.8.x
308 , "conduit < 1.2.4.2" -- newer versions trigger non-deterministic ID bugs in GHC versions prior to 7.10.x
309 , "containers < 0.5" -- required to build alex with GHC 6.12.3
310 , "control-monad-free < 0.6" -- newer versions don't compile with anything but GHC 7.8.x
311 , "cpphs < 1.19" -- required to build Agda
312 , "deepseq == 1.3.0.1" -- required to build Cabal with GHC 6.12.3
313 , "descriptive < 0.1" -- required for structured-haskell-mode-1.0.8
314 , "equivalence == 0.2.5" -- required to build Agda with GHC 7.8.x
315 , "gloss < 1.9.3" -- new versions don't compile with GHC 7.8.x
316 , "haddock-api < 2.16" -- required on GHC 7.8.x
317 , "haskell-src-exts < 1.16" -- required for structured-haskell-mode-1.0.8
318 , "lens >=4.1.1 && <4.8" -- required by idris-0.9.17.1
319 , "mtl < 2.2" -- newer versions require transformers > 0.4.x, which we cannot provide in GHC 7.8.x
320 , "mtl-prelude < 2" -- required for to build postgrest on mtl 2.1.x platforms
321 , "optparse-applicative == 0.10.*" -- required for elm-make 0.1.1 and elm-package 0.4
322 , "parallel == 3.2.0.3" -- newer versions don't work with GHC 6.12.3
323 , "primitive == 0.5.1.*" -- required to build alex with GHC 6.12.3
324 , "QuickCheck < 2" -- required by test-framework-quickcheck and its users
325 , "seqid < 0.2" -- newer versions depend on transformers 0.4.x which we cannot provide in GHC 7.8.x
326 , "seqid-streams < 0.2" -- newer versions depend on transformers 0.4.x which we cannot provide in GHC 7.8.x
327 , "split < 0.2" -- newer versions don't work with GHC 6.12.3
328 , "vector < 0.10.10" -- newer versions don't work with GHC 6.12.3
331 , brokenPackages = Set.fromList $ map PackageName
332 [ "3d-graphics-examples"
336 , "abstract-par-accelerate"
340 , "accelerate-arithmetic"
342 , "accelerate-fourier"
344 , "accelerate-utility"
347 , "AC-EasyRaster-GTK"
352 , "acme-numbersystem"
353 , "acme-schoenfinkel"
361 , "Adaptive-Blaisorblade"
362 , "adaptive-containers"
367 , "adobe-swatch-exchange"
370 , "adp-multi-monadiccp"
376 , "AERN-Real-Interval"
396 , "aivika-experiment-diagrams"
397 , "aivika-transformers"
422 , "AndroidViewHierarchyImporter"
470 , "atlassian-connect-core"
471 , "atlassian-connect-descriptor"
477 , "attoparsec-iteratee"
479 , "attoparsec-text-enumerator"
496 , "aws-cloudfront-signer"
498 , "aws-elastic-transcoder"
499 , "aws-kinesis-reshard"
503 , "aws-sdk-text-converter"
504 , "aws-sdk-xml-unordered"
507 , "azure-service-api"
516 , "bamboo-plugin-highlight"
517 , "bamboo-plugin-photo"
518 , "bamboo-theme-blueprint"
519 , "bamboo-theme-mini-html5"
532 , "bed-and-breakfast"
542 , "bidirectionalization-combined"
548 , "billeksah-services"
551 , "binary-indexed-tree"
552 , "binary-protocol-zmq"
557 , "bindings-apr-util"
573 , "bindings-libstemmer"
575 , "bindings-linux-videodev2"
576 , "bindings-mpdecimal"
590 , "BiobaseTrainingData"
619 , "blaze-html-contrib"
620 , "blaze-html-hexpat"
622 , "blaze-textual-native"
626 , "BlogLiterately-diagrams"
635 , "boolean-normal-forms"
664 , "bytestring-rematch"
669 , "cabal-constraints"
670 , "cabal-dependency-licenses"
675 , "Cabal-ide-backend"
676 , "cabal-install-bundle"
677 , "cabal-install-ghc72"
678 , "cabal-install-ghc74"
698 , "call-haskell-from-anything"
708 , "casadi-bindings-control"
709 , "casadi-bindings-core"
710 , "casadi-bindings-internal"
711 , "casadi-bindings-ipopt-interface"
712 , "casadi-bindings-snopt-interface"
722 , "categorical-algebra"
731 , "CC-delcont-ref-tf"
733 , "cctools-workqueue"
735 , "ceilometer-common"
736 , "cereal-enumerator"
747 , "chalkboard-viewer"
775 , "citeproc-hs-pandoc-filter"
785 , "clash-prelude-quickcheck"
786 , "clash-systemverilog"
793 , "clckwrks-plugin-bugs"
794 , "clckwrks-plugin-ircbot"
795 , "clckwrks-plugin-media"
796 , "clckwrks-plugin-page"
797 , "clckwrks-theme-bootstrap"
798 , "clckwrks-theme-clckwrks"
799 , "clckwrks-theme-geo-bootstrap"
809 , "cloudfront-signer"
825 , "cnc-spec-compiler"
828 , "Codec-Image-DevIL"
840 , "collections-base-instances"
844 , "combinat-diagrams"
845 , "combinator-interactive"
849 , "commsec-keyexchange"
855 , "compdata-automata"
864 , "computational-algebra"
876 , "conduit-audio-lame"
877 , "conduit-audio-samplerate"
879 , "conduit-network-stream"
880 , "conduit-resumablesink"
887 , "const-math-ghc-plugin"
888 , "constrained-categories"
890 , "constructive-algebra"
899 , "control-monad-attempt"
900 , "control-monad-exception-mtl"
901 , "control-monad-failure"
902 , "control-monad-failure-mtl"
903 , "Control-Monad-MultiPass"
904 , "Control-Monad-ST2"
905 , "contstuff-monads-tf"
906 , "contstuff-transformers"
907 , "convertible-ascii"
914 , "copilot-libraries"
924 , "coroutine-iteratee"
927 , "couchdb-enumerator"
951 , "crf-chain1-constrained"
952 , "crf-chain2-generic"
958 , "crypto-cipher-benchmarks"
960 , "crypto-random-effect"
965 , "csound-expression"
966 , "csound-expression-opcodes"
967 , "csound-expression-typed"
997 , "darcs-buildpackage"
1017 , "data-object-json"
1018 , "data-object-yaml"
1019 , "data-quotientref"
1044 , "ddc-source-tetra"
1047 , "dead-simple-json"
1059 , "definitive-filesystem"
1060 , "definitive-graphics"
1061 , "definitive-parser"
1062 , "definitive-reactive"
1063 , "definitive-sound"
1070 , "dependent-sum-template"
1075 , "derivation-trees"
1086 , "diagrams-builder"
1087 , "diagrams-haddock"
1091 , "diagrams-postscript"
1093 , "diagrams-rubiks-cube"
1096 , "dice-entropy-conduit"
1101 , "DifferentialEvolution"
1103 , "digestive-bootstrap"
1104 , "digestive-foundation-lucid"
1105 , "digestive-functors"
1106 , "digestive-functors-aeson"
1107 , "digestive-functors-blaze"
1108 , "digestive-functors-happstack"
1109 , "digestive-functors-heist"
1110 , "digestive-functors-hsp"
1111 , "digestive-functors-lucid"
1112 , "digestive-functors-scotty"
1113 , "digestive-functors-snap"
1120 , "direct-binary-files"
1121 , "directed-cubical"
1130 , "distributed-process"
1131 , "distributed-process-async"
1132 , "distributed-process-azure"
1133 , "distributed-process-client-server"
1134 , "distributed-process-execution"
1135 , "distributed-process-extras"
1136 , "distributed-process-monad-control"
1137 , "distributed-process-p2p"
1138 , "distributed-process-platform"
1139 , "distributed-process-registry"
1140 , "distributed-process-simplelocalnet"
1141 , "distributed-process-supervisor"
1142 , "distributed-process-task"
1143 , "distributed-process-tests"
1144 , "distributed-process-zookeeper"
1145 , "distributed-static"
1147 , "distribution-plot"
1152 , "DnaProteinAlignment"
1160 , "doctest-discover"
1161 , "doctest-discover-configurator"
1167 , "download-media-content"
1211 , "DysFRP-Craftwerk"
1230 , "effective-aspects"
1231 , "effective-aspects-mzv"
1238 , "eibd-client-simple"
1259 , "embeddock-example"
1274 , "equational-reasoning"
1290 , "Eternal10Seconds"
1292 , "ethereum-client-haskell"
1293 , "ethereum-merkle-patricia-db"
1299 , "every-bit-counts"
1303 , "expat-enumerator"
1305 , "explicit-sharing"
1307 , "exposed-containers"
1311 , "extended-categories"
1312 , "extensible-effects"
1343 , "feldspar-compiler"
1344 , "feldspar-language"
1347 , "FermatsLastMargin"
1351 , "ffmpeg-tutorials"
1361 , "filesystem-conduit"
1362 , "filesystem-enumerator"
1363 , "Finance-Quote-Yahoo"
1364 , "Finance-Treasury"
1367 , "first-class-patterns"
1369 , "FirstOrderTheory"
1374 , "fixed-point-vector"
1375 , "fixed-point-vector-space"
1377 , "fixed-storable-array"
1378 , "fix-parser-simple"
1380 , "fix-symbols-gitit"
1382 , "flexiwrap-smallcheck"
1392 , "flowlocks-framework"
1396 , "foldl-incremental"
1401 , "font-opengl-basic4x6"
1425 , "free-operational"
1429 , "free-theorems-counterexamples"
1430 , "free-theorems-seq"
1431 , "free-theorems-seq-webui"
1432 , "free-theorems-webui"
1445 , "full-text-search"
1446 , "function-combine"
1458 , "gc-monitoring-wai"
1470 , "genericserialize"
1471 , "generic-storable"
1482 , "GeomPredicates-SSE"
1488 , "ghc-events-analyze"
1489 , "ghc-events-parallel"
1524 , "gladexml-accessor"
1549 , "google-html5-slide"
1550 , "google-mail-filters"
1560 , "GPipe-TextureLoad"
1566 , "grapefruit-examples"
1568 , "grapefruit-records"
1570 , "grapefruit-ui-gtk"
1574 , "GraphHammer-examples"
1575 , "graphics-drawingcombinators"
1577 , "graphics-formats-collada"
1580 , "graph-rewriting-cl"
1581 , "graph-rewriting-gl"
1582 , "graph-rewriting-lambdascope"
1583 , "graph-rewriting-layout"
1584 , "graph-rewriting-ski"
1585 , "graph-rewriting-strategies"
1586 , "graph-rewriting-trs"
1587 , "graph-rewriting-ww"
1596 , "groundhog-inspector"
1610 , "gtk2hs-cast-glade"
1611 , "gtk2hs-cast-gnomevfs"
1613 , "gtk2hs-cast-gtkglext"
1616 , "gtk3-mac-integration"
1620 , "gtk-mac-integration"
1622 , "gtk-serialized-event"
1624 , "guarded-rewriting"
1630 , "hack2-contrib-extra"
1631 , "hack2-handler-happstack-server"
1632 , "hack2-handler-mongrel2-http"
1633 , "hack2-handler-snap-server"
1634 , "hack2-handler-warp"
1635 , "hack2-interface-wai"
1645 , "hack-contrib-press"
1647 , "hack-frontend-happstack"
1648 , "hack-handler-epoll"
1649 , "hack-handler-evhttp"
1650 , "hack-handler-fastcgi"
1651 , "hack-handler-happstack"
1652 , "hack-handler-hyena"
1653 , "hack-handler-kibro"
1654 , "hack-handler-simpleserver"
1656 , "hack-middleware-cleanpath"
1657 , "hack-middleware-clientsession"
1658 , "hack-middleware-jsonp"
1669 , "hakyll-blaze-templates"
1671 , "hakyll-contrib-hyphenation"
1672 , "hakyll-contrib-links"
1695 , "happs-hsp-template"
1700 , "happstack-clientsession"
1701 , "happstack-contrib"
1704 , "happstack-facebook"
1706 , "happstack-fay-ajax"
1707 , "happstack-foundation"
1709 , "happstack-helpers"
1712 , "happstack-jmacro"
1713 , "happstack-monad-peel"
1714 , "happstack-plugins"
1721 , "happybara-webkit"
1722 , "happybara-webkit-server"
1740 , "hashable-generics"
1755 , "haskell-brainfuck"
1757 , "haskell-course-preludes"
1758 , "haskelldb-connect-hdbc"
1759 , "haskelldb-connect-hdbc-catchio-mtl"
1760 , "haskelldb-connect-hdbc-catchio-tf"
1761 , "haskelldb-connect-hdbc-catchio-transformers"
1762 , "haskelldb-connect-hdbc-lifted"
1763 , "haskelldb-dynamic"
1765 , "haskelldb-hdbc-mysql"
1766 , "haskelldb-hdbc-odbc"
1767 , "haskelldb-hdbc-postgresql"
1768 , "haskelldb-hdbc-sqlite3"
1770 , "haskelldb-hsql-mysql"
1771 , "haskelldb-hsql-odbc"
1772 , "haskelldb-hsql-postgresql"
1773 , "haskelldb-hsql-sqlite3"
1776 , "haskell-formatter"
1778 , "haskell-in-space"
1780 , "haskell-neo4j-client"
1783 , "haskell-openflow"
1784 , "haskell-packages"
1785 , "haskell-pdf-presenter"
1786 , "haskell-platform-test"
1791 , "haskell-src-meta-mwotton"
1793 , "haskell-type-exts"
1804 , "haskoin-protocol"
1809 , "haskoon-httpspec"
1812 , "haskore-realtime"
1813 , "haskore-supercollider"
1814 , "haskore-synthesizer"
1849 , "hdaemonize-buildfix"
1886 , "her-lexer-parsec"
1891 , "herringbone-embed"
1899 , "hexpat-pickle-generic"
1912 , "HGamer3D-CAudio-Binding"
1913 , "HGamer3D-CEGUI-Binding"
1914 , "HGamer3D-Enet-Binding"
1915 , "HGamer3D-Graphics3D"
1917 , "HGamer3D-InputSystem"
1918 , "HGamer3D-Network"
1919 , "HGamer3D-Ogre-Binding"
1920 , "HGamer3D-OIS-Binding"
1921 , "HGamer3D-SDL2-Binding"
1922 , "HGamer3D-SFML-Binding"
1923 , "HGamer3D-WinEvent"
1938 , "hierarchical-clustering"
1939 , "hierarchical-clustering-diagrams"
1947 , "hinduce-classifier"
1948 , "hinduce-classifier-decisiontree"
1949 , "hinduce-examples"
1967 , "HLearn-datastructures"
1981 , "hmatrix-gsl-stats"
1982 , "hmatrix-quadprogpp"
2010 , "Holumbus-Distribution"
2011 , "Holumbus-MapReduce"
2012 , "Holumbus-Searchengine"
2013 , "Holumbus-Storage"
2073 , "hsbencher-fusion"
2087 , "hs-carbon-examples"
2093 , "hscurses-fish-ex"
2132 , "hsndfile-storablevector"
2134 , "hs-nombre-generator"
2142 , "hspec-expectations-pretty"
2143 , "hspec-experimental"
2153 , "hsqml-demo-morris"
2154 , "hsqml-demo-samples"
2165 , "HStringTemplateHelpers"
2167 , "hs-twitterarchiver"
2185 , "html-email-validate"
2189 , "http-client-request-modifiers"
2190 , "http-conduit-browser"
2191 , "http-conduit-downloader"
2196 , "https-everywhere-rules"
2197 , "https-everywhere-rules-raw"
2214 , "hunt-searchengine"
2217 , "husk-scheme-libs"
2236 , "hydrogen-cli-args"
2238 , "hydrogen-parsing"
2239 , "hydrogen-prelude"
2240 , "hydrogen-prelude-parsec"
2264 , "ige-mac-integration"
2272 , "ihaskell-display"
2274 , "ihaskell-juicypixels"
2284 , "ImperativeHaskell"
2290 , "incremental-computing"
2291 , "incremental-sat-solver"
2294 , "indian-language-font-converter"
2300 , "InfixApplicative"
2304 , "instant-generics"
2308 , "interleavableGen"
2311 , "interpolatedstring-qq"
2312 , "interpolatedstring-qq-mwotton"
2322 , "iptables-helpers"
2334 , "iteratee-compress"
2344 , "ivory-quickcheck"
2358 , "java-bridge-extras"
2367 , "jmacro-rpc-happstack"
2384 , "JSON-Combinator-Examples"
2392 , "JuicyPixels-repa"
2393 , "JunkDB-driver-gdbm"
2397 , "kansas-lava-cores"
2398 , "kansas-lava-papilio"
2399 , "kansas-lava-shake"
2408 , "kickass-torrents-dump-parser"
2415 , "koellner-phonetic"
2419 , "kure-your-boilerplate"
2423 , "labyrinth-server"
2428 , "lambdabot-haskell-plugins"
2429 , "lambdabot-irc-plugins"
2430 , "lambdabot-misc-plugins"
2431 , "lambdabot-novelty-plugins"
2432 , "lambdabot-reference-plugins"
2433 , "lambdabot-social-plugins"
2436 , "LambdaCalculator"
2441 , "lambdacube-bullet"
2442 , "lambdacube-engine"
2443 , "lambdacube-examples"
2445 , "lambdacube-samples"
2451 , "LambdaPrettyQuote"
2459 , "language-c-comments"
2460 , "language-c-inline"
2464 , "language-java-classfile"
2467 , "language-python-colour"
2469 , "language-spelling"
2474 , "latest-npm-version"
2478 , "layout-bootstrap"
2488 , "learn-physics-examples"
2494 , "leveldb-haskell-fork"
2512 , "libsystemd-daemon"
2518 , "lighttpd-conf-qq"
2524 , "linear-accelerate"
2525 , "linear-algebra-cblas"
2527 , "linearscan-hoopl"
2540 , "listlike-instances"
2541 , "list-remote-forwards"
2542 , "list-t-html-parser"
2549 , "llvm-general-quote"
2558 , "LogicGrowsOnTrees"
2559 , "LogicGrowsOnTrees-MPI"
2560 , "LogicGrowsOnTrees-network"
2561 , "LogicGrowsOnTrees-processes"
2590 , "machines-directory"
2592 , "machines-process"
2605 , "manatee-anything"
2610 , "manatee-filemanager"
2611 , "manatee-imageviewer"
2613 , "manatee-pdfviewer"
2614 , "manatee-processmanager"
2616 , "manatee-template"
2617 , "manatee-terminal"
2627 , "markov-processes"
2629 , "marmalade-upload"
2643 , "MaybeT-monads-tf"
2644 , "MaybeT-transformers"
2655 , "memcache-haskell"
2658 , "meta-par-accelerate"
2696 , "modular-prelude-classy"
2697 , "module-management"
2703 , "monad-atom-simple"
2705 , "MonadCatchIO-mtl-foreign"
2706 , "MonadCatchIO-transformers-foreign"
2709 , "monadiccp-gecode"
2710 , "monad-interleave"
2715 , "monad-mersenne-random"
2720 , "monad-stlike-stm"
2728 , "mongrel2-handler"
2759 , "multiplate-simplified"
2760 , "multirec-alt-deriver"
2765 , "musicbrainz-email"
2779 , "mysnapsession-example"
2781 , "mysql-simple-quasi"
2782 , "mysql-simple-typed"
2810 , "network-anonymous-i2p"
2811 , "network-api-support"
2813 , "network-bytestring"
2814 , "network-connection"
2817 , "network-minihttp"
2819 , "network-protocol-xmpp"
2823 , "network-simple-tls"
2824 , "network-topic-models"
2825 , "network-transport-amqp"
2826 , "network-transport-zeromq"
2827 , "network-websocket"
2835 , "nicovideo-translator"
2854 , "not-gloss-examples"
2881 , "ois-input-manager"
2896 , "openexchangerates"
2902 , "openpgp-crypto-api"
2904 , "openssh-github-keys"
2907 , "opentheory-parser"
2908 , "opentheory-prime"
2909 , "opentheory-primitive"
2936 , "parameterized-data"
2938 , "parco-attoparsec"
2939 , "parconc-examples"
2957 , "paypal-adaptive-hoops"
2962 , "pdf-toolbox-content"
2963 , "pdf-toolbox-core"
2964 , "pdf-toolbox-document"
2965 , "pdf-toolbox-viewer"
2979 , "persistent-hssqlppp"
2981 , "persistent-protobuf"
2982 , "persistent-vector"
3002 , "pipes-cereal-plus"
3004 , "pipes-network-tls"
3005 , "pipes-p2p-examples"
3020 , "pointless-haskell"
3021 , "pointless-lenses"
3022 , "pointless-rewrite"
3027 , "polytypeable-utils"
3028 , "pontarius-mediaserver"
3044 , "postgresql-simple-typed"
3045 , "postgresql-typed"
3058 , "prelude-generalize"
3060 , "preprocess-haskell"
3066 , "PriorityChansConverger"
3068 , "ProbabilityMonads"
3072 , "process-listlike"
3073 , "process-progress"
3075 , "procrastinating-structure"
3076 , "procrastinating-variable"
3079 , "profunctor-extras"
3084 , "proj4-hs-bindings"
3093 , "protocol-buffers"
3094 , "protocol-buffers-descriptor"
3095 , "protocol-buffers-descriptor-fork"
3096 , "protocol-buffers-fork"
3097 , "prove-everywhere-server"
3101 , "publicsuffixlistcreate"
3118 , "push-notify-general"
3121 , "puzzle-draw-cmdline"
3131 , "querystring-pickle"
3136 , "quickcheck-regex"
3137 , "quickcheck-relaxng"
3138 , "quickcheck-rematch"
3139 , "quickcheck-webdriver"
3147 , "radium-formula-parser"
3148 , "rail-compiler-editor"
3154 , "random-access-list"
3158 , "random-hypergeometric"
3168 , "raven-haskell-scotty"
3178 , "reactive-banana-sdl"
3179 , "reactive-banana-threepenny"
3180 , "reactive-banana-wx"
3181 , "reactive-fieldtrip"
3185 , "really-simple-xml-parser"
3189 , "recursion-schemes"
3195 , "reflection-extras"
3208 , "regional-pointers"
3210 , "regions-monadsfd"
3211 , "regions-monadstf"
3218 , "relational-postgresql8"
3219 , "relational-query"
3220 , "relational-query-HDBC"
3221 , "relational-record"
3222 , "relational-record-examples"
3223 , "relational-schemas"
3239 , "representable-functors"
3240 , "representable-profunctors"
3241 , "representable-tries"
3247 , "restricted-workers"
3248 , "resumable-exceptions"
3250 , "rethinkdb-client-driver"
3252 , "rethinkdb-wereHamster"
3253 , "reverse-geocoding"
3263 , "ripple-federation"
3276 , "roguestar-engine"
3279 , "RollingDirectory"
3287 , "roundtrip-string"
3311 , "safer-file-handles"
3312 , "safer-file-handles-bytestring"
3313 , "safer-file-handles-text"
3321 , "salvia-websocket"
3322 , "samtools-iteratee"
3326 , "satchmo-backends"
3327 , "satchmo-examples"
3334 , "scan-vector-machine"
3339 , "scholdoc-citeproc"
3376 , "semigroupoid-extras"
3377 , "semigroups-actions"
3384 , "seqloc-datafiles"
3389 , "servant-postgresql"
3393 , "ses-html-snaplet"
3408 , "shake-language-c"
3411 , "shakespeare-i18n"
3416 , "Shellac-compatline"
3417 , "Shellac-editline"
3418 , "Shellac-haskeline"
3419 , "Shellac-readline"
3433 , "simple-bluetooth"
3443 , "simple-log-syslog"
3446 , "simple-postgresql-orm"
3451 , "simple-templates"
3482 , "snaplet-actionlog"
3483 , "snaplet-auth-acid"
3485 , "snaplet-environments"
3490 , "snaplet-mandrill"
3492 , "snaplet-mongodb-minimalistic"
3493 , "snaplet-mysql-simple"
3495 , "snaplet-postmark"
3496 , "snaplet-purescript"
3501 , "snaplet-ses-html"
3502 , "snaplet-sqlite-simple"
3504 , "snaplet-typed-sessions"
3509 , "sndfile-enumerators"
3521 , "sonic-visualiser"
3526 , "source-code-server"
3536 , "special-functors"
3539 , "speculation-transformers"
3540 , "spelling-suggest"
3556 , "sqlite-simple-typed"
3558 , "sql-simple-mysql"
3560 , "sql-simple-postgresql"
3561 , "sql-simple-sqlite"
3568 , "stackage-curator"
3573 , "statistics-dirichlet"
3574 , "statistics-fusion"
3579 , "stm-chunked-queues"
3584 , "storable-static-array"
3586 , "storablevector-carray"
3587 , "storablevector-streamfusion"
3588 , "Strafunski-Sdf2Haskell"
3589 , "StrappedTemplates"
3594 , "strict-concurrency"
3599 , "structural-induction"
3600 , "structured-mongoDB"
3605 , "sunroof-compiler"
3606 , "sunroof-examples"
3608 , "supercollider-midi"
3626 , "synchronous-channels"
3630 , "syntax-trees-fork-bairyn"
3632 , "synthesizer-alsa"
3633 , "synthesizer-core"
3634 , "synthesizer-dimensional"
3635 , "synthesizer-midi"
3638 , "system-random-effect"
3643 , "tagged-exception-core"
3654 , "tamarin-prover-term"
3655 , "tamarin-prover-theory"
3656 , "tamarin-prover-utils"
3667 , "template-default"
3668 , "template-haskell-util"
3678 , "test-framework-doctest"
3679 , "test-framework-quickcheck"
3680 , "test-framework-th-prime"
3693 , "text-register-machine"
3695 , "text-show-instances"
3696 , "text-xml-generic"
3703 , "theoremquest-client"
3707 , "th-instance-reification"
3710 , "th-lift-instances"
3737 , "timestamp-subprocess-lines"
3751 , "tokyocabinet-haskell"
3758 , "to-string-instances"
3764 , "transactional-events"
3765 , "transformers-convert"
3766 , "transformers-runnable"
3769 , "treemap-html-tools"
3780 , "tsession-happstack"
3788 , "twentefp-eventloop-graphics"
3790 , "twentefp-rosetree"
3792 , "twentefp-websockets"
3804 , "twitter-enumerator"
3807 , "twitter-types-lens"
3816 , "type-equality-check"
3823 , "typelevel-tensor"
3827 , "type-ord-spine-cereal"
3835 , "typography-geometry"
3850 , "unbounded-delays-units"
3851 , "unboxed-containers"
3853 , "unicode-normalization"
3854 , "unicode-properties"
3863 , "unix-process-conduit"
3865 , "unordered-containers-rematch"
3876 , "uri-enumerator-file"
3880 , "urldisp-happstack"
3892 , "uvector-algorithms"
3902 , "vaultaire-common"
3906 , "vect-floating-accelerate"
3907 , "vector-bytestring"
3911 , "vector-functorlazy"
3912 , "vector-instances-collections"
3914 , "vector-read-instances"
3915 , "vector-space-opengl"
3938 , "wai-digestive-functors"
3941 , "wai-handler-devel"
3942 , "wai-handler-snap"
3943 , "wai-handler-webkit"
3946 , "wai-logger-prefork"
3947 , "wai-middleware-cache"
3948 , "wai-middleware-cache-redis"
3949 , "wai-middleware-catch"
3950 , "wai-middleware-consul"
3951 , "wai-middleware-etag"
3952 , "wai-middleware-headers"
3953 , "wai-middleware-hmac-client"
3954 , "wai-middleware-preprocessor"
3955 , "wai-middleware-route"
3956 , "wai-middleware-static-caching"
3957 , "wai-middleware-throttle"
3962 , "wai-session-clientsession"
3963 , "wai-session-tokyocabinet"
3972 , "WebBits-multiplate"
3973 , "web-browser-in-haskell"
3978 , "webdriver-angular"
3983 , "webkit-javascriptcore"
3988 , "web-routes-quasi"
3989 , "web-routes-transformers"
4005 , "Win32-dhcp-server"
4008 , "Win32-junction-point"
4012 , "Win32-services-wrapper"
4017 , "wl-pprint-terminfo"
4037 , "wumpus-microprint"
4058 , "xhaskell-library"
4073 , "xml-enumerator-combinators"
4082 , "xmms2-client-glib"
4083 , "xmonad-bluetilebranch"
4084 , "xmonad-contrib-bluetilebranch"
4086 , "xmonad-screenshot"
4102 , "yahoo-finance-conduit"
4103 , "yahoo-web-search"
4118 , "yesod-angular-ui"
4119 , "yesod-auth-kerberos"
4121 , "yesod-auth-oauth"
4123 , "yesod-auth-smbclient"
4125 , "yesod-continuations"
4126 , "yesod-datatables"
4128 , "yesod-eventsource"
4135 , "yesod-pagination"
4139 , "yesod-purescript"
4142 , "yesod-session-redis"
4143 , "yesod-static-angular"
4146 , "yesod-transloadit"
4161 , "Yogurt-Standalone"
4185 , "zoom-cache-sndfile"
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list