packages feed

fedora-releases-0.2.0: src/Distribution/Fedora/Release.hs

{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE CPP                 #-}

-- 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.

{-|
The module provides a higher level API over BodhiReleases
with a Release record type.
-}

module Distribution.Fedora.Release
  ( Release(..),
    getActiveReleases,
    getFedoraReleases,
    getEPELReleases,
    getBranchRelease
  )
where

import Control.Monad (guard)
import Data.Aeson(Object)
import Data.Maybe (mapMaybe)
import Distribution.Fedora.BodhiReleases

-- | Fedora Release data
data Release = Release {
    releaseName :: String,
    releaseVersion :: String,
    releaseIdPrefix :: String,
    releaseBranch :: String,
    releaseComposed :: Bool,
    releaseCandidateTag :: String,
    releaseDistTag :: String,
    releaseSettingStatus :: Maybe String,
    releaseState :: String,
    releaseAutomaticUpdates :: Bool,
    releaseTestingRepo :: Maybe String,
    releaseTestingTag :: String
  } deriving (Show,Eq)

readRelease :: Object -> Maybe Release
readRelease obj = do
  name <- lookupKey "name" obj
  ver <- lookupKey "version" obj
  idPref <- lookupKey "id_prefix" obj
  guard (idPref `notElem` ["FEDORA-CONTAINER","FEDORA-FLATPAK"])
  br <- lookupKey "branch" obj
  composed <- lookupKey "composed_by_bodhi" obj
  candidate <- lookupKey "candidate_tag" obj
  disttag <- lookupKey "dist_tag" obj
  let setting = lookupKey "setting_status" obj
  state <- lookupKey "state" obj
  automatic <- lookupKey "create_automatic_updates" obj
  let testrepo = lookupKey "testing_repository" obj
  testtag <- lookupKey "testing_tag" obj
  return $ Release name ver idPref br composed candidate disttag setting state automatic testrepo testtag

-- | ordered by releaseName
instance Ord Release where
  compare r1 r2 =
    compare (releaseName r1) (releaseName r2)

-- FIXME remove containers and flatpaks
-- | Get list of all current Fedora Project releases (from Bodhi)
getActiveReleases :: IO [Release]
getActiveReleases =
  mapMaybe readRelease <$> getBodhiReleases

-- getProductReleases :: String -> IO [Release]
-- getProductReleases name =
--   mapMaybe readRelease <$> getBodhiProductReleases name

-- | Get list of current Fedora Linux releases
getFedoraReleases :: IO [Release]
getFedoraReleases =
  mapMaybe readRelease <$> getBodhiFedoraReleases

-- | Get list of current Fedora EPEL releases
getEPELReleases :: IO [Release]
getEPELReleases =
  mapMaybe readRelease <$> getBodhiEPELReleases

-- releaseFilter :: (Release -> a) -> (a -> Bool) -> [Release] -> [Release]
-- releaseFilter f p = filter (p . f)

-- | Get the Release for an active Branch
--
-- Errors for an inactive Branch
getBranchRelease :: String -> IO Release
getBranchRelease br = do
  rels <- mapMaybe readRelease <$> getBodhiBranchReleases br
  case rels of
    [] -> error $ "release not found for branch " ++ br
    [rel] -> return rel
    _ -> error $ "multiple releases for " ++ br ++ ":\n" ++ unwords (map releaseName rels)