git.iko.soy/typeable/cabal2nix
on master help sign in
Added support for parsing and generating the 'editedCabalFile' attribute.
859f11cPeter Simons
src/Cabal2Nix/Generate.hs+3
@@ -16,6 +16,7 @@ cabal2nix :: Cabal.GenericPackageDescription -> Derivation
16cabal2nix cabal = normalize $ postProcess MkDerivation
16cabal2nix cabal = normalize $ postProcess MkDerivation
17 { pname = let Cabal.PackageName x = Cabal.pkgName pkg in x
17 { pname = let Cabal.PackageName x = Cabal.pkgName pkg in x
18 , version = Cabal.pkgVersion pkg
18 , version = Cabal.pkgVersion pkg
19+ , revision = maybe 0 read (lookup "x-revision" xfields)
19 , src = error "cabal2nix left the src field undefined"
20 , src = error "cabal2nix left the src field undefined"
20 , isLibrary = isJust (Cabal.library tpkg)
21 , isLibrary = isJust (Cabal.library tpkg)
21 , isExecutable = not (null (Cabal.executables tpkg))
22 , isExecutable = not (null (Cabal.executables tpkg))
@@ -34,6 +35,7 @@ cabal2nix cabal = normalize $ postProcess MkDerivation
34 , hyperlinkSource = True
35 , hyperlinkSource = True
35 , enableSplitObjs = True
36 , enableSplitObjs = True
36 , phaseOverrides = ""
37 , phaseOverrides = ""
38+ , editedCabalFile= ""
37 , metaSection = Meta
39 , metaSection = Meta
38 { homepage = Cabal.homepage descr
40 { homepage = Cabal.homepage descr
39 , description = Cabal.synopsis descr
41 , description = Cabal.synopsis descr
@@ -45,6 +47,7 @@ cabal2nix cabal = normalize $ postProcess MkDerivation
45 }
47 }
46 where
48 where
47 descr = Cabal.packageDescription cabal
49 descr = Cabal.packageDescription cabal
50+ xfields = Cabal.customFieldsPD descr
48 pkg = Cabal.package descr
51 pkg = Cabal.package descr
49 deps = Cabal.buildDepends tpkg
52 deps = Cabal.buildDepends tpkg
50 tests = map Cabal.testBuildInfo (Cabal.testSuites tpkg)
53 tests = map Cabal.testBuildInfo (Cabal.testSuites tpkg)
src/Distribution/NixOS/Derivation/Cabal.hs+10−3
@@ -45,6 +45,7 @@ import Distribution.Text
45data Derivation = MkDerivation
45data Derivation = MkDerivation
46 { pname :: String
46 { pname :: String
47 , version :: Version
47 , version :: Version
48+ , revision :: Int
48 , src :: DerivationSource
49 , src :: DerivationSource
49 , isLibrary :: Bool
50 , isLibrary :: Bool
50 , isExecutable :: Bool
51 , isExecutable :: Bool
@@ -63,6 +64,7 @@ data Derivation = MkDerivation
63 , hyperlinkSource :: Bool
64 , hyperlinkSource :: Bool
64 , enableSplitObjs :: Bool
65 , enableSplitObjs :: Bool
65 , phaseOverrides :: String
66 , phaseOverrides :: String
67+ , editedCabalFile :: String
66 , metaSection :: Meta
68 , metaSection :: Meta
67 }
69 }
68 deriving (Show, Eq, Ord)
70 deriving (Show, Eq, Ord)
@@ -75,10 +77,11 @@ instance Package Derivation where
75 packageId deriv = PackageIdentifier (PackageName (pname deriv)) (version deriv)
77 packageId deriv = PackageIdentifier (PackageName (pname deriv)) (version deriv)
76
78
77instance NFData Derivation where
79instance NFData Derivation where
78− rnf (MkDerivation a b c d e f g h i j k l m n o p q r t u v) =
80+ rnf (MkDerivation a b c d e f g h i j k l m n o p q r t u v w x) =
79 a `deepseq` b `deepseq` c `deepseq` d `deepseq` e `deepseq` f `deepseq` g `deepseq`
81 a `deepseq` b `deepseq` c `deepseq` d `deepseq` e `deepseq` f `deepseq` g `deepseq`
80− h `deepseq` i `deepseq` j `deepseq` k `deepseq` l `deepseq` m `deepseqFlagAssignment` n `deepseq`
82+ h `deepseq` i `deepseq` j `deepseq` k `deepseq` l `deepseq` m `deepseq` n `deepseqFlagAssignment`
81− o `deepseq` p `deepseq` q `deepseq` r `deepseq` t `deepseq` u `deepseq` v `deepseq` ()
83+ o `deepseq` p `deepseq` q `deepseq` r `deepseq` t `deepseq` u `deepseq` v `deepseq`
84+ w `deepseq` x `deepseq` ()
82
85
83-- FlagName has no NFData instance in old version of Cabal.
86-- FlagName has no NFData instance in old version of Cabal.
84deepseqFlagAssignment :: FlagAssignment -> a -> a
87deepseqFlagAssignment :: FlagAssignment -> a -> a
@@ -93,6 +96,7 @@ renderDerivation deriv =
93 [ attr "pname" $ string (pname deriv)
96 [ attr "pname" $ string (pname deriv)
94 , attr "version" $ doubleQuotes (disp (version deriv))
97 , attr "version" $ doubleQuotes (disp (version deriv))
95 , sourceAttr (src deriv)
98 , sourceAttr (src deriv)
99+ , onlyIf (not (null (editedCabalFile deriv))) $ attr "editedCabalFile" $ string (editedCabalFile deriv)
96 , boolattr "isLibrary" (not (isLibrary deriv) || isExecutable deriv) (isLibrary deriv)
100 , boolattr "isLibrary" (not (isLibrary deriv) || isExecutable deriv) (isLibrary deriv)
97 , boolattr "isExecutable" (not (isLibrary deriv) || isExecutable deriv) (isExecutable deriv)
101 , boolattr "isExecutable" (not (isLibrary deriv) || isExecutable deriv) (isExecutable deriv)
98 , listattr "buildDepends" empty (buildDepends deriv)
102 , listattr "buildDepends" empty (buildDepends deriv)
@@ -153,9 +157,11 @@ parseDerivation buf
153 , docheck <- buf `regsubmatch` "doCheck *= *(true|false) *;"
157 , docheck <- buf `regsubmatch` "doCheck *= *(true|false) *;"
154 , hyperlSrc <- buf `regsubmatch` "hyperlinkSource *= *(true|false) *;"
158 , hyperlSrc <- buf `regsubmatch` "hyperlinkSource *= *(true|false) *;"
155 , splitObj <- buf `regsubmatch` "enableSplitObjs *= *(true|false) *;"
159 , splitObj <- buf `regsubmatch` "enableSplitObjs *= *(true|false) *;"
160+ , edtdCabal <- buf `regsubmatch` "editedCabalFile *= *\"([^\"]+)\""
156 = Just MkDerivation
161 = Just MkDerivation
157 { pname = name
162 { pname = name
158 , version = vers
163 , version = vers
164+ , revision = 0
159 , src = case (sr,url) of
165 , src = case (sr,url) of
160 ([] , _ ) -> DerivationSource "url" ("mirror://hackage/" ++ name ++ "-" ++ vers' ++ ".tar.gz") "" $ head sha
166 ([] , _ ) -> DerivationSource "url" ("mirror://hackage/" ++ name ++ "-" ++ vers' ++ ".tar.gz") "" $ head sha
161 (sr':_, [] ) -> DerivationSource "" sr' "" ""
167 (sr':_, [] ) -> DerivationSource "" sr' "" ""
@@ -179,6 +185,7 @@ parseDerivation buf
179 , hyperlinkSource = hyperlSrc == ["true"] || null hyperlSrc
185 , hyperlinkSource = hyperlSrc == ["true"] || null hyperlSrc
180 , enableSplitObjs = splitObj /= ["false"]
186 , enableSplitObjs = splitObj /= ["false"]
181 , phaseOverrides = ""
187 , phaseOverrides = ""
188+ , editedCabalFile = if null edtdCabal then [] else head edtdCabal
182 , metaSection = Meta
189 , metaSection = Meta
183 { homepage = ""
190 { homepage = ""
184 , description = ""
191 , description = ""
src/hackage4nix.hs+1−1
@@ -72,7 +72,7 @@ discoverNixFiles yield dirOrFile = do
72 (False,_) -> io (readDirectory dirOrFile) >>= mapM_ (discoverNixFiles yield . (dirOrFile </>))
72 (False,_) -> io (readDirectory dirOrFile) >>= mapM_ (discoverNixFiles yield . (dirOrFile </>))
73
73
74regenerateDerivation :: Derivation -> String -> Bool
74regenerateDerivation :: Derivation -> String -> Bool
75−regenerateDerivation _ buf = not (buf =~ "(pre|post)Configure|(pre|post)Install|patchPhase|patches|broken|editedCabalFile")
75+regenerateDerivation _ buf = not (buf =~ "(pre|post)Configure|(pre|post)Install|patchPhase|patches|broken")
76
76
77parseNixFile :: FilePath -> String -> Hackage4Nix (Maybe Pkg)
77parseNixFile :: FilePath -> String -> Hackage4Nix (Maybe Pkg)
78parseNixFile path buf
78parseNixFile path buf