1-- Run: cabal build -j hackage2nix && dist/build/hackage2nix/hackage2nix >hackage-packages.nix
3module Main ( main ) where
5import Cabal2Nix.Generate
7import Cabal2Nix.Package
9import Control.Monad.Par.Combinator
10import Control.Monad.Par.IO
11import Control.Monad.Trans
12import Data.Map ( Map )
13import qualified Data.Map as Map
15import qualified Data.Set as Set
16import Distribution.Hackage.DB ( Hackage, readHackage, GenericPackageDescription )
17import Distribution.NixOS.Derivation.Cabal
18import Distribution.NixOS.PrettyPrinting hiding ( (<>) )
19import Distribution.Text
22main = readHackage >>= runParIO . generatePackageSet
24nixAttr :: String -> Version -> String
25nixAttr name ver = name -- ++ "_" ++ [ if c == '.' then '_' else c | c <- display ver ]
27generatePackageSet :: Hackage -> ParIO ()
28generatePackageSet db = do
29 pkgs <- parMapM generatePackage (Map.toList db)
30 liftIO $ putStrLn "/* hackage-packages.nix is an auto-generated file -- DO NOT EDIT! */"
32 liftIO $ putStrLn "{ pkgs, stdenv, callPackage }:"
34 liftIO $ putStrLn "self: {"
36 forM_ pkgs $ \(name, version, nixExpr) -> do
37 -- when (name /= toNixName' name) $
38 -- liftIO $ print $ nest 2 $ (string (toNixName' name) <+> equals <+> text ("self." ++ show (nixAttr name version))) <> semi
39 -- liftIO $ print $ nest 2 $ (string (toNixName' name) <+> equals <+> text ("self." ++ show (nixAttr name version))) <> semi
40 -- when (name /= toNixName' name) $
41 -- liftIO $ print $ nest 2 $ (string name <+> equals <+> text ("self." ++ show (nixAttr name version))) <> semi
42 liftIO $ print $ nest 2 $ hang (string (nixAttr name version) <+> equals <+> text "callPackage") 2 (parens (disp nixExpr)) <+> (text "{}" <> semi)
46generatePackage :: (String, Map Version GenericPackageDescription) -> ParIO (String,Version,Derivation)
47generatePackage (name, versions) = do
48 let latestVersion = Set.findMax (Map.keysSet versions)
49 pkgDescription = (Map.!) versions latestVersion
50 srcSpec <- liftIO $ sourceFromHackage Nothing (name ++ "-" ++ display latestVersion)
51 return (name, latestVersion, (cabal2nix pkgDescription) { src = srcSpec })
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