fbrnch-1.1: src/Bodhi.hs
{-# LANGUAGE CPP, OverloadedStrings #-}
module Bodhi (
bodhiCreateOverride,
bodhiTestingRepo,
checkAutoBodhiUpdate,
UpdateType(..),
UpdateSeverity(..)
)
where
#if MIN_VERSION_aeson(2,0,0)
import Data.Aeson.Key (fromText)
#endif
import Data.Aeson.Types (Object, (.:), parseEither)
import Fedora.Bodhi hiding (bodhiUpdate)
import Text.Read
import qualified Text.ParserCombinators.ReadP as R
import qualified Text.ParserCombinators.ReadPrec as RP
import Branches
import Common
import Common.System
import qualified Common.Text as T
import Prompt
checkAutoBodhiUpdate :: Branch -> IO Bool
checkAutoBodhiUpdate Rawhide = return True
-- epel7 returns 'create_automatic_updates: null' !
checkAutoBodhiUpdate (EPEL 7) = return False
checkAutoBodhiUpdate br =
lookupKey'' "create_automatic_updates" <$> bodhiRelease (show br)
where
-- Error in $: key "create_automatic_updates" not found
lookupKey'' :: T.Text -> Object -> Bool
lookupKey'' k obj =
let errMsg e = error $ e ++ " " ++ show obj in
-- bodhi-hs has lookupKeyEither
either errMsg id $ parseEither (.: fromText k) obj
#if !MIN_VERSION_aeson(2,0,0)
fromText :: T.Text -> T.Text
fromText = id
#endif
-- FIXME should determine 3 days for branched devel release
-- FIXME handle expired override?
bodhiCreateOverride :: Bool -> Maybe Int -> String -> IO ()
bodhiCreateOverride dryrun mduration nvr = do
putStrLn $ "Creating Bodhi Override for " ++ nvr ++ ":"
unless dryrun $ do
ok <- cmdBool "bodhi" ["overrides", "save", "--notes", "chain building with fbrnch", "--duration", show (fromMaybe 4 mduration), "--no-wait", nvr]
if ok
then putStrLn $ "https://bodhi.fedoraproject.org/overrides/" ++ nvr
else do
moverride <- bodhiOverride nvr
case moverride of
Nothing -> do
putStrLn "bodhi override failed"
prompt_ "Press Enter to retry"
bodhiCreateOverride dryrun mduration nvr
-- FIXME prettyprint
Just obj -> error' $ show obj
data UpdateType =
SecurityUpdate | BugfixUpdate | EnhancementUpdate | NewPackageUpdate |
TemplateUpdate
deriving Eq
instance Show UpdateType where
show SecurityUpdate = "security"
show BugfixUpdate = "bugfix"
show EnhancementUpdate = "enhancement"
show NewPackageUpdate = "newpackage"
show TemplateUpdate = error "template update"
instance Read UpdateType where
readPrec = do
s <- look
case lower s of
"security" -> RP.lift (R.string s) >> return SecurityUpdate
"bugfix" -> RP.lift (R.string s) >> return BugfixUpdate
"enhancement" -> RP.lift (R.string s) >> return EnhancementUpdate
"newpackage" -> RP.lift (R.string s) >> return NewPackageUpdate
"template" -> RP.lift (R.string s) >> return TemplateUpdate
_ -> error' "unknown bodhi update type" >> RP.pfail
data UpdateSeverity =
SeverityLow | SeverityMedium | SeverityHigh | SeverityUrgent |
SeverityUnspecified
deriving Eq
instance Show UpdateSeverity where
show SeverityLow = "low"
show SeverityMedium = "medium"
show SeverityHigh = "high"
show SeverityUrgent = "urgent"
show SeverityUnspecified = "unspecified"
instance Read UpdateSeverity where
readPrec = do
s <- look
case lower s of
"low" -> RP.lift (R.string s) >> return SeverityLow
"medium" -> RP.lift (R.string s) >> return SeverityMedium
"high" -> RP.lift (R.string s) >> return SeverityHigh
"urgent" -> RP.lift (R.string s) >> return SeverityUrgent
_ -> error' "unknown bodhi update severity" >> RP.pfail
bodhiTestingRepo :: Branch -> IO (Maybe String)
bodhiTestingRepo Rawhide = return Nothing
bodhiTestingRepo br = do
obj <- bodhiRelease (show br)
return $ case lookupKey "testing_repository" obj :: Maybe String of
Nothing -> Nothing
Just _ -> lookupKey' "testing_tag" obj