packages feed

fedora-repoquery-0.7.2: src/BodhiRelease.hs

{-# 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