packages feed

koji-tool 0.6.1 → 0.7

raw patch · 5 files changed

+104/−37 lines, 5 files

Files

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 =