module Distribution.RpmDeps where
import Distribution.Version
import Data.List
import Distribution.PackageDescription
import Distribution.Simple.Utils
import Distribution.Verbosity
import Distribution.PackageDescription.Parse
import Distribution.Simple
import Distribution.Simple.Configure
import Distribution.Simple.LocalBuildInfo
import Directory
import System.FilePath
import Distribution.Text
dep_prefix = "haskell"
rpmrequires :: Maybe FilePath -> IO [String]
rpmrequires cabalfile = do
buildinfo <- maybeGetPersistBuildConfig =<< findcabal cabalfile
return $ case buildinfo of
Nothing -> []
Just bi -> map package2rpmdep (packageDeps bi)
rpmprovides :: Maybe FilePath -> IO [String]
rpmprovides cabalfile = do
mycabal <- readPackageDescription normal =<< findcabal cabalfile
return $ [package2rpmdep (package $ packageDescription mycabal)]
rpmbuildrequires :: Maybe FilePath -> IO [String]
rpmbuildrequires cabalfile = do
fcabal <- findcabal cabalfile
mycabal <- readPackageDescription normal fcabal
return $ map dependency2rpmdep (buildDepends $ packageDescription mycabal)
findcabal file = defaultPackageDesc normal
package2rpmdep :: PackageIdentifier -> String
package2rpmdep pkg = dep_prefix ++ "(" ++ display (pkgName pkg) ++ ") = " ++ (version2string $ pkgVersion pkg)
dependency2rpmdep :: Dependency -> String
dependency2rpmdep (Dependency name vers) = dep_prefix ++ "(" ++ display name ++ ")" ++ vers2st
where
vers2st = case vers of
AnyVersion -> ""
ThisVersion v -> " " ++ (versionrange2sign vers) ++ " " ++ (version2string v)
LaterVersion v -> " " ++ (versionrange2sign vers) ++ " " ++ (version2string v)
EarlierVersion v -> " " ++ (versionrange2sign vers) ++ " " ++ (version2string v)
UnionVersionRanges v v' ->
" " ++ (versionrange2sign vers) ++ " " ++ (version2string $
case v of
ThisVersion y@_ -> y
LaterVersion y@_ -> y
EarlierVersion y@_ -> y
_ -> Version [] []
)
IntersectVersionRanges v v' -> " IV "
versionrange2sign :: VersionRange -> String
versionrange2sign vr = case vr of
AnyVersion -> ""
ThisVersion v -> "="
LaterVersion v -> ">"
EarlierVersion v -> "<"
UnionVersionRanges v v' -> case v of
ThisVersion _ -> versionrange2sign v' ++ versionrange2sign v
_ -> versionrange2sign v ++ versionrange2sign v'
IntersectVersionRanges v v' -> "IV"
version2string :: Version -> String
version2string version = concat . intersperse "." $ map show $ versionBranch version