koji-tool-0.6.1: src/Main.hs
{-# LANGUAGE CPP #-}
-- SPDX-License-Identifier: BSD-3-Clause
module Main (main) where
import Data.List.Extra
import SimpleCmd
import SimpleCmdArgs
import BuildlogSizes
import Install
import qualified Paths_koji_tool
import Progress
import Query
main :: IO ()
main = do
sysdisttag <- do
dist <- cmd "rpm" ["--eval", "%{dist}"]
return $ if dist == "%{dist}" then "" else dist
simpleCmdArgs (Just Paths_koji_tool.version)
"Query and track Koji tasks, and install rpms from Koji."
"see https://github.com/juhp/koji-tool#readme" $
subcommands
[ Subcommand "install"
"Install rpm packages directly from a Koji build task" $
installCmd
<$> switchWith 'n' "dry-run" "Don't actually download anything"
<*> switchWith 'D' "debug" "More detailed output"
<*> optional (strOptionWith 'H' "hub" "HUB"
("KojiHub shortname or url (HUB = " ++
intercalate ", " knownHubs ++
") [default: fedora]"))
<*> optional (strOptionWith 'P' "packages-url" "URL"
"KojiFiles packages url [default: Fedora]")
<*> switchWith 'l' "list" "List builds"
<*> switchWith 'L' "latest" "Latest build"
<*> modeOpt
<*> disttagOpt sysdisttag
<*> (flagWith' ReqNVR 'R' "nvr" "Give an N-V-R instead of package name"
<|> flagWith ReqName ReqNV 'V' "nv" "Give an N-V instead of package name")
<*> some (strArg "PKG|NVR|TASKID...")
, Subcommand "query"
"Query Koji tasks (by default lists your tasks today)" $
queryCmd
<$> strOptionalWith 'S' "server" "URL" "Koji Hub [default: Fedora]" fedoraKojiHub
<*> optional (strOptionWith 'u' "user" "USER" "Koji user [default: fasid]")
<*> optionalWith auto 'l' "limit" "INT" "Maximum number of tasks to show [default: 10]" 10
<*> (Task <$> optionWith auto 't' "task" "TASKID" "Show task"
<|> Parent <$> optionWith auto 'c' "children" "TASKID" "List child tasks of parent"
<|> Build <$> strOptionWith 'b' "build" "BUILD" "List child tasks of build"
<|> pure TaskQuery)
<*> many (parseTaskState <$> strOptionWith 's' "state" "STATE" "Filter tasks by state (open, close(d), cancel(ed), fail(ed), assigned, free)")
<*> many (strOptionWith 'a' "arch" "ARCH" "Task arch")
<*> optional (Before <$> strOptionWith 'B' "before" "TIMESTAMP" "Tasks completed before timedate" <|>
After <$> strOptionWith 'F' "from" "TIMESTAMP" "Tasks completed after timedate [default: today]")
<*> (fmap normalizeMethod <$> optional (strOptionWith 'm' "method" "METHOD" "Select tasks by method: [build,buildarch,etc]"))
<*> switchWith 'D' "debug" "Pretty-pretty raw XML result"
-- FIXME error if integer (eg mistakenly taskid)
<*> optional (TaskPackage <$> strOptionWith 'p' "package" "PKG" "Filter results to specified package"
<|> TaskNVR <$> strOptionWith 'n' "nvr" "PREFIX" "Filter results by NVR prefix")
, Subcommand "progress"
"Track running Koji tasks by buildlog size" $
progressCmd
<$> optionalWith auto 'i' "interval" "MINUTES" "Polling interval between updates (default 2 min)" 2
<*> switchWith 'm' "modules" "Track module builds"
<*> many (TaskId <$> argumentWith auto "TASKID")
, Subcommand "buildlog-sizes" "Show buildlog sizes for nvr patterns" $
buildlogSizesCmd <$> strArg "NVRPATTERN"
]
where
modeOpt :: Parser Mode
modeOpt =
flagWith' All 'a' "all" "all subpackages" <|>
flagWith' Ask 'A' "ask" "ask for each subpackge [default if not installed]" <|>
pkgsReqOpts
pkgsReqOpts = PkgsReq
<$> many (strOptionWith 'p' "package" "SUBPKG" "Subpackage (glob) to install") <*> many (strOptionWith 'x' "exclude" "SUBPKG" "Subpackage (glob) not to install")
disttagOpt :: String -> Parser String
disttagOpt disttag = startingDot <$> strOptionalWith 'd' "disttag" "DISTTAG" ("Use a different disttag [default: " ++ disttag ++ "]") disttag
startingDot cs =
case cs of
"" -> error' "empty disttag"
(c:_) -> if c == '.' then cs else '.' : cs
normalizeMethod :: String -> String
normalizeMethod m =
case elemIndex (lower m) (map lower kojiMethods) of
Just i -> kojiMethods !! i
Nothing -> error' $! "unknown method: " ++ m