4
4
module Main where
5
5
6
6
import Cabal2Nix
7
- import Cabal2Nix.Util ( quoted )
8
7
import Control.Applicative ( liftA2 )
9
8
import Control.Monad.Trans.State.Strict
10
9
import Crypto.Hash.SHA256 ( hashlazy )
10
+ import Data.Aeson
11
+ import Data.Aeson.Types ( Pair )
12
+ import Data.Aeson.Encode.Pretty
11
13
import qualified Data.ByteString.Base16 as Base16
14
+ import qualified Data.ByteString.Base64 as Base64
12
15
import qualified Data.ByteString.Char8 as BS
13
16
import qualified Data.ByteString.Lazy as BL
14
17
import Data.Foldable ( toList
@@ -34,7 +37,6 @@ import Distribution.Pretty ( prettyShow
34
37
)
35
38
import Distribution.Types.PackageName ( PackageName )
36
39
import Distribution.Types.Version ( Version )
37
- import Nix.Expr
38
40
import Nix.Pretty ( prettyNix )
39
41
import System.Directory ( createDirectoryIfMissing
40
42
)
@@ -48,11 +50,23 @@ main = do
48
50
[out] <- getArgs
49
51
db <- U. readTarball Nothing =<< hackageTarball
50
52
51
- let (defaultNix, cabalFiles) =
52
- runState (fmap seqToSet $ foldMapWithKeyA package2nix db) mempty
53
-
53
+ let (defaultJson, cabalFiles) =
54
+ runState (fmap (object . toList . (Seq. sortOn fst )) $ foldMapWithKeyA package2json db) mempty
54
55
createDirectoryIfMissing False out
55
- writeFile (out </> " default.nix" ) $ show $ prettyNix defaultNix
56
+ BL. writeFile (out </> " default.nix" ) $
57
+ " with builtins; mapAttrs (_: mapAttrs (_: data: rec {\n \
58
+ \ inherit (data) sha256;\n \
59
+ \ revisions = (mapAttrs (rev: rdata: {\n \
60
+ \ inherit (rdata) revNum sha256;\n \
61
+ \ outPath = ./. + \" /hackage/${rdata.outPath}\" ;\n \
62
+ \ }) data.revisions) // {\n \
63
+ \ default = revisions.\" ${data.revisions.default}\" ;\n \
64
+ \ };\n \
65
+ \})) (fromJSON (readFile ./hackage.json))\n "
66
+
67
+ BL. writeFile (out </> " hackage.json" ) $ encodePretty'
68
+ (defConfig {confCompare = compare , confIndent = Spaces 1 })
69
+ defaultJson
56
70
createDirectoryIfMissing False (out </> " hackage" )
57
71
58
72
for_ cabalFiles $ \ (cabalFile, pname, path) -> do
@@ -73,51 +87,48 @@ foldMapWithKeyA
73
87
foldMapWithKeyA f =
74
88
unApplicativeMonoid . Map. foldMapWithKey (\ k -> ApplicativeMonoid . f k)
75
89
76
- seqToSet :: Seq (Binding NExpr ) -> NExpr
77
- seqToSet = mkNonRecSet . toList
78
-
79
90
fromPretty :: (Pretty a , IsString b ) => a -> b
80
91
fromPretty = fromString . prettyShow
81
92
82
- package2nix :: PackageName -> U. PackageData -> GPDWriter (Seq ( Binding NExpr ) )
83
- package2nix pname (U. PackageData { U. versions }) = do
84
- versionBindings <- foldMapWithKeyA (version2nix pname) versions
85
- return $ Seq. singleton $ quoted ( fromPretty pname) $= seqToSet versionBindings
93
+ package2json :: PackageName -> U. PackageData -> GPDWriter (Seq Pair )
94
+ package2json pname (U. PackageData { U. versions }) = do
95
+ versionBindings <- foldMapWithKeyA (version2json pname) versions
96
+ return $ Seq. singleton $ fromPretty pname .= (object . toList $ Seq. sortOn fst $ versionBindings)
86
97
87
- version2nix
88
- :: PackageName -> Version -> U. VersionData -> GPDWriter (Seq (Binding NExpr ))
89
- version2nix pname vnum (U. VersionData { U. cabalFileRevisions, U. metaFile }) =
98
+ version2json
99
+ :: PackageName -> Version -> U. VersionData -> GPDWriter (Seq (Pair ))
100
+ version2json pname vnum (U. VersionData { U. cabalFileRevisions, U. metaFile }) =
90
101
do
91
102
revisionBindings <- sequenceA
92
- $ zipWith (revBinding pname vnum) cabalFileRevisions [0 .. ]
93
- return $ Seq. singleton $ quoted (fromPretty vnum) $= mkRecSet
94
- [ " sha256 " $= mkStr
95
- (fromString $ P. parseMetaData pname vnum metaFile Map. ! " sha256" )
96
- , " revisions" $= mkNonRecSet
97
- ( fmap ( uncurry ($=) ) revisionBindings
98
- ++ [" default" $= (mkSym " revisions " @. fst (last revisionBindings) )]
103
+ $ zipWith (revBindingJson pname vnum) cabalFileRevisions [0 .. ]
104
+ let hash = decodeUtf8 $ Base64. encode $ fst $ Base16. decode $ fromString $ P. parseMetaData pname vnum metaFile Map. ! " sha256 "
105
+ return $ Seq. singleton $ fromPretty vnum .= object
106
+ [ " sha256 " .= ( " sha256- " <> hash )
107
+ , " revisions" .= object
108
+ ( revisionBindings
109
+ ++ [" default" .= fst (last revisionBindings)]
99
110
)
100
111
]
101
112
102
- revBinding
113
+ revBindingJson
103
114
:: PackageName
104
115
-> Version
105
116
-> BL. ByteString
106
117
-> Integer
107
- -> GPDWriter (Text , NExpr )
108
- revBinding pname vnum cabalFile revNum = do
118
+ -> GPDWriter (Text , Value )
119
+ revBindingJson pname vnum cabalFile revNum = do
109
120
let qualifiedName = mconcat $ intersperse
110
121
" -"
111
- [prettyPname, fromPretty vnum, revName, BS. unpack cabalHash]
122
+ [prettyPname, fromPretty vnum, revName, BS. unpack $ Base16. encode cabalHash]
112
123
revName :: (Semigroup a , IsString a ) => a
113
124
revName = " r" <> fromString (show revNum)
114
125
revPath = " ." </> " hackage" </> qualifiedName <.> " nix"
115
126
prettyPname = fromPretty pname
116
- cabalHash = Base16. encode $ hashlazy cabalFile
127
+ cabalHash = hashlazy cabalFile
117
128
modify' $ mappend $ Seq. singleton
118
129
(cabalFile, prettyPname ++ " .cabal" , revPath)
119
- return $ (,) revName $ mkNonRecSet
120
- [ " outPath" $= mkRelPath revPath
121
- , " revNum" $= mkInt revNum
122
- , " sha256" $= mkStr ( decodeUtf8 cabalHash)
130
+ return $ revName .= object
131
+ [ " outPath" .= (qualifiedName <> " .nix " )
132
+ , " revNum" .= revNum
133
+ , " sha256" .= ( " sha256- " <> decodeUtf8 ( Base64. encode cabalHash) )
123
134
]
0 commit comments