git.iko.soy/typeable/cabal2nix
on master help sign in
Distribution.NixOS: simplified and re-factored the data types
6bba006Peter Simons
cabal2nix.cabal+5−5
@@ -1,6 +1,6 @@
1Name: cabal2nix
1Name: cabal2nix
2−Version: 1.11
2+Version: 1.12
3−Copyright: (c) 2011 Peter Simons and Andres Loeh
3+Copyright: Peter Simons, Andres Loeh
4License: BSD3
4License: BSD3
5License-File: LICENSE
5License-File: LICENSE
6Author: Peter Simons <simons@cryp.to>, Andres Loeh <mail@andres-loeh.de>
6Author: Peter Simons <simons@cryp.to>, Andres Loeh <mail@andres-loeh.de>
@@ -49,7 +49,7 @@ Library
49 Exposed-Modules: Distribution.NixOS.Derivation.Cabal
49 Exposed-Modules: Distribution.NixOS.Derivation.Cabal
50 Distribution.NixOS.Derivation.License
50 Distribution.NixOS.Derivation.License
51 Distribution.NixOS.Derivation.Meta
51 Distribution.NixOS.Derivation.Meta
52− other-modules: Distribution.NixOS.Derivation.PrettyPrinting
52+ Distribution.NixOS.PrettyPrinting
53
53
54Executable cabal2nix
54Executable cabal2nix
55 main-is: Cabal2Nix.hs
55 main-is: Cabal2Nix.hs
@@ -65,7 +65,7 @@ Executable cabal2nix
65 Distribution.NixOS.Derivation.Cabal
65 Distribution.NixOS.Derivation.Cabal
66 Distribution.NixOS.Derivation.License
66 Distribution.NixOS.Derivation.License
67 Distribution.NixOS.Derivation.Meta
67 Distribution.NixOS.Derivation.Meta
68− Distribution.NixOS.Derivation.PrettyPrinting
68+ Distribution.NixOS.PrettyPrinting
69
69
70Executable hackage4nix
70Executable hackage4nix
71 main-is: Hackage4Nix.hs
71 main-is: Hackage4Nix.hs
@@ -80,4 +80,4 @@ Executable hackage4nix
80 Distribution.NixOS.Derivation.Cabal
80 Distribution.NixOS.Derivation.Cabal
81 Distribution.NixOS.Derivation.License
81 Distribution.NixOS.Derivation.License
82 Distribution.NixOS.Derivation.Meta
82 Distribution.NixOS.Derivation.Meta
83− Distribution.NixOS.Derivation.PrettyPrinting
83+ Distribution.NixOS.PrettyPrinting
src/Cabal2Nix/Package.hs+1−1
@@ -15,7 +15,7 @@ import Data.Char
15
15
16cabal2nix :: Cabal.GenericPackageDescription -> Derivation
16cabal2nix :: Cabal.GenericPackageDescription -> Derivation
17cabal2nix cabal = MkDerivation
17cabal2nix cabal = MkDerivation
18− { pname = Cabal.pkgName pkg
18+ { pname = let Cabal.PackageName x = Cabal.pkgName pkg in x
19 , version = Cabal.pkgVersion pkg
19 , version = Cabal.pkgVersion pkg
20 , sha256 = "cabal2nix left the she256 field undefined"
20 , sha256 = "cabal2nix left the she256 field undefined"
21 , isLibrary = isJust (Cabal.library tpkg)
21 , isLibrary = isJust (Cabal.library tpkg)
src/Distribution/NixOS/Derivation/Cabal.hs+18−7
@@ -1,26 +1,34 @@
1{-# LANGUAGE PatternGuards #-}
1{-# LANGUAGE PatternGuards #-}
2+{- |
3+ Module : Distribution.NixOS.Derivation.Cabal
4+ Copyright : Peter Simons, Andres Loeh
5+ License : BSD3
6+
7+ Maintainer : nix-dev@cs.uu.nl
8+ Stability : provisional
9+ Portability : portable
10+-}
2
11
3module Distribution.NixOS.Derivation.Cabal
12module Distribution.NixOS.Derivation.Cabal
4 ( Derivation(..)
13 ( Derivation(..)
5 , parseDerivation
14 , parseDerivation
6 , module Distribution.NixOS.Derivation.Meta
15 , module Distribution.NixOS.Derivation.Meta
7− , Version(..), PackageName(..)
16+ , Version(..)
8 )
17 )
9 where
18 where
10
19
11−import Distribution.NixOS.Derivation.PrettyPrinting
12import Distribution.NixOS.Derivation.Meta
20import Distribution.NixOS.Derivation.Meta
13−import Distribution.Package
21+import Distribution.NixOS.PrettyPrinting
14import Distribution.Text
22import Distribution.Text
23+import Distribution.Package
15import Data.Version
24import Data.Version
16import Data.List
25import Data.List
17import Data.Char
26import Data.Char
18−import Text.PrettyPrint
19import Text.ParserCombinators.ReadP ( readP_to_S )
27import Text.ParserCombinators.ReadP ( readP_to_S )
20import Text.Regex.Posix
28import Text.Regex.Posix
21
29
22data Derivation = MkDerivation
30data Derivation = MkDerivation
23− { pname :: PackageName
31+ { pname :: String
24 , version :: Version
32 , version :: Version
25 , sha256 :: String
33 , sha256 :: String
26 , isLibrary :: Bool
34 , isLibrary :: Bool
@@ -38,12 +46,15 @@ instance Text Derivation where
38 disp = renderDerivation
46 disp = renderDerivation
39 parse = error "parsing Distribution.NixOS.Derivation.Cabal.Derivation is not supported yet"
47 parse = error "parsing Distribution.NixOS.Derivation.Cabal.Derivation is not supported yet"
40
48
49+instance Package Derivation where
50+ packageId deriv = PackageIdentifier (PackageName (pname deriv)) (version deriv)
51+
41renderDerivation :: Derivation -> Doc
52renderDerivation :: Derivation -> Doc
42renderDerivation deriv = funargs (map text ("cabal" : inputs)) $$ vcat
53renderDerivation deriv = funargs (map text ("cabal" : inputs)) $$ vcat
43 [ text ""
54 [ text ""
44 , text "cabal.mkDerivation" <+> lparen <> text "self" <> colon <+> lbrace
55 , text "cabal.mkDerivation" <+> lparen <> text "self" <> colon <+> lbrace
45 , nest 2 $ vcat
56 , nest 2 $ vcat
46− [ attr "pname" $ doubleQuotes (disp (pname deriv))
57+ [ attr "pname" $ string (pname deriv)
47 , attr "version" $ doubleQuotes (disp (version deriv))
58 , attr "version" $ doubleQuotes (disp (version deriv))
48 , attr "sha256" $ string (sha256 deriv)
59 , attr "sha256" $ string (sha256 deriv)
49 , boolattr "isLibrary" (not (isLibrary deriv) || (isExecutable deriv)) (isLibrary deriv)
60 , boolattr "isLibrary" (not (isLibrary deriv) || (isExecutable deriv)) (isLibrary deriv)
@@ -73,7 +84,7 @@ parseDerivation buf
73 , maint <- buf `regsubmatch` "maintainers *= *\\[([^\"]+)]"
84 , maint <- buf `regsubmatch` "maintainers *= *\\[([^\"]+)]"
74 , noHaddock <- buf `regsubmatch` "noHaddock *= *(true|false) *;"
85 , noHaddock <- buf `regsubmatch` "noHaddock *= *(true|false) *;"
75 = Just $ MkDerivation
86 = Just $ MkDerivation
76− { pname = PackageName name
87+ { pname = name
77 , version = readVersion vers
88 , version = readVersion vers
78 , sha256 = sha
89 , sha256 = sha
79 , isLibrary = False
90 , isLibrary = False
src/Distribution/NixOS/Derivation/License.hs+10
@@ -1,3 +1,13 @@
1+{- |
2+ Module : Distribution.NixOS.Derivation.License
3+ Copyright : Peter Simons, Andres Loeh
4+ License : BSD3
5+
6+ Maintainer : nix-dev@cs.uu.nl
7+ Stability : provisional
8+ Portability : portable
9+-}
10+
1module Distribution.NixOS.Derivation.License
11module Distribution.NixOS.Derivation.License
2 ( License(..)
12 ( License(..)
3 , fromCabalLicense
13 , fromCabalLicense
src/Distribution/NixOS/Derivation/Meta.hs+11−2
@@ -1,13 +1,22 @@
1+{- |
2+ Module : Distribution.NixOS.Derivation.Meta
3+ Copyright : Peter Simons, Andres Loeh
4+ License : BSD3
5+
6+ Maintainer : nix-dev@cs.uu.nl
7+ Stability : provisional
8+ Portability : portable
9+-}
10+
1module Distribution.NixOS.Derivation.Meta
11module Distribution.NixOS.Derivation.Meta
2 ( Meta(..)
12 ( Meta(..)
3 , module Distribution.NixOS.Derivation.License
13 , module Distribution.NixOS.Derivation.License
4 )
14 )
5 where
15 where
6
16
7−import Distribution.NixOS.Derivation.PrettyPrinting
17+import Distribution.NixOS.PrettyPrinting
8import Distribution.NixOS.Derivation.License
18import Distribution.NixOS.Derivation.License
9import Distribution.Text
19import Distribution.Text
10−import Text.PrettyPrint
11
20
12data Meta = Meta
21data Meta = Meta
13 { homepage :: String
22 { homepage :: String
src/Distribution/NixOS/Derivation/PrettyPrinting.hs → src/Distribution/NixOS/PrettyPrinting.hsrenamed+12−1
@@ -1,10 +1,21 @@
1+{- |
2+ Module : Distribution.NixOS.PrettyPrinting
3+ Copyright : Peter Simons, Andres Loeh
4+ License : BSD3
5+
6+ Maintainer : nix-dev@cs.uu.nl
7+ Stability : provisional
8+ Portability : portable
9+-}
10+
1−module Distribution.NixOS.Derivation.PrettyPrinting
11+module Distribution.NixOS.PrettyPrinting
2 ( onlyIf
12 ( onlyIf
3 , listattr
13 , listattr
4 , boolattr
14 , boolattr
5 , attr
15 , attr
6 , string
16 , string
7 , funargs
17 , funargs
18+ , module Text.PrettyPrint
8 )
19 )
9 where
20 where
10
21
src/Hackage4Nix.hs+6−5
@@ -13,6 +13,7 @@ import Text.Regex.Posix
13import Data.Version
13import Data.Version
14import Text.ParserCombinators.ReadP ( readP_to_S )
14import Text.ParserCombinators.ReadP ( readP_to_S )
15import Distribution.PackageDescription.Parse ( parsePackageDescription, ParseResult(..) )
15import Distribution.PackageDescription.Parse ( parsePackageDescription, ParseResult(..) )
16+import Distribution.Package
16import Distribution.PackageDescription ( GenericPackageDescription() )
17import Distribution.PackageDescription ( GenericPackageDescription() )
17import Distribution.Text
18import Distribution.Text
18import System.Console.GetOpt ( OptDescr(..), ArgDescr(..), ArgOrder(..), usageInfo, getOpt )
19import System.Console.GetOpt ( OptDescr(..), ArgDescr(..), ArgOrder(..), usageInfo, getOpt )
@@ -75,7 +76,7 @@ discoverNixFiles yield dirOrFile
75 (False,_) -> io (readDirectory dirOrFile) >>= mapM_ (discoverNixFiles yield . (dirOrFile </>))
76 (False,_) -> io (readDirectory dirOrFile) >>= mapM_ (discoverNixFiles yield . (dirOrFile </>))
76
77
77regenerateDerivation :: Derivation -> String -> Bool
78regenerateDerivation :: Derivation -> String -> Bool
78−regenerateDerivation deriv buf = not (display (pname deriv) `elem` patchedPackages) &&
79+regenerateDerivation deriv buf = not (pname deriv `elem` patchedPackages) &&
79 not (buf =~ "preConfigure|configureFlags|postInstall|patchPhase")
80 not (buf =~ "preConfigure|configureFlags|postInstall|patchPhase")
80
81
81readVersion :: String -> Version
82readVersion :: String -> Version
@@ -129,7 +130,7 @@ updateNixPkgs paths = do
129 plats'
130 plats'
130 | null plats && not (null maints) = ["self.ghc.meta.platforms"]
131 | null plats && not (null maints) = ["self.ghc.meta.platforms"]
131 | otherwise = plats
132 | otherwise = plats
132− pkg <- readCabalFile (display (pname deriv)) (display (version deriv))
133+ pkg <- readCabalFile (pname deriv) (display (version deriv))
133 let deriv' = (cabal2nix pkg) { sha256 = sha256 deriv, runHaddock = runHaddock deriv }
134 let deriv' = (cabal2nix pkg) { sha256 = sha256 deriv, runHaddock = runHaddock deriv }
134 deriv'' = deriv' { metaSection = (metaSection deriv')
135 deriv'' = deriv' { metaSection = (metaSection deriv')
135 { maintainers = maints'
136 { maintainers = maints'
@@ -140,7 +141,7 @@ updateNixPkgs paths = do
140 pkgset <- gets (selectLatestVersions . _pkgset)
141 pkgset <- gets (selectLatestVersions . _pkgset)
141 updates' <- flip mapM (Set.elems pkgset) $ \pkg -> do
142 updates' <- flip mapM (Set.elems pkgset) $ \pkg -> do
142 let Pkg deriv _ _ = pkg
143 let Pkg deriv _ _ = pkg
143− updates <- discoverUpdates (display (pname deriv)) (display (version deriv))
144+ updates <- discoverUpdates (pname deriv) (display (version deriv))
144 return (pkg,updates)
145 return (pkg,updates)
145 let updates = [ u | u@(_,(_:_)) <- updates' ]
146 let updates = [ u | u@(_,(_:_)) <- updates' ]
146 when (not (null updates)) $ do
147 when (not (null updates)) $ do
@@ -148,7 +149,7 @@ updateNixPkgs paths = do
148 flip mapM_ updates $ \(pkg,versions) -> do
149 flip mapM_ updates $ \(pkg,versions) -> do
149 let Pkg deriv path regenerate = pkg
150 let Pkg deriv path regenerate = pkg
150 msgInfo ""
151 msgInfo ""
151− msgInfo $ (display (pname deriv)) ++ "-" ++ (display (version deriv)) ++ ":"
152+ msgInfo $ (display (packageId deriv)) ++ ":"
152 flip mapM_ versions $ \newVersion -> do
153 flip mapM_ versions $ \newVersion -> do
153 let deriv' = deriv { version = readVersion newVersion }
154 let deriv' = deriv { version = readVersion newVersion }
154 msgInfo $ " " ++ genCabal2NixCmdline (Pkg deriv' path regenerate)
155 msgInfo $ " " ++ genCabal2NixCmdline (Pkg deriv' path regenerate)
@@ -159,7 +160,7 @@ genCabal2NixCmdline (Pkg deriv path _) = unwords $ ["cabal2nix"] ++ opts ++ [">"
159 where
160 where
160 meta = metaSection deriv
161 meta = metaSection deriv
161 opts = [cabal] ++ maints' ++ plats' ++ if runHaddock deriv then [] else ["--no-haddock"]
162 opts = [cabal] ++ maints' ++ plats' ++ if runHaddock deriv then [] else ["--no-haddock"]
162− cabal = "cabal://" ++ display (pname deriv) ++ "-" ++ display (version deriv)
163+ cabal = "cabal://" ++ display (packageId deriv)
163 maints' = [ "--maintainer=" ++ normalizeMaintainer m | m <- maintainers meta ]
164 maints' = [ "--maintainer=" ++ normalizeMaintainer m | m <- maintainers meta ]
164 plats'
165 plats'
165 | ["self.ghc.meta.platforms"] == platforms meta = []
166 | ["self.ghc.meta.platforms"] == platforms meta = []