1
+ {-# LANGUAGE CPP #-}
1
2
{-# LANGUAGE OverloadedStrings #-}
2
3
{-# LANGUAGE NamedFieldPuns #-}
3
4
{-# LANGUAGE LambdaCase #-}
4
5
5
- module Main where
6
+ module Main ( main ) where
6
7
7
8
import Cabal2Nix
8
9
import Cabal2Nix.Util ( quoted )
10
+ #if !MIN_VERSION_base(4, 17, 0)
9
11
import Control.Applicative ( liftA2 )
12
+ #endif
10
13
import Control.Monad.Trans.State.Strict
11
14
import Crypto.Hash.SHA256 ( hash )
12
15
import qualified Data.ByteString.Base16 as Base16
13
16
import qualified Data.ByteString.Char8 as BS
17
+ import Data.Char ( isUpper )
14
18
import Data.Foldable ( toList
15
19
, for_
16
20
)
@@ -53,7 +57,6 @@ import System.Environment ( getArgs )
53
57
import System.FilePath ( (</>)
54
58
, (<.>)
55
59
)
56
- import Data.Char (isUpper )
57
60
58
61
-- Avoid issues with case insensitive file systems by escaping upper case
59
62
-- characters with a leading _ character.
@@ -67,27 +70,31 @@ main :: IO ()
67
70
main = do
68
71
out: rest <- getArgs
69
72
(inp, src) <- case rest of
70
- [tarball, url, hash ] -> return (tarball, Just $ Repo url (Just hash ))
73
+ [tarball, url, sha256 ] -> return (tarball, Just $ Repo url (Just sha256 ))
71
74
[tarball, url] -> return (tarball, Just $ Repo url Nothing )
72
75
[tarball] -> return (tarball, Nothing )
73
76
[] -> hackageTarball >>= \ tarball -> return (tarball, Nothing )
77
+ _ -> error " Usage: hackage2nix [tarball [url [hash]]]"
74
78
75
79
db <- U. readTarball Nothing inp
76
80
77
81
let (nixFiles, cabalFiles) =
78
82
runState (fmap (toList . (Seq. sortOn fst )) $ foldMapWithKeyA package2nix db) mempty
79
83
createDirectoryIfMissing False out
80
- writeFile (out </> " default.nix" ) $
81
- " with builtins; mapAttrs (_: mapAttrs (_: data: rec {\n \
82
- \ inherit (data) sha256;\n \
83
- \ revisions = data.revisions // {\n \
84
- \ default = revisions.\" ${data.revisions.default}\" ;\n \
85
- \ };\n \
86
- \})) {\n "
87
- -- Import all the per package nix files
88
- <> mconcat (map (\ (pname, _) ->
89
- " " <> quoted pname <> " = import ./nix/" <> escapeUpperCase pname <> " .nix;\n " ) nixFiles)
90
- <> " }\n "
84
+ writeFile (out </> " default.nix" ) $ unlines [
85
+ " with builtins; mapAttrs (_: mapAttrs (_: data: rec {" ,
86
+ " inherit (data) sha256;" ,
87
+ " revisions = data.revisions // {" ,
88
+ " default = revisions.\" ${data.revisions.default}\" ;" ,
89
+ " };" ,
90
+ " })) {" ,
91
+ -- Import all the per package nix files
92
+ unlines [
93
+ " " <> quoted pname <> " = import ./nix/" <> escapeUpperCase pname <> " .nix;"
94
+ | (pname, _) <- nixFiles
95
+ ],
96
+ " }"
97
+ ]
91
98
92
99
createDirectoryIfMissing False (out </> " nix" )
93
100
for_ nixFiles $ \ (pname, nix) ->
@@ -127,9 +134,9 @@ version2nix pname vnum (U.VersionData { U.cabalFileRevisions, U.metaFile }) =
127
134
do
128
135
revisionBindings <- sequenceA
129
136
$ zipWith (revBindingJson pname vnum) cabalFileRevisions [0 .. ]
130
- let hash = decodeUtf8 $ fromString $ P. parseMetaData pname vnum metaFile Map. ! " sha256"
137
+ let sha256 = decodeUtf8 $ fromString $ P. parseMetaData pname vnum metaFile Map. ! " sha256"
131
138
return $ Seq. singleton (quoted (fromPretty vnum), mkNonRecSet
132
- [ " sha256" $= mkStr hash
139
+ [ " sha256" $= mkStr sha256
133
140
, " revisions" $= mkNonRecSet
134
141
( map (uncurry ($=) ) revisionBindings
135
142
++ [" default" $= mkStr (fst (last revisionBindings))]
0 commit comments