libjenkins-0.3.0.0: example/rename-jobs.hs
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
-- | Rename jobs matching supplied pattern
module Main where
import Control.Lens -- lens
import Control.Lens.Aeson -- lens-aeson
import Control.Monad (when) -- base
import qualified Data.ByteString.Char8 as B -- bytestring
import Data.Foldable (for_) -- base
import Data.Function (fix) -- base
import Data.Text (Text) -- text
import qualified Data.Text as T -- text
import qualified Data.Text.IO as T -- text
import Jenkins.Rest -- libjenkins
import System.Environment (getArgs) -- base
import System.Exit (exitFailure) -- base
import System.IO (hPutStrLn, stderr) -- base
{-# ANN module ("HLint: ignore Use camelCase" :: String) #-}
-- | Program options
data Options = Options
{ settings :: ConnectInfo
, old :: Text
, new :: Text
}
main :: IO ()
main = do
-- more useful help on error
host:port:user:pass:o:n:_ <- getArgs
let opts = Options (ConnectInfo host (read port) (B.pack user) (B.pack pass)) (T.pack o) (T.pack n)
res <- rename opts
case res of
Result _ -> T.putStrLn "Done."
-- disconnected for some reason
Disconnect -> die "disconnect!"
-- something bad happened, show it!
Error e -> die (show e)
where
die message = do
hPutStrLn stderr message
exitFailure
-- | Prompt to rename all jobs matching pattern
rename :: Options -> IO (Result HttpException ())
rename (Options { settings, old, new }) = runJenkins settings $ do
-- get jobs names from jenkins "root" API
res <- get (json -?- "tree" -=- "jobs[name]")
let jobs = res ^.. key "jobs".values.key "name"._String
for_ jobs rename_job
where
rename_job :: Text -> Jenkins ()
rename_job name = when (old `T.isInfixOf` name) $ do
let name' = (old `T.replace` new) name
-- prompt for every matching job
yes <- prompt $ T.unwords ["Rename", name, "to", name', "? [y/n]"]
when yes $
-- if user agrees then voodoo comes
post_ (job name -/- "doRename" -?- "newName" -=- name')
-- asks user until she enters 'y' or 'n'
prompt message = io . fix $ \loop -> do
T.putStrLn message
res <- T.getLine
case T.toUpper res of
"Y" -> return True
"N" -> return False
_ -> loop