-- |
-- Module : FedoraDists
-- Copyright : (C) 2014-2018 Jens Petersen
--
-- Maintainer : Jens Petersen <petersen@fedoraproject.org>
-- Stability : alpha
-- Portability : portable
--
-- Explanation: Fedora dist metadata
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
module FedoraDists
(Dist(..),
dists,
distBranch,
distRepo,
distTag,
distTarget,
distUpdates,
distOverride,
hackageRelease,
kojicmd,
releaseVersion,
rawhide,
rawhideRelease,
rpkg,
rpmDistTag) where
import Data.Version
import Data.Maybe (fromMaybe)
import Text.Read
#if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,0))
#else
import Control.Applicative ((<$>), (*>))
import Data.Traversable (traverse)
#endif
-- | The `Dist` datatype specifies the target OS and version.
-- (roughly corresponds to a git branch)
data Dist = Fedora Int -- ^ Fedora release
| EPEL Int -- ^ EPEL release
| RHEL Version -- ^ RHEL version
deriving (Eq)
instance Show Dist where
show (Fedora n) = "f" ++ show n
show (EPEL n) = (if n <= 6 then "el" else "epel") ++ show n
show (RHEL v) = "rhel-" ++ show v
-- | Read from eg "f29", "epel7"
instance Read Dist where
readPrec = choice [pFedora, pEPEL, pRHEL] where
pChar c = do
c' <- get
if c == c'
then return c
else pfail
pFedora = Fedora <$> (pChar 'f' *> readPrec)
pEPEL = EPEL <$> (traverse pChar "epel" *> readPrec)
pRHEL = RHEL <$> (traverse pChar "rhel-" *> readPrec)
readListPrec = readListPrecDefault
-- | Current maintained distribution releases.
dists :: [Dist]
dists = [rawhide, Fedora 29, Fedora 28, EPEL 7]
-- | The Fedora release number corresponding to current Rawhide
rawhideRelease :: Int
rawhideRelease = 30
-- | The Fedora release corresponding to Rawhide
rawhide :: Dist
rawhide = Fedora rawhideRelease
-- | Used for Koji sidetag when needed.
sidetag :: Dist -> Maybe String
--sidetag (Fedora n) | n == rawhideRelease = Just "ghc"
sidetag _ = Nothing
-- | The Fedora release being tracked in Hackage Distro data (`rawhideRelease` - 1)
hackageRelease :: Dist
hackageRelease = Fedora (rawhideRelease - 1)
-- | Maps `Dist` to package distgit branch
distBranch :: Dist -> String
distBranch (Fedora n) | n >= rawhideRelease = "master"
distBranch d = show d
-- | Map `Dist` to DNF/YUM repo name
distRepo :: Dist -> String
distRepo (Fedora n) | n >= rawhideRelease = "rawhide"
| otherwise = "fedora"
distRepo (EPEL _) = "epel"
distRepo (RHEL _) = "rhel"
-- | Map `Dist` to Maybe the DNF/YUM updates repo name
distUpdates :: Dist -> Maybe String
distUpdates (Fedora n) | n >= rawhideRelease = Nothing
distUpdates (Fedora _) = Just "updates"
distUpdates _ = Nothing
-- | Whether dist has overrides in Bodhi
distOverride :: Dist -> Bool
distOverride d = d `notElem` [rawhide, Fedora 30 , EPEL 8]
distTag :: Dist -> String
distTag d = show d ++ "-" ++ fromMaybe "build" (sidetag d)
distTarget :: Dist -> String
distTarget d = show d ++ "-" ++ fromMaybe "" (sidetag d)
releaseVersion :: Dist -> String
releaseVersion (Fedora n) | n >= rawhideRelease = "rawhide"
releaseVersion (Fedora n) = show n
releaseVersion (EPEL n) = show n
releaseVersion (RHEL n) = show n
rpmDistTag :: Dist -> String
rpmDistTag (Fedora n) = ".fc" ++ show n
rpmDistTag (RHEL v) = ".el" ++ (show . head . versionBranch) v
rpmDistTag d = '.' : show d
kojicmd :: Dist -> String
kojicmd (RHEL _) = "brew"
kojicmd _ = "koji"
rpkg :: Dist -> String
rpkg (RHEL _) = "rhpkg"
rpkg _ = "fedpkg"