{-# LANGUAGE OverloadedStrings #-}
module BodhiRelease (
BodhiRelease (..),
activeFedoraRelease,
activeFedoraReleases,
fedoraReleaseState,
rawhideFedoraRelease,
fedoraReleasePostBeta
)
where
import qualified Data.List as L
import Data.Maybe (mapMaybe)
import Distribution.Fedora.BodhiReleases (getBodhiFedoraReleases, lookupKey)
import SimpleCmd (error')
import Types (Natural)
data BodhiRelease =
Release {releaseVersion :: String, -- to handle "eln"
releaseState :: String,
releaseBranch :: String,
releaseComposed :: Bool,
releasePostBeta :: Bool}
deriving Eq
-- Left is oldest active version
activeFedoraRelease :: Natural -> IO (Either Natural BodhiRelease)
activeFedoraRelease n = do
active <- activeFedoraReleases
case L.sortOn releaseVersion active of
[] -> error' "failed to find active releases with Bodhi API"
(oldest:_) ->
return $
case L.find (\r -> releaseVersion r == show n) active of
Just rel -> Right rel
Nothing -> Left $ read $ releaseVersion oldest
activeFedoraReleases :: IO [BodhiRelease]
activeFedoraReleases =
L.nub . mapMaybe maybeRelease <$> getBodhiFedoraReleases
where
maybeRelease obj = do
version <- lookupKey "version" obj
branch <- lookupKey "branch" obj
state <- lookupKey "state" obj
composed <- lookupKey "composed_by_bodhi" obj
let setting = lookupKey "setting_status" obj
return $
Release version state branch composed $
setting == Just ("post_beta" :: String)
fedoraReleaseState :: Natural -> IO String
fedoraReleaseState n = do
eactive <- activeFedoraRelease n
return $
case eactive of
Left _ -> error' $ "could find F" ++ show n ++ " release (state)"
Right rel -> releaseState rel
rawhideFedoraRelease :: IO Natural
rawhideFedoraRelease = do
actives <- activeFedoraReleases
let pending = map releaseVersion (filter (\r -> releaseState r == "pending") actives)
return $ read $ maximum (L.delete "eln" pending)
fedoraReleasePostBeta :: Natural -> IO Bool
fedoraReleasePostBeta n = do
eactive <- activeFedoraRelease n
return $
case eactive of
Left _ -> error' $ "could find F" ++ show n ++ " release (setting)"
Right rel -> releasePostBeta rel