koji-tool 0.6.1 → 0.7
raw patch · 5 files changed
+104/−37 lines, 5 files
Files
- ChangeLog.md +7/−0
- README.md +25/−13
- koji-tool.cabal +2/−2
- src/Main.hs +14/−10
- src/Query.hs +56/−12
ChangeLog.md view
@@ -1,5 +1,12 @@ # Version history of koji-tool +# 0.7 (2022-01-25)+- query: new options: '--package' to search recent builds and '--latest'+- query --method: now defaults to buildArch (use 'any' to include all)+- query: now defaults to "--before now" (instead of "--from today 00:00')+- query --arch: map i686 to i386 and armv7hl to armhfp+- query: do not drop tasks without string request+ # 0.6.1 (2022-01-14) - install --list: now lists the rpms of a unique nvr - install --list: new --latest option which only finds the latest build
README.md view
@@ -10,45 +10,50 @@ Query Koji for tasks. -Similar to `koji list-tasks --mine --quiet --all ...`,+Somewhat like `koji list-tasks --mine --quiet --all ...`, but it shows duration, kojiweb urls and build.log size, and it uses `date` to parse a specified date string-and can filter results by package.+and can filter task results by package or nvr prefix. ### Usage -By default it lists your Fedora Koji tasks from today.+By default it lists your 10 most recent Fedora Koji buildArch tasks. ```shellsession $ koji-tool query --help-Usage: koji-tool query [-S|--server URL] [-u|--user USER] [-l|--limit INT]+Usage: koji-tool query [-S|--server URL] [-u|--user USER]+ [(-L|--latest) | (-l|--limit INT)] [(-t|--task TASKID) | (-c|--children TASKID) |- (-b|--build BUILD)] [-s|--state STATE] [-a|--arch ARCH]+ (-b|--build BUILD) | (-p|--package PKG)]+ [-s|--state STATE] [-a|--arch ARCH] [(-B|--before TIMESTAMP) | (-F|--from TIMESTAMP)] [-m|--method METHOD] [-D|--debug]- [(-p|--package PKG) | (-n|--nvr PREFIX)]+ [(-P|--only-package PKG) | (-N|--only-nvr PREFIX)] Query Koji tasks (by default lists your tasks today) Available options: -S,--server URL Koji Hub [default: Fedora] -u,--user USER Koji user [default: fasid]+ -L,--latest Latest build or task -l,--limit INT Maximum number of tasks to show [default: 10] -t,--task TASKID Show task -c,--children TASKID List child tasks of parent -b,--build BUILD List child tasks of build+ -p,--package PKG Build tasks of package -s,--state STATE Filter tasks by state (open, close(d), cancel(ed), fail(ed), assigned, free) -a,--arch ARCH Task arch- -B,--before TIMESTAMP Tasks completed before timedate- -F,--from TIMESTAMP Tasks completed after timedate [default: today]- -m,--method METHOD Select tasks by method: [build,buildarch,etc]- -D,--debug Pretty-pretty raw XML result- -p,--package PKG Filter results to specified package- -n,--nvr PREFIX Filter results by NVR prefix+ -B,--before TIMESTAMP Tasks completed before timedate [default: now]+ -F,--from TIMESTAMP Tasks completed after timedate+ -m,--method METHOD Select tasks by method: [build,buildarch,etc] or+ 'any' (default 'buildArch')+ -D,--debug Pretty-print raw XML result+ -P,--only-package PKG Filter task results to specified package+ -N,--only-nvr PREFIX Filter task results by NVR prefix -h,--help Show this help text ``` -Example:+Examples: ```shellsession $ koji-tool query -a aarch64 --from "last week" -s fail@@ -65,6 +70,13 @@ Start: Thu Jan 13 10:12:09 2022 End: Thu Jan 13 10:14:09 2022 duration: 0h 2m 0s+```++List builds:+```shellsession+$ koji-tool query --package redhat-rpm-config --limit 2+redhat-rpm-config-212-1.eln114 (2022-01-23 12:50:46)+redhat-rpm-config-212-1.fc36 (2022-01-23 11:49:42) ``` ## koji-tool install
koji-tool.cabal view
@@ -1,5 +1,5 @@ name: koji-tool-version: 0.6.1+version: 0.7 synopsis: Koji CLI tool for querying tasks and installing builds description: koji-tool is a CLI interface to Koji with commands to query tasks,@@ -10,7 +10,7 @@ license-file: LICENSE author: Jens Petersen <juhpetersen@gmail.com> maintainer: Jens Petersen <juhpetersen@gmail.com>-copyright: 2021 Jens Petersen <juhpetersen@gmail.com>+copyright: 2021-2022 Jens Petersen <juhpetersen@gmail.com> category: Utility homepage: https://github.com/juhp/koji-tool bug-reports: https://github.com/juhp/koji-tool/issues
src/Main.hs view
@@ -47,20 +47,22 @@ 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+ <*> (flagWith' 1 'L' "latest" "Latest build or task" <|>+ 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"+ <|> Package <$> strOptionWith 'p' "package" "PKG" "Build tasks of package" <|> 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"+ <*> optional (Before <$> strOptionWith 'B' "before" "TIMESTAMP" "Tasks completed before timedate [default: now]" <|>+ After <$> strOptionWith 'F' "from" "TIMESTAMP" "Tasks completed after timedate")+ <*> (normalizeMethod <$> optional (strOptionWith 'm' "method" "METHOD" "Select tasks by method: [build,buildarch,etc] or 'any' (default 'buildArch')"))+ <*> switchWith 'D' "debug" "Pretty-print 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")+ <*> optional (TaskPackage <$> strOptionWith 'P' "only-package" "PKG" "Filter task results to specified package"+ <|> TaskNVR <$> strOptionWith 'N' "only-nvr" "PREFIX" "Filter task results by NVR prefix") , Subcommand "progress" "Track running Koji tasks by buildlog size" $@@ -90,8 +92,10 @@ "" -> error' "empty disttag" (c:_) -> if c == '.' then cs else '.' : cs - normalizeMethod :: String -> String- normalizeMethod m =+ normalizeMethod :: Maybe String -> Maybe String+ normalizeMethod Nothing = normalizeMethod (Just "buildarch")+ normalizeMethod (Just "any") = Nothing+ normalizeMethod (Just m) = case elemIndex (lower m) (map lower kojiMethods) of- Just i -> kojiMethods !! i+ Just i -> Just $ kojiMethods !! i Nothing -> error' $! "unknown method: " ++ m
src/Query.hs view
@@ -36,7 +36,8 @@ import System.FilePath import Text.Pretty.Simple -data TaskReq = Task Int | Parent Int | Build String | TaskQuery+data TaskReq = Task Int | Parent Int | Build String | Package String+ | TaskQuery data TaskFilter = TaskPackage String | TaskNVR String @@ -76,6 +77,33 @@ else kojiGetBuildTaskID server bld whenJust mtaskid $ \(TaskId taskid) -> queryCmd server muser limit (Parent taskid) states archs mdate mmethod debug mfilter'+ Package pkg -> do+ when (isJust mdate || isJust mfilter') $+ error' "cannot use --package together with timedate or filter"+ mpkgid <- getPackageID server pkg+ case mpkgid of+ Nothing -> error' $ "no package id found for " ++ pkg+ Just pkgid -> do+ options <- setupQuery+ blds <- listBuilds server $+ ("packageID", ValueInt pkgid):options+ case blds of+ [bld] -> do+ case lookupStruct "task_id" bld of+ Just taskid ->+ queryCmd server muser 10 (Parent taskid) states archs mdate mmethod debug mfilter'+ Nothing -> error' "task id not found"+ _ -> do+ mapM_ putStrLn $ mapMaybe buildResult blds+ where+ buildResult :: Struct -> Maybe String+ buildResult bld = do+ nvr <- lookupStruct "nvr" bld+ state <- readBuildState <$> lookupStruct "state" bld+ date <- lookupStruct "completion_time" bld+ return $ nvr +++ " (" ++ takeWhile (/= '.') date ++ ")" +++ (if state == BuildComplete then "" else " " ++ show state) _ -> do query <- setupQuery results <- listTasks server query@@ -85,9 +113,12 @@ where setupQuery = do case taskreq of- -- FIXME:+ -- FIXME! Task _ -> error' "unreachable task request" Build _ -> error' "unreachable build request"+ Package _ ->+ return [("queryOpts",ValueStruct [("limit",ValueInt limit),+ ("order",ValueString "-build_id")])] Parent parent -> do when (isJust muser || isJust mdate || isJust mfilter') $ error' "cannot use --parent together with --user, timedate, or filter"@@ -95,7 +126,7 @@ ("parent", ValueInt parent) : commonParams TaskQuery -> do date <- cmd "date" ["+%F %T%z", "--date=" ++ dateString mdate]- putStrLn $ "completed " ++ maybe "after" show mdate ++ " " ++ date+ putStrLn $ "completed " ++ maybe "" (++ " ") mmethod ++ maybe "before" show mdate ++ " " ++ date user <- case muser of Just user -> return user@@ -118,17 +149,22 @@ Just owner -> return $ [("owner", ValueInt (getID owner)),- ("complete" ++ maybe "After" (capitalize . show) mdate, ValueString date)]+ ("complete" ++ maybe "Before" (capitalize . show) mdate, ValueString date)] ++ commonParams where commonParams = [("decode", ValueBool True)] ++ [("state", ValueArray (map taskStateToValue states)) | notNull states]- ++ [("arch", ValueArray (map ValueString archs)) | notNull archs]- ++ [("method", ValueString method) | Just method <- [mmethod]]+ ++ [("arch", ValueArray (map (ValueString . kojiArch) archs)) | notNull archs]+ ++ [("method", ValueString method) | Just method <- [mmethod]] + kojiArch :: String -> String+ kojiArch "i686" = "i386"+ kojiArch "armv7hl" = "armhfp"+ kojiArch a = a+ dateString :: Maybe BeforeAfter -> String- dateString Nothing = "today 00:00"+ dateString Nothing = "now" -- make time refer to past not future dateString (Just beforeAfter) = let timedate = getTimedate beforeAfter@@ -151,18 +187,26 @@ method <- lookupStruct "method" st hostid <- lookupStruct "host_id" st state <- getTaskState st- request <- lookupStruct "request" st >>= getString . head+ request <- lookupStruct "request" st let package =- let file = takeFileName request- in if ".src.rpm" `isSuffixOf` file- then Right $ readNVR $ removeSuffix ".src.rpm" file- else Left $ takeBaseName file+ case (getString . head) request of+ Nothing -> Left $ unwords $ map showValue $ take 2 request+ Just req ->+ let file = takeFileName req+ in if ".src.rpm" `isSuffixOf` file+ then Right $ readNVR $ removeSuffix ".src.rpm" file+ else Left $ takeBaseName file mparent' = lookupStruct "parent" st :: Maybe Int return $ TaskResult package arch method hostid state mparent' taskid start_time mend_time where readTime' :: String -> UTCTime readTime' = read . replace "+00:00" "Z"++ showValue :: Value -> String+ showValue (ValueString cs) = cs+ showValue (ValueInt i) = show i+ showValue val = show val filterResults :: [TaskResult] -> [TaskResult] filterResults ts =