{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE CPP #-}
module Distribution.Fedora.Release
( Release(..)
, getActiveReleases
, getFedoraReleases
, getEPELReleases
, getBranchRelease
, getRawhideVersion
, getCurrentFedoraVersion
)
where
import Control.Monad (guard)
import Data.Aeson(Object)
import Data.Maybe (mapMaybe)
import Distribution.Fedora.BodhiReleases
import Numeric.Natural (Natural)
import Safe (headMay)
data Release = Release {
Release -> String
releaseName :: String,
Release -> String
releaseVersion :: String,
Release -> String
releaseIdPrefix :: String,
Release -> String
releaseBranch :: String,
Release -> Bool
releaseComposed :: Bool,
Release -> String
releaseCandidateTag :: String,
Release -> String
releaseDistTag :: String,
Release -> Maybe String
releaseSettingStatus :: Maybe String,
Release -> String
releaseState :: String,
Release -> Bool
releaseAutomaticUpdates :: Bool,
Release -> Maybe String
releaseTestingRepo :: Maybe String,
Release -> String
releaseTestingTag :: String,
Release -> Maybe String
releaseEOL :: Maybe String
} deriving (Int -> Release -> ShowS
[Release] -> ShowS
Release -> String
(Int -> Release -> ShowS)
-> (Release -> String) -> ([Release] -> ShowS) -> Show Release
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Release -> ShowS
showsPrec :: Int -> Release -> ShowS
$cshow :: Release -> String
show :: Release -> String
$cshowList :: [Release] -> ShowS
showList :: [Release] -> ShowS
Show,Release -> Release -> Bool
(Release -> Release -> Bool)
-> (Release -> Release -> Bool) -> Eq Release
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Release -> Release -> Bool
== :: Release -> Release -> Bool
$c/= :: Release -> Release -> Bool
/= :: Release -> Release -> Bool
Eq)
readRelease :: Object -> Maybe Release
readRelease :: Object -> Maybe Release
readRelease Object
obj = do
name <- Text -> Object -> Maybe String
forall a. FromJSON a => Text -> Object -> Maybe a
lookupKey Text
"name" Object
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 = Text -> Object -> Maybe String
forall a. FromJSON a => Text -> Object -> Maybe a
lookupKey Text
"setting_status" Object
obj
state <- lookupKey "state" obj
automatic <- lookupKey "create_automatic_updates" obj
let testrepo = Text -> Object -> Maybe String
forall a. FromJSON a => Text -> Object -> Maybe a
lookupKey Text
"testing_repository" Object
obj
testtag <- lookupKey "testing_tag" obj
let eol = Text -> Object -> Maybe String
forall a. FromJSON a => Text -> Object -> Maybe a
lookupKey Text
"eol" Object
obj
return $ Release name ver idPref br composed candidate disttag setting state automatic testrepo testtag eol
instance Ord Release where
compare :: Release -> Release -> Ordering
compare Release
r1 Release
r2 =
String -> String -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Release -> String
releaseName Release
r1) (Release -> String
releaseName Release
r2)
getActiveReleases :: IO [Release]
getActiveReleases :: IO [Release]
getActiveReleases =
(Object -> Maybe Release) -> [Object] -> [Release]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe Object -> Maybe Release
readRelease ([Object] -> [Release]) -> IO [Object] -> IO [Release]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO [Object]
getBodhiReleases
getFedoraReleases :: IO [Release]
getFedoraReleases :: IO [Release]
getFedoraReleases =
(Object -> Maybe Release) -> [Object] -> [Release]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe Object -> Maybe Release
readRelease ([Object] -> [Release]) -> IO [Object] -> IO [Release]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO [Object]
getBodhiFedoraReleases
getEPELReleases :: IO [Release]
getEPELReleases :: IO [Release]
getEPELReleases =
(Object -> Maybe Release) -> [Object] -> [Release]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe Object -> Maybe Release
readRelease ([Object] -> [Release]) -> IO [Object] -> IO [Release]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO [Object]
getBodhiEPELReleases
getBranchRelease :: String -> IO Release
getBranchRelease :: String -> IO Release
getBranchRelease String
br = do
rels <- (Object -> Maybe Release) -> [Object] -> [Release]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe Object -> Maybe Release
readRelease ([Object] -> [Release]) -> IO [Object] -> IO [Release]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> IO [Object]
getBodhiBranchReleases String
br
case rels of
[] -> String -> IO Release
forall a. HasCallStack => String -> a
error (String -> IO Release) -> String -> IO Release
forall a b. (a -> b) -> a -> b
$ String
"release not found for branch " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
br
[Release
rel] -> Release -> IO Release
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Release
rel
[Release]
_ -> String -> IO Release
forall a. HasCallStack => String -> a
error (String -> IO Release) -> String -> IO Release
forall a b. (a -> b) -> a -> b
$ String
"multiple releases for " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
br String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
":\n" String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
unwords ((Release -> String) -> [Release] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Release -> String
releaseName [Release]
rels)
getRawhideVersion :: IO Natural
getRawhideVersion :: IO Natural
getRawhideVersion =
String -> Natural
forall a. Read a => String -> a
read (String -> Natural) -> (Release -> String) -> Release -> Natural
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Release -> String
releaseVersion (Release -> Natural) -> IO Release -> IO Natural
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> IO Release
getBranchRelease String
"rawhide"
getCurrentFedoraVersion :: IO Natural
getCurrentFedoraVersion :: IO Natural
getCurrentFedoraVersion = do
rels <- (Release -> Bool) -> [Release] -> [Release]
forall a. (a -> Bool) -> [a] -> [a]
filter ((String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"current") (String -> Bool) -> (Release -> String) -> Release -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Release -> String
releaseState) ([Release] -> [Release]) -> IO [Release] -> IO [Release]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO [Release]
getFedoraReleases
case headMay rels of
Just Release
rel -> Natural -> IO Natural
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Natural -> IO Natural) -> Natural -> IO Natural
forall a b. (a -> b) -> a -> b
$ String -> Natural
forall a. Read a => String -> a
read (String -> Natural) -> String -> Natural
forall a b. (a -> b) -> a -> b
$ Release -> String
releaseVersion Release
rel
Maybe Release
Nothing -> String -> IO Natural
forall a. HasCallStack => String -> a
error String
"current fedora release not found"