module Debian.Debianize.CabalInfo
(
CabalInfo
, PackageInfo(PackageInfo, cabalName, devDeb, docDeb, profDeb)
, packageDescription
, debInfo
, debianNameMap
, epochMap
, packageInfo
, newCabalInfo
) where
import Control.Category ((.))
import Control.Monad (unless)
import Control.Monad.State (execStateT)
import Control.Monad.Trans (liftIO)
import Data.Generics (Data, Typeable)
import Data.Lens.Lazy (access)
import Data.Lens.Template (nameMakeLens)
import Data.List as List (init, null)
import Data.Map as Map (Map)
import Data.Monoid (Monoid(..))
import Data.Text as Text (null, pack, strip)
import Debian.Debianize.BasicInfo (Flags)
import Debian.Debianize.DebInfo as D (control, copyright, DebInfo, makeDebInfo, noTestSuite, rulesSettings)
import Debian.Debianize.BinaryDebDescription (Canonical(canonical))
import Debian.Debianize.CopyrightDescription (defaultCopyrightDescription)
import Debian.Debianize.InputCabal (inputCabalization)
import Debian.Debianize.Prelude ((~=), (%=))
import Debian.Debianize.SourceDebDescription as S (homepage)
import Debian.Debianize.VersionSplits (VersionSplits)
import Debian.Orphans ()
import Debian.Relation (BinPkgName)
import Debian.Version (DebianVersion)
import Distribution.Package (PackageName)
import Distribution.PackageDescription as Cabal (PackageDescription(homepage, testSuites))
import Prelude hiding ((.), init, init, log, log, null)
data CabalInfo
= CabalInfo
{ packageDescription_ :: PackageDescription
, debInfo_ :: DebInfo
, debianNameMap_ :: Map PackageName VersionSplits
, epochMap_ :: Map PackageName Int
, packageInfo_ :: Map PackageName PackageInfo
} deriving (Show, Data, Typeable)
data PackageInfo = PackageInfo { cabalName :: PackageName
, devDeb :: Maybe (BinPkgName, DebianVersion)
, profDeb :: Maybe (BinPkgName, DebianVersion)
, docDeb :: Maybe (BinPkgName, DebianVersion) } deriving (Eq, Ord, Show, Data, Typeable)
$(let f s = case s of
(_ : _) | last s == '_' -> Just (init s)
_ -> Nothing in
nameMakeLens ''CabalInfo f)
instance Canonical CabalInfo where
canonical x = x {debInfo_ = canonical (debInfo_ x)}
newCabalInfo :: Flags -> IO CabalInfo
newCabalInfo flags' = do
pkgDesc <- inputCabalization flags'
copyrt <- liftIO $ defaultCopyrightDescription pkgDesc
execStateT
(do (copyright . debInfo) ~= Just copyrt
(S.homepage . control . debInfo) ~= case strip (pack (Cabal.homepage pkgDesc)) of
x | Text.null x -> Nothing
x -> Just x
noTests <- access (noTestSuite . debInfo)
unless (List.null (Cabal.testSuites pkgDesc) || noTests)
(do (rulesSettings . debInfo) %= (++ ["DEB_ENABLE_TESTS = yes", "DEB_BUILD_OPTIONS += nocheck"])
))
(makeCabalInfo flags' pkgDesc)
makeCabalInfo :: Flags -> PackageDescription -> CabalInfo
makeCabalInfo fs pkgDesc =
CabalInfo
{ packageDescription_ = pkgDesc
, epochMap_ = mempty
, packageInfo_ = mempty
, debianNameMap_ = mempty
, debInfo_ = makeDebInfo fs
}