cabal-debian 4.11 → 4.15
raw patch · 18 files changed
+236/−140 lines, 18 filesdep ~CabalPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: Cabal
API changes (from Hackage documentation)
- Debian.Debianize.Types: Top :: FilePath -> Top
- Debian.Debianize.Types: instance Eq Top
- Debian.Debianize.Types: instance Ord Top
- Debian.Debianize.Types: instance Show Top
- Debian.Debianize.Types: instance Typeable Top
- Debian.Debianize.Types: newtype Top
- Debian.Debianize.Types: unTop :: Top -> FilePath
+ Debian.Debianize.Bundled: aptCacheConflicts :: FilePath -> String -> DebianVersion -> [BinPkgName]
+ Debian.Debianize.Bundled: aptCacheDepends :: FilePath -> String -> String -> Either SomeException String
+ Debian.Debianize.Bundled: aptCacheProvides :: FilePath -> String -> [(DebianVersion, [BinPkgName])]
+ Debian.Debianize.Bundled: aptCacheShowPkg :: FilePath -> String -> Either SomeException String
+ Debian.Debianize.Bundled: aptVersions :: FilePath -> String -> [DebianVersion]
- Debian.Debianize: debianization :: (MonadIO m, Functor m) => Top -> DebT m () -> DebT m () -> DebT m ()
+ Debian.Debianize: debianization :: (MonadIO m, Functor m) => DebT m () -> DebT m () -> DebT m ()
- Debian.Debianize: doDebianizeAction :: (MonadIO m, Functor m) => Top -> EnvSet -> DebT m ()
+ Debian.Debianize: doDebianizeAction :: (MonadIO m, Functor m) => EnvSet -> DebT m ()
- Debian.Debianize: inputChangeLog :: MonadIO m => Top -> DebT m ()
+ Debian.Debianize: inputChangeLog :: MonadIO m => DebT m ()
- Debian.Debianize: inputDebianization :: MonadIO m => Top -> EnvSet -> DebT m ()
+ Debian.Debianize: inputDebianization :: MonadIO m => EnvSet -> DebT m ()
- Debian.Debianize: inputDebianizationFile :: MonadIO m => Top -> FilePath -> DebT m ()
+ Debian.Debianize: inputDebianizationFile :: MonadIO m => FilePath -> DebT m ()
- Debian.Debianize: substvars :: (MonadIO m, Functor m) => Top -> DebType -> DebT m ()
+ Debian.Debianize: substvars :: (MonadIO m, Functor m) => DebType -> DebT m ()
- Debian.Debianize: writeDebianization :: (MonadIO m, Functor m) => Top -> DebT m ()
+ Debian.Debianize: writeDebianization :: (MonadIO m, Functor m) => DebT m ()
- Debian.Debianize.Finalize: debianization :: (MonadIO m, Functor m) => Top -> DebT m () -> DebT m () -> DebT m ()
+ Debian.Debianize.Finalize: debianization :: (MonadIO m, Functor m) => DebT m () -> DebT m () -> DebT m ()
- Debian.Debianize.Input: inputCabalization :: (MonadIO m, Functor m) => Top -> DebT m ()
+ Debian.Debianize.Input: inputCabalization :: (MonadIO m, Functor m) => DebT m ()
- Debian.Debianize.Input: inputCabalization' :: Top -> Verbosity -> Set (FlagName, Bool) -> CompilerId -> IO (Either [Dependency] PackageDescription)
+ Debian.Debianize.Input: inputCabalization' :: Verbosity -> Set (FlagName, Bool) -> CompilerId -> IO (Either [Dependency] PackageDescription)
- Debian.Debianize.Input: inputChangeLog :: MonadIO m => Top -> DebT m ()
+ Debian.Debianize.Input: inputChangeLog :: MonadIO m => DebT m ()
- Debian.Debianize.Input: inputDebianization :: MonadIO m => Top -> EnvSet -> DebT m ()
+ Debian.Debianize.Input: inputDebianization :: MonadIO m => EnvSet -> DebT m ()
- Debian.Debianize.Input: inputDebianizationFile :: MonadIO m => Top -> FilePath -> DebT m ()
+ Debian.Debianize.Input: inputDebianizationFile :: MonadIO m => FilePath -> DebT m ()
- Debian.Debianize.Output: doDebianizeAction :: (MonadIO m, Functor m) => Top -> EnvSet -> DebT m ()
+ Debian.Debianize.Output: doDebianizeAction :: (MonadIO m, Functor m) => EnvSet -> DebT m ()
- Debian.Debianize.Output: writeDebianization :: (MonadIO m, Functor m) => Top -> DebT m ()
+ Debian.Debianize.Output: writeDebianization :: (MonadIO m, Functor m) => DebT m ()
- Debian.Debianize.SubstVars: substvars :: (MonadIO m, Functor m) => Top -> DebType -> DebT m ()
+ Debian.Debianize.SubstVars: substvars :: (MonadIO m, Functor m) => DebType -> DebT m ()
Files
- CabalDebian.hs +2/−6
- Tests.hs +24/−24
- cabal-debian.cabal +21/−6
- changelog +37/−1
- src/Debian/Debianize/BuildDependencies.hs +34/−15
- src/Debian/Debianize/Bundled.hs +57/−22
- src/Debian/Debianize/Details.hs +1/−0
- src/Debian/Debianize/Finalize.hs +5/−6
- src/Debian/Debianize/Goodies.hs +1/−1
- src/Debian/Debianize/Input.hs +31/−32
- src/Debian/Debianize/Output.hs +11/−12
- src/Debian/Debianize/SubstVars.hs +3/−5
- src/Debian/Debianize/Types.hs +4/−10
- test-data/alex/output/debian/rules +1/−0
- test-data/archive/output/debian/rules +1/−0
- test-data/artvaluereport-data/output/debian/rules +1/−0
- test-data/clckwrks-dot-com/output/debian/rules +1/−0
- test-data/creativeprompts/output/debian/rules +1/−0
CabalDebian.hs view
@@ -16,16 +16,12 @@ import Debian.Debianize.Options (compileCommandlineArgs, compileEnvironmentArgs, options) import Debian.Debianize.Output (doDebianizeAction) import Debian.Debianize.SubstVars (substvars)-import Debian.Debianize.Types (Top(Top)) import Debian.Debianize.Types.Atoms (DebAction(Debianize, SubstVar, Usage), EnvSet(EnvSet), debAction, newAtoms) import Distribution.Compiler (CompilerFlavor(GHC)) import Prelude hiding (unlines, writeFile, init) import System.Console.GetOpt (OptDescr, usageInfo) import System.Environment (getProgName) -top :: Top-top = Top "."- main :: IO () main = cabalDebianMain GHC debianDefaultAtoms @@ -40,8 +36,8 @@ where envset = EnvSet "/" "/" "/" finish :: forall m. (MonadIO m, Functor m) => DebAction -> DebT m ()- finish (SubstVar debType) = substvars top debType- finish Debianize = debianization top (return ()) (return ()) >> doDebianizeAction top envset+ finish (SubstVar debType) = substvars debType+ finish Debianize = debianization (return ()) (return ()) >> doDebianizeAction envset finish Usage = do progName <- liftIO getProgName let info = unlines [ "Typical usage is to cd to the top directory of the package's unpacked source and run: "
Tests.hs view
@@ -25,7 +25,7 @@ import Debian.Debianize.Goodies (doBackups, doExecutable, doServer, doWebsite, makeRulesHead, tightDependencyFixup) import Debian.Debianize.Input (inputChangeLog, inputDebianization) import Debian.Debianize.Monad (DebT, evalDebT, execDebM, execDebT)-import Debian.Debianize.Prelude ((%=), (+++=), (++=), (+=), (~=))+import Debian.Debianize.Prelude ((%=), (+++=), (++=), (+=), (~=), withCurrentDirectory) import Debian.Debianize.Types as T import Debian.Debianize.Types.Atoms as T import qualified Debian.Debianize.Types.BinaryDebDescription as B@@ -213,10 +213,10 @@ test3 :: String -> Test test3 label = TestLabel label $- TestCase (do let top = Top "test-data/haskell-devscripts"+ TestCase (do let top = "test-data/haskell-devscripts" envset = EnvSet "/" "/" "/" atoms <- testAtoms- deb <- execDebT (inputDebianization top envset) atoms+ deb <- withCurrentDirectory top (execDebT (inputDebianization envset) atoms) diff <- diffDebianizations (testDeb2 atoms) deb assertEqual label [] diff) where@@ -374,13 +374,13 @@ test4 :: String -> Test test4 label = TestLabel label $- TestCase (do let inTop = Top "test-data/clckwrks-dot-com/input"- outTop = Top "test-data/clckwrks-dot-com/output"+ TestCase (do let inTop = "test-data/clckwrks-dot-com/input"+ outTop = "test-data/clckwrks-dot-com/output" envset = EnvSet "/" "/" "/" atoms <- testAtoms- old <- execDebT (inputDebianization outTop envset) atoms+ old <- withCurrentDirectory outTop (execDebT (inputDebianization envset) atoms) let log = getL T.changelog old- new <- execDebT (debianization inTop defaultAtoms (customize log)) atoms+ new <- withCurrentDirectory inTop (execDebT (debianization defaultAtoms (customize log)) atoms) diff <- diffDebianizations old ({-copyFirstLogEntry old-} new) assertEqual label [] diff) where@@ -486,14 +486,14 @@ test5 :: String -> Test test5 label = TestLabel label $- TestCase (do let inTop = (Top "test-data/creativeprompts/input")- outTop = (Top "test-data/creativeprompts/output")+ TestCase (do let inTop = "test-data/creativeprompts/input"+ outTop = "test-data/creativeprompts/output" envset = EnvSet "/" "/" "/" atoms <- testAtoms- old <- execDebT (inputDebianization outTop envset) atoms+ old <- withCurrentDirectory outTop (execDebT (inputDebianization envset) atoms) let standards = getL T.standardsVersion old level = getL T.compat old- new <- execDebT (debianization inTop defaultAtoms (customize old level standards)) atoms+ new <- withCurrentDirectory inTop (execDebT (debianization defaultAtoms (customize old level standards)) atoms) diff <- diffDebianizations old new assertEqual label [] diff) where@@ -584,13 +584,13 @@ test8 :: String -> Test test8 label = TestLabel label $- TestCase ( do let inTop = Top "test-data/artvaluereport-data/input"- outTop = Top "test-data/artvaluereport-data/output"+ TestCase ( do let inTop = "test-data/artvaluereport-data/input"+ outTop = "test-data/artvaluereport-data/output" envset = EnvSet "/" "/" "/" atoms <- testAtoms- old <- execDebT (inputDebianization outTop envset) atoms- log <- evalDebT (inputChangeLog inTop >> access T.changelog) atoms- new <- execDebT (debianization inTop defaultAtoms (customize log)) atoms+ old <- withCurrentDirectory outTop (execDebT (inputDebianization envset) atoms)+ log <- withCurrentDirectory inTop (evalDebT (inputChangeLog >> access T.changelog) atoms)+ new <- withCurrentDirectory inTop (execDebT (debianization defaultAtoms (customize log)) atoms) diff <- diffDebianizations old new assertEqual label [] diff )@@ -606,13 +606,13 @@ test9 :: String -> Test test9 label = TestLabel label $- TestCase (do let inTop = Top "test-data/alex/input"- outTop = Top "test-data/alex/output"+ TestCase (do let inTop = "test-data/alex/input"+ outTop = "test-data/alex/output" envset = EnvSet "/" "/" "/" atoms <- testAtoms- old <- execDebT (inputDebianization outTop envset) atoms+ old <- withCurrentDirectory outTop (execDebT (inputDebianization envset) atoms) let Just (ChangeLog (entry : _)) = getL T.changelog old- new <- execDebT (debianization inTop defaultAtoms customize >> copyChangelogDate (logDate entry)) atoms+ new <- withCurrentDirectory inTop (execDebT (debianization defaultAtoms customize >> copyChangelogDate (logDate entry)) atoms) diff <- diffDebianizations old new assertEqual label [] diff) where@@ -644,13 +644,13 @@ test10 :: String -> Test test10 label = TestLabel label $- TestCase (do let inTop = Top "test-data/archive/input"- outTop = Top "test-data/archive/output"+ TestCase (do let inTop = "test-data/archive/input"+ outTop = "test-data/archive/output" envset = EnvSet "/" "/" "/" atoms <- testAtoms- old <- execDebT (inputDebianization outTop envset) atoms+ old <- withCurrentDirectory outTop (execDebT (inputDebianization envset) atoms) let Just (ChangeLog (entry : _)) = getL T.changelog old- new <- execDebT (debianization inTop defaultAtoms customize >> copyChangelogDate (logDate entry)) atoms+ new <- withCurrentDirectory inTop (execDebT (debianization defaultAtoms customize >> copyChangelogDate (logDate entry)) atoms) diff <- diffDebianizations old new assertEqual label [] diff) where
cabal-debian.cabal view
@@ -1,11 +1,11 @@ Name: cabal-debian-Version: 4.11+Version: 4.15 License: BSD3 License-File: debian/copyright Author: David Fox <dsf@seereason.com> Category: Debian, Distribution, System Maintainer: David Fox <dsf@seereason.com>-Homepage: http://src.seereason.com/debian-tools/cabal-debian+Homepage: http://src.seereason.com/cabal-debian Build-Type: Simple Synopsis: Create a debianization for a cabal package Cabal-Version: >= 1.8@@ -140,6 +140,10 @@ Default: False Manual: True +Flag ghcjs-support+ Description: Pulls in Cabal-1.21, which includes support for the ghcjs compiler.+ Default: True+ -- flag local-debian -- Description: Link directly to the source of the debian library -- Default: False@@ -147,14 +151,13 @@ Source-Repository head type: darcs- location: http://src.seereason.com/debian-tools+ location: http://src.seereason.com/cabal-debian Library Hs-Source-Dirs: src GHC-Options: -Wall -O2 Build-Depends: base < 5,- Cabal >= 1.9, containers, data-lens, data-lens-template,@@ -176,6 +179,10 @@ unix, Unixutils, utf8-string+ if flag(ghcjs-support)+ Build-Depends: Cabal >= 1.21+ else+ Build-Depends: Cabal >= 1.9 Exposed-Modules: Data.Algorithm.Diff.Context Data.Algorithm.Diff.Pretty@@ -215,10 +222,18 @@ Hs-Source-Dirs: . Main-is: CabalDebian.hs ghc-options: -threaded -Wall -O2- Build-Depends: base, Cabal, cabal-debian, data-lens, mtl+ Build-Depends: base, cabal-debian, data-lens, mtl+ if flag(ghcjs-support)+ Build-Depends: Cabal >= 1.21+ else+ Build-Depends: Cabal >= 1.9 Executable cabal-debian-tests Hs-Source-Dirs: . Main-is: Tests.hs ghc-options: -threaded -Wall -O2- Build-Depends: base, Cabal, cabal-debian, containers, data-lens, debian, filepath, hsemail, HUnit, process, text+ Build-Depends: base, cabal-debian, containers, data-lens, debian, filepath, hsemail, HUnit, process, text+ if flag(ghcjs-support)+ Build-Depends: Cabal >= 1.21+ else+ Build-Depends: Cabal >= 1.9
changelog view
@@ -1,3 +1,40 @@+haskell-cabal-debian (4.15) unstable; urgency=low++ * Don't hardcode the compiler name in makefile targets.++ -- David Fox <dsf@seereason.com> Sat, 12 Jul 2014 12:15:10 -0700++haskell-cabal-debian (4.14) unstable; urgency=low++ * Map package name Cabal to debian package name cabal.++ -- David Fox <dsf@seereason.com> Sat, 05 Jul 2014 20:27:21 -0700++haskell-cabal-debian (4.14) unstable; urgency=low++ * Map package name Cabal to debian package name cabal.++ -- David Fox <dsf@seereason.com> Sat, 05 Jul 2014 20:27:21 -0700++haskell-cabal-debian (4.13) unstable; urgency=low++ * Add a flag for ghcjs support.++ -- David Fox <dsf@seereason.com> Thu, 03 Jul 2014 12:05:21 -0700++haskell-cabal-debian (4.12) unstable; urgency=low++ * Remove the Top type and argument - use getWorkingDirectory instead.++ -- David Fox <dsf@seereason.com> Sun, 29 Jun 2014 08:11:01 -0700++haskell-cabal-debian (4.11) unstable; urgency=low++ * Use MonadIO instead of IO for all signatures. This is so+ we can more easily use cabal debian from a Shelly script.++ -- David Fox <dsf@seereason.com> Sun, 29 Jun 2014 07:16:45 -0700+ haskell-cabal-debian (4.10.1) unstable; urgency=low * Fix a tail exception in builtIn.@@ -872,4 +909,3 @@ * Debianization generated by cabal-debian -- David Fox <dsf@seereason.com> Sun, 18 Sep 2011 06:40:21 -0700-
src/Debian/Debianize/BuildDependencies.hs view
@@ -1,5 +1,5 @@ -- | Compute the debianization of a cabal package.-{-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-}+{-# LANGUAGE CPP, OverloadedStrings, ScopedTypeVariables #-} module Debian.Debianize.BuildDependencies ( debianBuildDeps , debianBuildDepsIndep@@ -23,10 +23,14 @@ import qualified Debian.Debianize.Types.BinaryDebDescription as B (PackageType(Development, Documentation, Profiling)) import Debian.Debianize.VersionSplits (packageRangesFromVersionSplits) import Debian.Orphans ()-import Debian.Relation (BinPkgName, Relation(..), Relations, checkVersionReq)+import Debian.Relation (BinPkgName(..), Relation(..), Relations, checkVersionReq) import qualified Debian.Relation as D (BinPkgName(BinPkgName), Relation(..), Relations, VersionReq(EEQ, GRE, LTE, SGR, SLT)) import Debian.Version (DebianVersion, parseDebianVersion)+#if MIN_VERSION_Cabal(1,21,0)+import Distribution.Compiler (CompilerFlavor(GHC, GHCJS))+#else import Distribution.Compiler (CompilerFlavor(GHC))+#endif import Distribution.Package (Dependency(..), PackageIdentifier(..), PackageName(PackageName)) import Distribution.PackageDescription (PackageDescription) import Distribution.PackageDescription as Cabal (allBuildInfo, BuildInfo(..), BuildInfo(buildTools, extraLibs, pkgconfigDepends), Executable(..))@@ -85,11 +89,15 @@ cfl <- access compilerFlavor let xs = nub $ [[D.Rel (D.BinPkgName "debhelper") (Just (D.GRE (parseDebianVersion ("7.0" :: String)))) Nothing], [D.Rel (D.BinPkgName "haskell-devscripts") (Just (D.GRE (parseDebianVersion ("0.8" :: String)))) Nothing],- anyrel "cdbs",- anyrel "ghc"] ++- bDeps ++- (if prof && cfl == GHC then [anyrel "ghc-prof"] else []) ++- cDeps+ anyrel "cdbs"] +++ (case cfl of+ GHC -> [anyrel "ghc"] ++ if prof then [anyrel "ghc-prof"] else []+#if MIN_VERSION_Cabal(1,21,0)+ GHCJS -> [anyrel "ghcjs"]+#endif+ x -> error ("Unsupported compiler flavor: " ++ show x)) +++ bDeps +++ cDeps filterMissing xs where cabalDeps =@@ -281,20 +289,31 @@ let pver = maybe Nothing (Just . debianVersion'' atoms name) (builtIn splits hc root name) -- The name this library would have if it was in the compiler conflicts list. let naiveDebianName = mkPkgName hc name typ- return $ -- The compiler should appear in the build dependency if- -- it provides a suitable version of the library, or- -- if it conflicts with all versions of the library.- (if isJust pver && (checkVersionReq req pver || dname == naiveDebianName) then [comp] else []) +++ return $ -- The compiler should appear in the build dependency+ -- if it provides a suitable version of the library,+ -- or if it conflicts with all versions of the+ -- library (which, if pver is Nothing, will certainly+ -- result in an error which needs to be corrected in+ -- the packaging.)+ (if isJust pver && (checkVersionReq req pver || (dname == naiveDebianName && conflictsWithHC naiveDebianName)) then [comp] else []) ++ -- The library package can satisfy the dependency if -- the compiler doesn't provide a version, or if the- -- debian name of the library package is different- -- from the debian name of the library package the- -- compiler provides.- (if isNothing pver || dname /= naiveDebianName then [rel] else [])+ -- compiler doesn't conflict with the package's+ -- debian name.+ (if isNothing pver || dname /= naiveDebianName || not (conflictsWithHC naiveDebianName) then [rel] else []) compilerPackageName B.Documentation = D.BinPkgName "ghc-doc" compilerPackageName B.Profiling = D.BinPkgName "ghc-prof" compilerPackageName B.Development = D.BinPkgName "ghc" compilerPackageName _ = D.BinPkgName "ghc" -- whatevs++ -- FIXME: we are assuming here that ghc conflicts with all the+ -- library packages it provides but it no longer conflicts with+ -- libghc-cabal-dev. We can now check these conflicts using the+ -- new functions in Bundled.+ conflictsWithHC (BinPkgName "libghc-cabal-dev") = False+ conflictsWithHC (BinPkgName "libghc-cabal-prof") = False+ conflictsWithHC (BinPkgName "libghc-cabal-doc") = False+ conflictsWithHC _ = True {- doBundled :: MonadIO m =>
src/Debian/Debianize/Bundled.hs view
@@ -4,23 +4,28 @@ {-# LANGUAGE CPP, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell #-} module Debian.Debianize.Bundled ( builtIn+ -- * Utilities+ , aptCacheShowPkg+ , aptCacheProvides+ , aptCacheDepends+ , aptCacheConflicts+ , aptVersions ) where -import Control.Applicative ((<$>)) import Control.DeepSeq (force) import Control.Exception (try, SomeException) import Data.Char (toLower) import Data.Function (on)-import Data.Function.Memoize (memoize2)+import Data.Function.Memoize (memoize2, memoize3) import Data.List (sortBy, isPrefixOf) import Data.Map as Map (Map) import Data.Maybe (mapMaybe, listToMaybe) import Data.Version (Version(..), parseVersion) import Debian.Debianize.VersionSplits (DebBase(DebBase), VersionSplits, cabalFromDebian') import Debian.GHC ({- Memoizable instances -})-import Debian.Relation (BinPkgName(..))+import Debian.Relation (BinPkgName(..), parseRelations) import Debian.Relation.ByteString()-import Debian.Version (DebianVersion, parseDebianVersion)+import Debian.Version (DebianVersion, parseDebianVersion, prettyDebianVersion) import Distribution.Simple.Compiler (CompilerFlavor(..), {-PackageDB(GlobalPackageDB), compilerFlavor-}) import Distribution.Package (PackageIdentifier(..), PackageName(..) {-, Dependency(..)-}) import System.IO.Unsafe (unsafePerformIO)@@ -37,7 +42,7 @@ -- compilers it maybe be unimplemented. builtIn :: Map PackageName VersionSplits -> CompilerFlavor -> FilePath -> PackageName -> Maybe Version builtIn splits hc root lib = do- f $ memoize2 (\ hc' root' -> unsafePerformIO (builtIn' splits hc' root')) hc root+ f $ builtIn' splits hc root where f :: (DebianVersion, [PackageIdentifier]) -> Maybe Version f (hcv, ids) = case map pkgVersion (filter (\ i -> pkgName i == lib) ids) of@@ -47,21 +52,15 @@ -- | Ok, lets see if we can infer the built in packages from the -- Provides field returned by apt-cache.-builtIn' :: Map PackageName VersionSplits -> CompilerFlavor -> FilePath -> IO (DebianVersion, [PackageIdentifier])+builtIn' :: Map PackageName VersionSplits -> CompilerFlavor -> FilePath -> (DebianVersion, [PackageIdentifier]) builtIn' splits hc root = do- lns <- lines . either (\ (e :: SomeException) -> error $ "builtIn: " ++ show e) id <$> try (chroot root (readProcess "apt-cache" ["showpkg", hcname] ""))- let hcs = map words $ takeBetween (isPrefixOf "Provides:") (isPrefixOf "Reverse Provides:") lns- hcs' = reverse . sortBy (compare `on` fst) . map doHCVersion $ hcs- case hcs' of+ -- Find out what library versions are provided by the latest version+ -- of the compiler.+ case aptCacheProvides root hcname of [] -> error $ "No versions of " ++ show hc ++ " (" ++ show hcname ++ ") in " ++ show root- ((v, pids) : _) -> return (v, pids)+ ((v, pids) : _) -> (v, mapMaybe (parsePackageID . unBinPkgName) pids) where BinPkgName hcname = BinPkgName (map toLower (show hc))- -- Find out what library versions are provided by the latest version- -- of the compiler.- doHCVersion :: [String] -> (DebianVersion, [PackageIdentifier])- doHCVersion (versionString : "-" : deps) = (parseDebianVersion versionString, mapMaybe parsePackageID deps)- doHCVersion x = error $ "Unexpected output from apt-cache: " ++ show x -- The virtual package id, which appears in the Provides -- line for the compiler package, is generated by the -- function package_id_to_virtual_package in Dh_Haskell.sh.@@ -69,13 +68,49 @@ -- first five characters of the checksum. -- parsePID "libghc-unix-dev-2.7.0.1-2a456" -> Just (PackageIdentifier "unix" (Version [2,7,0,1] [])) parsePackageID :: String -> Maybe PackageIdentifier- parsePackageID s = case s =~ ("lib" ++ hcname ++ "-(.*)-dev-([0-9.]*)-.....$") :: (String, String, String, [String]) of- (_, _, _, [base, vs]) -> case listToMaybe (map fst $ filter ((== "") . snd) $ readP_to_S parseVersion $ vs) of- Just v -> Just (cabalFromDebian' splits (DebBase base) v)- Nothing -> Nothing- _ -> Nothing+ parsePackageID s =+ case s =~ ("lib" ++ hcname ++ "-(.*)-dev-([0-9.]*)-.....$") :: (String, String, String, [String]) of+ (_, _, _, [base, vs]) -> case listToMaybe (map fst $ filter ((== "") . snd) $ readP_to_S parseVersion $ vs) of+ Just v -> Just (cabalFromDebian' splits (DebBase base) v)+ Nothing -> Nothing+ _ -> Nothing++aptCacheShowPkg :: FilePath -> String -> Either SomeException String+aptCacheShowPkg =+ memoize2 (\ root hcname -> unsafePerformIO (try (chroot root (readProcess "apt-cache" ["showpkg", hcname] ""))))+ where chroot "/" = id- chroot _ = useEnv root (return . force)+ chroot root = useEnv root (return . force)++aptCacheProvides :: FilePath -> String -> [(DebianVersion, [BinPkgName])]+aptCacheProvides root hcname =+ let lns = lines . either (\ (e :: SomeException) -> error $ "builtIn: " ++ show e) id $ aptCacheShowPkg root hcname+ hcs = map words $ takeBetween (isPrefixOf "Provides:") (isPrefixOf "Reverse Provides:") lns+ hcs' = reverse . sortBy (compare `on` fst) . map doHCVersion $ hcs in+ hcs'+ where+ doHCVersion :: [String] -> (DebianVersion, [BinPkgName])+ doHCVersion (versionString : "-" : deps) = (parseDebianVersion versionString, map BinPkgName deps)+ doHCVersion x = error $ "Unexpected output from apt-cache: " ++ show x++aptCacheDepends :: FilePath -> String -> String -> Either SomeException String+aptCacheDepends =+ memoize3 (\ root hcname ver -> unsafePerformIO (try (chroot root (readProcess "apt-cache" ["depends", hcname ++ "=" ++ ver] ""))))+ where+ chroot "/" = id+ chroot root = useEnv root (return . force)++aptCacheConflicts :: FilePath -> String -> DebianVersion -> [BinPkgName]+aptCacheConflicts root hcname ver =+ either (\ _ -> []) (mapMaybe doLine . lines) (aptCacheDepends root hcname (show (prettyDebianVersion ver)))+ where+ doLine s = case s =~ "^[ ]*Conflicts:[ ]*<(.*)>$" :: (String, String, String, [String]) of+ (_, _, _, [name]) -> Just (BinPkgName name)+ _ -> Nothing++aptVersions :: FilePath -> String -> [DebianVersion]+aptVersions root hcname =+ either (\ _ -> []) (map parseDebianVersion . filter (/= "") . map (takeWhile (/= ' ')) . takeWhile (not . isPrefixOf "Reverse Depends:") . drop 1 . dropWhile (not . isPrefixOf "Versions:") . lines) (aptCacheShowPkg root hcname) takeBetween :: (a -> Bool) -> (a -> Bool) -> [a] -> [a] takeBetween startPred endPred = takeWhile (not . endPred) . dropWhile startPred . dropWhile (not . startPred)
src/Debian/Debianize/Details.hs view
@@ -19,6 +19,7 @@ debianDefaultAtoms = do T.epochMap ++= (PackageName "HaXml", 1) T.epochMap ++= (PackageName "HTTP", 1)+ mapCabal (PackageName "Cabal") (DebBase "cabal") mapCabal (PackageName "parsec") (DebBase "parsec3") splitCabal (PackageName "parsec") (DebBase "parsec2") (Version [3] []) mapCabal (PackageName "QuickCheck") (DebBase "quickcheck2")
src/Debian/Debianize/Finalize.hs view
@@ -30,7 +30,6 @@ import Debian.Debianize.Monad as Monad (DebT) import Debian.Debianize.Options (compileCommandlineArgs, compileEnvironmentArgs) import Debian.Debianize.Prelude ((%=), (+++=), (+=), foldEmpty, fromEmpty, fromSingleton, (~=), (~?=))-import Debian.Debianize.Types (Top) import qualified Debian.Debianize.Types as T (apacheSite, backups, binaryArchitectures, binaryPackages, binarySection, breaks, buildDepends, buildDependsIndep, buildDir, builtUsing, changelog, comments, compat, conflicts, debianDescription, debVersion, depends, epochMap, executable, extraDevDeps, extraLibMap, file, install, installCabalExec, installCabalExecTo, installData, installDir, installTo, intermediateFiles, license, link, maintainer, noDocumentationLibrary, noProfilingLibrary, noHoogle, packageDescription, packageType, preDepends, provides, recommends, replaces, revision, rulesFragments, serverInfo, source, sourcePackageName, sourcePriority, sourceSection, suggests, utilsPackageNames, verbosity, watch, website) import qualified Debian.Debianize.Types.Atoms as A (InstallFile(execName, sourceDir), showAtoms, compilerFlavor) import qualified Debian.Debianize.Types.BinaryDebDescription as B (BinaryDebDescription, package, PackageType(Development, Documentation, Exec, Profiling, Source', Utilities))@@ -55,12 +54,12 @@ -- description and possibly the debian/changelog file, then generate -- and return the new debianization (along with the data directory -- computed from the cabal package description.)-debianization :: (MonadIO m, Functor m) => Top -> DebT m () -> DebT m () -> DebT m ()-debianization top init customize =+debianization :: (MonadIO m, Functor m) => DebT m () -> DebT m () -> DebT m ()+debianization init customize = do compileEnvironmentArgs compileCommandlineArgs- inputCabalization top- inputChangeLog top+ inputCabalization+ inputChangeLog inputMaintainer init customize@@ -338,7 +337,7 @@ -- If any files belong in the utils packages, make sure they exist when (not (Set.null utilsData && Set.null utilsExec)) (Set.mapM_ (\ p -> do -- This is really for all binary debs except the libraries - I'm not sure why- T.rulesFragments += (pack ("build" </> show (pretty p) ++ ":: build-ghc-stamp"))+ T.rulesFragments += (pack ("build" </> show (pretty p) ++ ":: build-$(HC)-stamp")) T.binaryArchitectures p ~?= Just (if Set.null utilsExec then All else Any) T.binarySection p ~?= Just (MainSection "misc") binaryPackageRelations p B.Utilities) utilsPackages)
src/Debian/Debianize/Goodies.hs view
@@ -335,7 +335,7 @@ -- FIXME - use Atoms execAtoms :: BinPkgName -> T.InstallFile -> Atoms -> Atoms execAtoms b ifile r =- modL T.rulesFragments (Set.insert (pack ("build" </> show (pretty b) ++ ":: build-ghc-stamp"))) .+ modL T.rulesFragments (Set.insert (pack ("build" </> show (pretty b) ++ ":: build-$(HC)-stamp"))) . fileAtoms b ifile $ r
src/Debian/Debianize/Input.hs view
@@ -39,8 +39,7 @@ license, licenseFile, copyright, changelog, installInit, postInst, postRm, preInst, preRm, logrotateStanza, link, install, installDir, intermediateFiles, cabalFlagAssignments, verbosity, buildEnv) import Debian.Debianize.Monad (DebT)-import Debian.Debianize.Prelude (getDirectoryContents', withCurrentDirectory, readFileMaybe, read', intToVerbosity', (~=), (~?=), (+=), (++=), (+++=))-import Debian.Debianize.Types (Top(unTop))+import Debian.Debianize.Prelude (getDirectoryContents', readFileMaybe, read', intToVerbosity', (~=), (~?=), (+=), (++=), (+++=)) import Debian.Debianize.Types.Atoms (EnvSet(dependOS)) import Debian.GHC (newestAvailableCompilerId) import Debian.Orphans ()@@ -64,7 +63,7 @@ import Distribution.Verbosity (Verbosity) import Prelude hiding (readFile, lines, words, break, null, log, sum, (.)) -- import qualified Prelude (lines)-import System.Directory (doesFileExist)+import System.Directory (doesFileExist, getCurrentDirectory) import System.Exit (ExitCode(..)) import System.FilePath ((</>), takeExtension, dropExtension) import System.Posix.Files (setFileCreationMask)@@ -73,25 +72,25 @@ -- import System.Unix.Chroot (useEnv) -- import Text.ParserCombinators.Parsec.Rfc2822 (NameAddr) -inputDebianization :: MonadIO m => Top -> EnvSet -> DebT m ()-inputDebianization top envset =+inputDebianization :: MonadIO m => EnvSet -> DebT m ()+inputDebianization envset = do -- Erase any the existing information hc <- access T.compilerFlavor let atoms = T.makeAtoms hc envset put atoms- (ctl, _) <- inputSourceDebDescription top- inputAtomsFromDirectory top+ (ctl, _) <- inputSourceDebDescription+ inputAtomsFromDirectory control ~= ctl -- | Try to input a file and if successful add it to the debianization.-inputDebianizationFile :: MonadIO m => Top -> FilePath -> DebT m ()-inputDebianizationFile top path =- do inputAtomsFromDirectory top- liftIO (readFileMaybe (unTop top </> path)) >>= maybe (return ()) (\ text -> intermediateFiles += (path, text))+inputDebianizationFile :: MonadIO m => FilePath -> DebT m ()+inputDebianizationFile path =+ do inputAtomsFromDirectory+ liftIO (readFileMaybe path) >>= maybe (return ()) (\ text -> intermediateFiles += (path, text)) -inputSourceDebDescription :: MonadIO m => Top -> DebT m (S.SourceDebDescription, [Field])-inputSourceDebDescription top =- do paras <- liftIO $ parseControlFromFile (unTop top </> "debian/control") >>= either (error . show) (return . unControl)+inputSourceDebDescription :: MonadIO m => DebT m (S.SourceDebDescription, [Field])+inputSourceDebDescription =+ do paras <- liftIO $ parseControlFromFile "debian/control" >>= either (error . show) (return . unControl) case paras of [] -> error "Missing source paragraph" [_] -> error "Missing binary paragraph"@@ -195,24 +194,24 @@ yes "no" = False yes x = error $ "Expecting yes or no: " ++ x -inputChangeLog :: MonadIO m => Top -> DebT m ()-inputChangeLog top =- do log <- liftIO $ tryIOError (readFile (unTop top </> "debian/changelog") >>= return . parseChangeLog . unpack)+inputChangeLog :: MonadIO m => DebT m ()+inputChangeLog =+ do log <- liftIO $ tryIOError (readFile "debian/changelog" >>= return . parseChangeLog . unpack) changelog ~?= either (\ _ -> Nothing) Just log -inputAtomsFromDirectory :: MonadIO m => Top -> DebT m () -- .install files, .init files, etc.-inputAtomsFromDirectory top =+inputAtomsFromDirectory :: MonadIO m => DebT m () -- .install files, .init files, etc.+inputAtomsFromDirectory = do findFiles- doFiles (unTop top </> "debian/cabalInstall")+ doFiles ("./debian/cabalInstall") where -- Find regular files in the debian/ or in debian/source/format/ and -- add them to the debianization. findFiles :: MonadIO m => DebT m () findFiles =- liftIO (getDirectoryContents' (unTop top </> "debian")) >>=+ liftIO (getDirectoryContents' ("debian")) >>= return . (++ ["source/format"]) >>=- liftIO . filterM (doesFileExist . ((unTop top </> "debian") </>)) >>= \ names ->- mapM_ (inputAtoms (unTop top </> "debian")) names+ liftIO . filterM (doesFileExist . (("debian") </>)) >>= \ names ->+ mapM_ (inputAtoms ("debian")) names doFiles :: MonadIO m => FilePath -> DebT m () doFiles tmp = do sums <- liftIO $ getDirectoryContents' tmp `catchIOError` (\ _ -> return [])@@ -273,15 +272,16 @@ readDir :: Monad m => BinPkgName -> Text -> DebT m () readDir p line = installDir +++= (p, singleton (unpack line)) -inputCabalization :: (MonadIO m, Functor m) => Top -> DebT m ()-inputCabalization top =+inputCabalization :: (MonadIO m, Functor m) => DebT m ()+inputCabalization = do hc <- access T.compilerFlavor vb <- access verbosity >>= return . intToVerbosity' flags <- access cabalFlagAssignments root <- dependOS <$> access buildEnv let mcid = newestAvailableCompilerId hc root- ePkgDesc <- liftIO $ inputCabalization' top vb flags mcid- either (\ deps -> error $ "Missing dependencies in cabal package at " ++ show (unTop top) ++ ": " ++ show deps)+ ePkgDesc <- liftIO $ inputCabalization' vb flags mcid+ either (\ deps -> liftIO getCurrentDirectory >>= \ here ->+ error $ "Missing dependencies in cabal package at " ++ here ++ ": " ++ show deps) (\ pkgDesc -> do packageDescription ~= Just pkgDesc -- This will contain either the contents of the file given in@@ -291,11 +291,11 @@ #if MIN_VERSION_Cabal(1,19,0) licenseFileText <- liftIO $ case Cabal.licenseFiles pkgDesc of [] -> return Nothing- (path : _) -> readFileMaybe (unTop top </> path) -- better than nothing+ (path : _) -> readFileMaybe path -- better than nothing #else licenseFileText <- liftIO $ case Cabal.licenseFile pkgDesc of "" -> return Nothing- path -> readFileMaybe (unTop top </> path)+ path -> readFileMaybe path #endif licenseFile ~?= licenseFileText copyright ~?= (case Cabal.copyright pkgDesc of@@ -303,9 +303,8 @@ s -> Just (pack s))) ePkgDesc -inputCabalization' :: Top -> Verbosity -> Set (FlagName, Bool) -> CompilerId -> IO (Either [Dependency] PackageDescription)-inputCabalization' top vb flags cid =- withCurrentDirectory (unTop top) $ do+inputCabalization' :: Verbosity -> Set (FlagName, Bool) -> CompilerId -> IO (Either [Dependency] PackageDescription)+inputCabalization' vb flags cid = do descPath <- defaultPackageDesc vb genPkgDesc <- readPackageDescription vb descPath case finalizePackageDescription (toList flags) (const True) (Platform buildArch buildOS) cid [] genPkgDesc of
src/Debian/Debianize/Output.hs view
@@ -25,13 +25,12 @@ import Data.Maybe (fromMaybe) import Data.Text as Text (split, Text, unpack) import Debian.Changes (ChangeLog(..), ChangeLogEntry(..))-import Debian.Debianize.Types (Top(unTop)) import Debian.Debianize.Types.Atoms (EnvSet) import Debian.Debianize.Files (debianizationFileMap) import Debian.Debianize.Input (inputDebianization) import Debian.Debianize.Monad (DebT, Atoms, evalDebT) import Debian.Debianize.Options (putEnvironmentArgs)-import Debian.Debianize.Prelude (indent, replaceFile, withCurrentDirectory, zipMaps)+import Debian.Debianize.Prelude (indent, replaceFile, zipMaps) import qualified Debian.Debianize.Types as T import qualified Debian.Debianize.Types.BinaryDebDescription as B (package) import qualified Debian.Debianize.Types.SourceDebDescription as S (source)@@ -70,27 +69,27 @@ -- | Depending on the options in @atoms@, either validate, describe, -- or write the generated debianization.-doDebianizeAction :: (MonadIO m, Functor m) => Top -> EnvSet -> DebT m ()-doDebianizeAction top envset =+doDebianizeAction :: (MonadIO m, Functor m) => EnvSet -> DebT m ()+doDebianizeAction envset = do new <- get case () of _ | getL T.validate new ->- do inputDebianization top envset+ do inputDebianization envset old <- get return $ validateDebianization old new _ | getL T.dryRun new ->- do inputDebianization top envset+ do inputDebianization envset old <- get diff <- liftIO $ compareDebianization old new liftIO $ putStr ("Debianization (dry run):\n" ++ diff)- _ -> writeDebianization top+ _ -> writeDebianization --- | Write the files of the debianization @d@ to the directory @top@.-writeDebianization :: (MonadIO m, Functor m) => Top -> DebT m ()-writeDebianization top =+-- | Write the files of the debianization @d@ to ./debian+writeDebianization :: (MonadIO m, Functor m) => DebT m ()+writeDebianization = do files <- debianizationFileMap- liftIO $ withCurrentDirectory (unTop top) $ mapM_ (uncurry doFile) (Map.toList files)- liftIO $ getPermissions (unTop top </> "debian/rules") >>= setPermissions (unTop top </> "debian/rules") . (\ p -> p {executable = True})+ liftIO $ mapM_ (uncurry doFile) (Map.toList files)+ liftIO $ getPermissions "debian/rules" >>= setPermissions "debian/rules" . (\ p -> p {executable = True}) where doFile path text = do createDirectoryIfMissing True (takeDirectory path)
src/Debian/Debianize/SubstVars.hs view
@@ -24,7 +24,6 @@ import Debian.Debianize.Input (inputCabalization) import Debian.Debianize.Monad (DebT) import Debian.Debianize.Prelude ((!), buildDebVersionMap, cond, DebMap, debOfFile, diffFile, dpkgFileMap, replaceFile, showDeps, modifyM)-import Debian.Debianize.Types (Top) import qualified Debian.Debianize.Types.Atoms as T import Debian.Orphans () import Debian.Pretty (pretty)@@ -60,11 +59,10 @@ -- these we can determine the source package name, and from that the -- documentation package name. substvars :: (MonadIO m, Functor m) =>- Top- -> T.DebType -- ^ The type of deb we want to write substvars for - Dev, Prof, or Doc+ T.DebType -- ^ The type of deb we want to write substvars for - Dev, Prof, or Doc -> DebT m ()-substvars top debType =- do inputCabalization top+substvars debType =+ do inputCabalization debVersions <- liftIO buildDebVersionMap modifyM (liftIO . libPaths debVersions) control <- liftIO $ readFile "debian/control" >>= either (error . show) return . parseControl "debian/control"
src/Debian/Debianize/Types.hs view
@@ -1,8 +1,8 @@ {-# LANGUAGE DeriveDataTypeable #-} module Debian.Debianize.Types- ( Top(..)+ ( -- * Modes of operation- , verbosity+ verbosity , dryRun , debAction , cabalFlagAssignments@@ -116,7 +116,6 @@ ) where import Control.Category ((.))-import Data.Generics (Typeable) import Data.Lens.Lazy (Lens, iso, getL) import Data.Set as Set (Set) import Data.Text (Text)@@ -130,11 +129,6 @@ import Prelude hiding (init, init, log, log, unlines, (.)) import Text.ParserCombinators.Parsec.Rfc2822 (NameAddr) --- | This is a special filepath that represents the top of a directory--- tree. For a cabal package this directory would contain the .cabal--- file, for a debian package it would contain the debian directory.-newtype Top = Top {unTop :: FilePath} deriving (Eq, Ord, Show, Typeable)- -- | Not exported - <http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Package> binaryDebDescription :: BinPkgName -> Lens Atoms B.BinaryDebDescription binaryDebDescription b = maybeLens (B.newBinaryDebDescription b) (iso id id) . listElemLens ((== b) . getL B.package) . S.binaryPackages . control@@ -153,8 +147,8 @@ essential b = B.essential . binaryDebDescription b -- | <http://www.debian.org/doc/debian-policy/ch-controlfields.html#s5.6.10>-relations :: BinPkgName -> Lens Atoms B.PackageRelations-relations b = B.relations . binaryDebDescription b+-- relations :: BinPkgName -> Lens Atoms B.PackageRelations+-- relations b = B.relations . binaryDebDescription b -- | The Depends: relations for each binary deb - <http://www.debian.org/doc/debian-policy/ch-controlfields.html#s5.6.10> depends :: BinPkgName -> Lens Atoms Relations
test-data/alex/output/debian/rules view
@@ -1,6 +1,7 @@ #!/usr/bin/make -f DEB_CABAL_PACKAGE = alex+HC = ghc include /usr/share/cdbs/1/rules/debhelper.mk include /usr/share/cdbs/1/class/hlibrary.mk
test-data/archive/output/debian/rules view
@@ -1,6 +1,7 @@ #!/usr/bin/make -f DEB_CABAL_PACKAGE = seereason-darcs-backups+HC = ghc include /usr/share/cdbs/1/rules/debhelper.mk include /usr/share/cdbs/1/class/hlibrary.mk
test-data/artvaluereport-data/output/debian/rules view
@@ -1,6 +1,7 @@ #!/usr/bin/make -f DEB_CABAL_PACKAGE = artvaluereport-data+HC = ghc include /usr/share/cdbs/1/rules/debhelper.mk include /usr/share/cdbs/1/class/hlibrary.mk
test-data/clckwrks-dot-com/output/debian/rules view
@@ -1,6 +1,7 @@ #!/usr/bin/make -f DEB_CABAL_PACKAGE = clckwrks-dot-com+HC = ghc DEB_SETUP_GHC_CONFIGURE_ARGS = -fbackups
test-data/creativeprompts/output/debian/rules view
@@ -1,6 +1,7 @@ #!/usr/bin/make -f DEB_CABAL_PACKAGE = creativeprompts+HC = ghc include /usr/share/cdbs/1/rules/debhelper.mk include /usr/share/cdbs/1/class/hlibrary.mk