packages feed

fedora-repoquery 0.9 → 0.9.1

raw patch · 10 files changed

+213/−141 lines, 10 filesdep +aesondep +bytestringdep +typed-process

Dependencies added: aeson, bytestring, typed-process

Files

ChangeLog.md view
@@ -1,11 +1,17 @@ # Version history for fedora-repoquery +## 0.9.1 (2026-06-28)+- fix IO memory leak due to lazy String IO with typed-process+  (thank you to Efraim Kaov for reporting this)+- add --all-releases and proper reverse sorting of releases+- various minor type and sorting correctness improvements+ ## 0.9 (2026-06-26) - add `--all-epel` releases - c10s: use mirror.stream.centos.org - improve handling of archived epel major and minor releases-- preliminary support for pre-stream centos-- fedora updates Everything was introduced from F28+- preliminary support for pre-stream centos versions+- fedora-updates Everything was introduced from F28 - error for i386 arch unless epel6, f25, c7, or older - do not include i386 in `--all-archs` (regression in 0.8.2) 
README.md view
@@ -10,7 +10,7 @@ `$ fedora-repoquery rawhide firefox`  ```-firefox-152.0-1.fc45.x86_64 (fedora-rawhide)+firefox-152.0.2-1.fc45.x86_64 (fedora-rawhide) ``` (note it is shorter to write `fedora-repoquery 45`). @@ -37,7 +37,7 @@ `$ fedora-repoquery eln kernel`  ```-kernel-7.1.0-0.rc3.260512g50897c955902.24.eln156.x86_64 (eln-BaseOS)+kernel-7.2.0-0.rc0.260626g4edcdefd4083.12.eln157.x86_64 (eln-BaseOS) ```  Without a release argument, the system yum repo configuration is used:@@ -72,7 +72,7 @@  ``` 2026-04-24 23:40:25 +08 <https://mirror.freedif.org/fedora/fedora/linux/releases/44/>-2026-06-26 08:57:49 +08 <https://mirror.freedif.org/fedora/fedora/linux/updates/44/>+2026-06-28 08:55:58 +08 <https://mirror.freedif.org/fedora/fedora/linux/updates/44/> ```  One can also query multiple releases (or arch's):@@ -81,7 +81,7 @@  ``` python3-3.14.0-1.fc43.x86_64 (f43)-python3-3.14.5-1.fc43.x86_64 (f43-updates)+python3-3.14.6-1.fc43.x86_64 (f43-updates) python3-3.14.3-2.fc44.x86_64 (f44) python3-3.14.6-1.fc44.x86_64 (f44-updates) ```@@ -97,17 +97,18 @@ which may be faster than dl.fp.o and fresher than other mirrors sometimes.  Querying of epel10 minor versions is supported:+ `$ fedora-repoquery epel10.2 nix`  ```-nix-2.24.15-2.el10_2.x86_64 (epel10.2)+nix-2.31.5-3.el10_2.x86_64 (epel10.2) ```  ## Help `$ fedora-repoquery --version`  ```-0.9+0.9.1 ```  `$ fedora-repoquery --help`@@ -115,35 +116,35 @@ ``` fedora-repoquery tool for querying Fedora repos for packages. -Usage: fedora-repoquery [--version] [-4|--dnf4] [(-q|--quiet) | (-v|--verbose)] -                        [--dynamic] [-T|--time] [-K|--koji] -                        [(-m|--mirror URL) | --cf | (-d|--dl)] -                        [(-F|--all-fedora) | (-E|--all-epel)] -                        [(-s|--source) | (-A|--all-archs) | -                          [-a|--repo-arch ARCH]] [-t|--testing] [-D|--debug] -                        [(-z|--cache-size) | (-e|--cache-clean-empty) | -                          --list-releases | --help-dnf | -                          [--advisories ARG | --advisory-severities ARG | -                            --arch ARG | --available | --bugfix | --bzs ARG | -                            --cves ARG | --disable-modular-filtering | -                            --duplicates | --enhancement | --exactdeps | -                            --extras | (-f|--file ARG) | --installed | -                            --installed-from-repo ARG | --installonly | -                            --latest-limit ARG | --leaves | --newpackage | -                            --providers-of ARG | --recent | --recursive | -                            --security | --srpm | --unneeded | --upgrades | -                            --userinstalled | --whatconflicts ARG | -                            (--wd|--whatdepends ARG) | --whatenhances ARG | -                            --whatobsoletes ARG | (--whatprovides|--wp ARG) | -                            --whatrecommends ARG | (--whatrequires|--wr ARG) | -                            --whatsuggests ARG | --whatsupplements ARG | -                            --conflicts | --depends | --enhances | --files | -                            (-l|--list) | --obsoletes | (-p|--provides) | -                            --recommends | (-r|--requires) | --requires-pre | -                            --sourcerpm | --suggests | --supplements | -                            --location | (-i|--info) | -                            (--changelog|--changelogs) | --querytags | -                            (--qf|--queryformat ARG)] +Usage: fedora-repoquery [--version] [-4|--dnf4] [(-q|--quiet) | (-v|--verbose)]+                        [--dynamic] [-T|--time] [-K|--koji]+                        [(-m|--mirror URL) | --cf | (-d|--dl)]+                        [(-F|--all-fedora) | (-E|--all-epel) | --all-releases]+                        [(-s|--source) | (-A|--all-archs) |+                          [-a|--repo-arch ARCH]] [-t|--testing] [-D|--debug]+                        [(-z|--cache-size) | (-e|--cache-clean-empty) |+                          --list-releases | --help-dnf |+                          [--advisories ARG | --advisory-severities ARG |+                            --arch ARG | --available | --bugfix | --bzs ARG |+                            --cves ARG | --disable-modular-filtering |+                            --duplicates | --enhancement | --exactdeps |+                            --extras | (-f|--file ARG) | --installed |+                            --installed-from-repo ARG | --installonly |+                            --latest-limit ARG | --leaves | --newpackage |+                            --providers-of ARG | --recent | --recursive |+                            --security | --srpm | --unneeded | --upgrades |+                            --userinstalled | --whatconflicts ARG |+                            (--wd|--whatdepends ARG) | --whatenhances ARG |+                            --whatobsoletes ARG | (--whatprovides|--wp ARG) |+                            --whatrecommends ARG | (--whatrequires|--wr ARG) |+                            --whatsuggests ARG | --whatsupplements ARG |+                            --conflicts | --depends | --enhances | --files |+                            (-l|--list) | --obsoletes | (-p|--provides) |+                            --recommends | (-r|--requires) | --requires-pre |+                            --sourcerpm | --suggests | --supplements |+                            --location | (-i|--info) |+                            (--changelog|--changelogs) | --querytags |+                            (--qf|--queryformat ARG)]                           [[RELEASE]... [REPOQUERY_OPTS]... [PKGSPECIFIER]...]]    where RELEASE is {fN or N (fedora), 'rawhide', epelN, epel10.x, epel9-next, cN@@ -163,8 +164,9 @@                            https://download.fedoraproject.org/pub]   --cf                     Use CloudFront cache   -d,--dl                  Use dl.fp.o-  -F,--all-fedora          Query all Fedora releases-  -E,--all-epel            Query all EPEL releases+  -F,--all-fedora          Query all current Fedora releases+  -E,--all-epel            Query all current EPEL releases+  --all-releases           Query all current releases   -s,--source              Query source repos   -A,--all-archs           Query all arch repos   -a,--repo-arch ARCH      Specify repo arch [default: x86_64]
fedora-repoquery.cabal view
@@ -1,5 +1,5 @@ name:                fedora-repoquery-version:             0.9+version:             0.9.1 synopsis:            Fedora release repos package query tool description:         A CLI tool for repoquerying Fedora and Centos Stream release packages:@@ -45,6 +45,8 @@                        URL   hs-source-dirs:      src   build-depends:       base < 5,+                       aeson,+                       bytestring,                        case-insensitive,                        curl,                        directory,@@ -60,6 +62,7 @@                        simple-cmd-args,                        text,                        time,+                       typed-process,                        xdg-basedir    default-language:    Haskell2010
src/BodhiRelease.hs view
@@ -5,40 +5,44 @@   activeFedoraRelease,   activeEPELRelease,   activeEPELMinorRelease,-  activeFedoraReleases,-  activeEPELReleases,+  activeBodhiFedoraReleases,+  activeBodhiEPELReleases,+  activeBodhiReleases,   rawhideFedoraRelease   ) where +import Data.Aeson (Object) import Data.Function (on)-import qualified Data.List as L+import Data.List.Extra import Data.Maybe (mapMaybe) import Data.Version.Extra (readVersion, showVersion, Version(..)) import Distribution.Fedora.BodhiReleases (getBodhiFedoraReleases,-                                          getBodhiEPELReleases, lookupKey)+                                          getBodhiEPELReleases,+                                          getBodhiReleases,+                                          lookupKey) import Safe (headMay) import SimpleCmd (error', (+-+)) -import Types (Natural, elnVersion)+import Types (Release, Natural, elnVersion, readRelease)  data BodhiRelease =-  Release {releaseVersion :: String, -- to handle "eln"-           releaseState ::  String,-           releaseBranch :: String,-           releaseComposed :: Bool,-           releasePostBeta :: Bool}+  BodhiRelease {releaseVersion :: String, -- to handle "eln"+                releaseState ::  String,+                releaseBranch :: Release,+                releaseComposed :: Bool,+                releasePostBeta :: Bool}   deriving Eq  activeFedoraRelease :: Natural -> IO (Maybe BodhiRelease) activeFedoraRelease n = do   -- FIXME include eol releases?-  active <- activeFedoraReleases-  case L.sortOn releaseVersion active of+  active <- activeBodhiFedoraReleases+  case sortOn releaseBranch active of     [] -> error' "failed to find active releases with Bodhi API"     (oldest:_) ->       return $-      case L.find (\r -> releaseVersion r == show n) active of+      case find (\r -> releaseVersion r == show n) active of         Just rel -> Just rel         Nothing ->           let oldver = read $ releaseVersion oldest in@@ -48,12 +52,12 @@  activeEPELRelease :: Natural -> IO (Maybe BodhiRelease) activeEPELRelease n = do-  active <- activeEPELReleases-  case L.sortOn (readVersion . releaseVersion) active of+  active <- activeBodhiEPELReleases+  case sortOn (readVersion . releaseVersion) active of     [] -> error' "failed to find active releases with Bodhi API"     (oldest:_) ->       return $-      case L.find (\r -> majorVer (releaseVersion r) == show n) active of+      case find (\r -> majorVer (releaseVersion r) == show n) active of         Just rel -> Just rel         Nothing ->           let oldver = read . majorVer $ releaseVersion oldest in@@ -65,8 +69,8 @@  activeEPELMinorRelease :: Version -> IO (Maybe BodhiRelease) activeEPELMinorRelease ver = do-  active <- activeEPELReleases-  case L.find (\r -> readVersion (releaseVersion r) == ver) active of+  active <- activeBodhiEPELReleases+  case find (\r -> readVersion (releaseVersion r) == ver) active of     Just rel -> return $ Just rel     Nothing -> do       let minors = filter (\r -> ((==) `on` majorVer) ver (readVersion . releaseVersion $ r)) active@@ -80,36 +84,32 @@         Just m -> m         Nothing -> error $ "no major version:" +-+ showVersion ver -activeFedoraReleases :: IO [BodhiRelease]-activeFedoraReleases =-  L.nub . mapMaybe maybeRelease <$> getBodhiFedoraReleases-  where-    maybeRelease obj = do-      version <- lookupKey "version" obj-      branch <- lookupKey "branch" obj-      state <- lookupKey "state" obj-      composed <- lookupKey "composed_by_bodhi" obj-      let setting = lookupKey "setting_status" obj-      return $-        Release version state branch composed $-        setting == Just ("post_beta" :: String)+activeBodhiReleases :: IO [BodhiRelease]+activeBodhiReleases =+  nubOrdOn releaseBranch . mapMaybe maybeRelease <$> getBodhiReleases -activeEPELReleases :: IO [BodhiRelease]-activeEPELReleases =-  L.nub . mapMaybe maybeRelease <$> getBodhiEPELReleases-  where-    maybeRelease obj = do-      version <- lookupKey "version" obj-      branch <- lookupKey "branch" obj-      state <- lookupKey "state" obj-      composed <- lookupKey "composed_by_bodhi" obj-      let setting = lookupKey "setting_status" obj-      return $-        Release version state branch composed $-        setting == Just ("post_beta" :: String)+activeBodhiFedoraReleases :: IO [BodhiRelease]+activeBodhiFedoraReleases =+  nubOrdOn releaseBranch . mapMaybe maybeRelease <$> getBodhiFedoraReleases +activeBodhiEPELReleases :: IO [BodhiRelease]+activeBodhiEPELReleases =+  nubOrdOn releaseBranch . mapMaybe maybeRelease <$> getBodhiEPELReleases++maybeRelease :: Object -> Maybe BodhiRelease+maybeRelease obj = do+  version <- lookupKey "version" obj+  branch <- lookupKey "branch" obj >>= readRelease+  state <- lookupKey "state" obj+  composed <- lookupKey "composed_by_bodhi" obj+  let setting = lookupKey "setting_status" obj+  return $+    BodhiRelease version state branch composed $+    setting == Just ("post_beta" :: String)++ rawhideFedoraRelease :: IO Natural rawhideFedoraRelease = do-  actives <- activeFedoraReleases+  actives <- activeBodhiFedoraReleases   let pending = map releaseVersion (filter (\r -> releaseState r == "pending") actives)-  return $ read $ maximum (L.delete "eln" pending)+  return $ read $ maximum (delete "eln" pending)
src/List.hs view
@@ -6,14 +6,14 @@ import Data.Ord (Down(Down)) import SimpleCmd ((+-+)) -import Release (activeFedoraReleases, BodhiRelease(..))+import BodhiRelease (activeBodhiReleases, BodhiRelease(..))  listVersionsCmd :: IO () listVersionsCmd =-  activeFedoraReleases >>= mapM_ printRelease . sortOn releaseSorter+  activeBodhiReleases >>= mapM_ printRelease . sortOn releaseSorter   where-    printRelease (Release _version state branch _composed _postbeta) =-      putStrLn $ branch +-+ state+    printRelease rel =+      putStrLn $ show (releaseBranch rel) +-+ releaseState rel      releaseSorter rel =-      (Down (releaseState rel), Down(releaseVersion rel))+      (Down (releaseState rel), Down (releaseBranch rel))
src/Main.hs view
@@ -14,7 +14,7 @@   ) #endif import Control.Monad (forM_, unless, when)-import Data.Either (rights, partitionEithers)+import Data.Either (partitionEithers) import Data.Maybe (isNothing) #if !MIN_VERSION_base(4,11,0) import Data.Semigroup ((<>))@@ -34,15 +34,14 @@ import List (listVersionsCmd) import Paths_fedora_repoquery (version) import Query-import Release (activeFedoraReleases, activeEPELReleases,downloadServer,-                releaseBranch, showReleaseCmd)-import Types (Mirror(..), Release (System), RepoSource(..), Verbosity(..),-              eitherRelease)+import Release (activeFedoraReleases, activeEPELReleases, activeReleases,+                downloadServer, showReleaseCmd)+import Types (Mirror(..), RepoSource(..), Verbosity(..), eitherRelease)  data Command = Query [DnfOption] [String]              | CacheSize | CacheEmpties | DnfHelp | ReleaseList -data AllReleases = AllFedora | AllEPEL+data AllReleases = AllFedora | AllEPEL | AllReleases  main :: IO () main = do@@ -69,9 +68,9 @@           <*> ((Mirror <$> strOptionWith 'm' "mirror" "URL" ("Fedora mirror [default: " ++ downloadServer ++ "]")) <|>                flagLongWith' CloudFront "cf" "Use CloudFront cache" <|>                flagWith DownloadFpo DlFpo 'd' "dl" "Use dl.fp.o"))-    -- FIXME: --all-releases ?-    <*> optional (flagWith' AllFedora 'F' "all-fedora" "Query all Fedora releases" <|>-                  flagWith' AllEPEL 'E' "all-epel" "Query all EPEL releases")+    <*> optional (flagWith' AllFedora 'F' "all-fedora" "Query all current Fedora releases" <|>+                  flagWith' AllEPEL 'E' "all-epel" "Query all current EPEL releases" <|>+                  flagLongWith' AllReleases "all-releases" "Query all current releases")     <*> (flagWith' [Source] 's' "source" "Query source repos" <|>          flagWith' allArchs 'A' "all-archs" "Query all arch repos" <|>          many (optionWith (eitherReader eitherArch) 'a' "repo-arch" "ARCH" ("Specify repo arch [default:" +-+ showArch sysarch ++ "]")))@@ -168,7 +167,7 @@       let (args,releases) = partitionEithers $ map eitherRelease relargs       in do         unless (null releases || isNothing mallreleases) $-          error' "cannot specify releases and --all-releases"+          error' "cannot specify releases and --all-{fedora,epel}"         when (null releases && isNothing mallreleases) $           when (verbose == Verbose || debug) $           warning "(using system repos)"@@ -177,17 +176,18 @@           then             case mallreleases of               Just allreleases ->-                rights . map (eitherRelease . releaseBranch)-                <$> case allreleases of-                      AllFedora -> activeFedoraReleases-                      AllEPEL -> activeEPELReleases-              Nothing -> return [System]-          else return releases-        forM_ releaselist $ \release ->+                map Just <$>+                case allreleases of+                  AllFedora -> activeFedoraReleases+                  AllEPEL -> activeEPELReleases+                  AllReleases -> activeReleases+              Nothing -> return [Nothing]+          else return $ map Just releases+        forM_ releaselist $ \mrelease ->           if null args && null opts           then if null archs-               then showReleaseCmd debug dynredir reposource release sysarch Nothing testing-               else forM_ archs $ \arch -> showReleaseCmd debug dynredir reposource release sysarch (Just arch) testing+               then showReleaseCmd debug dynredir reposource mrelease sysarch Nothing testing+               else forM_ archs $ \arch -> showReleaseCmd debug dynredir reposource mrelease sysarch (Just arch) testing           else             let multiple = length releaselist > 1 || length archs > 1-            in repoqueryCmd dnf4 debug verbose multiple dynredir time release reposource sysarch archs testing opts args+            in repoqueryCmd dnf4 debug verbose multiple dynredir time mrelease reposource sysarch archs testing opts args
src/Query.hs view
@@ -6,13 +6,15 @@   ) where  import Control.Monad.Extra+import qualified Data.ByteString.Lazy as B import Data.Char (isSpace) import Data.List.Extra-import Data.Maybe (isJust, fromMaybe)+import Data.Maybe (fromMaybe, isJust, isNothing) import Safe (lastMay)-import SimpleCmd (cmdLines) import System.Directory (doesFileExist, findExecutable)+import System.Exit (exitFailure, ExitCode(ExitSuccess)) import System.FilePath (takeBaseName, (<.>))+import System.Process.Typed (proc, readProcess)  import Arch import Common (warning)@@ -51,15 +53,15 @@     "changelogs"   ] -repoqueryCmd :: Bool -> Bool -> Verbosity -> Bool -> Bool -> Bool -> Release-             -> RepoSource -> Arch -> [Arch] -> Bool -> [DnfOption]-             -> [String] -> IO ()-repoqueryCmd dnf4 debug verbose multiple dynredir checkdate release reposource sysarch archs testing opts args = do+repoqueryCmd :: Bool -> Bool -> Verbosity -> Bool -> Bool -> Bool+             -> Maybe Release -> RepoSource -> Arch -> [Arch] -> Bool+             -> [DnfOption] -> [String] -> IO ()+repoqueryCmd dnf4 debug verbose multiple dynredir checkdate mrelease reposource sysarch archs testing opts args = do   forM_ (if null archs then [sysarch] else archs) $ \arch -> do     repoConfigs <--      if release == System-      then return []-      else getRelease debug dynredir True checkdate reposource release sysarch (Just arch) testing+      case mrelease of+        Nothing -> return []+        Just release -> getRelease debug dynredir True checkdate reposource release sysarch (Just arch) testing     -- dnf5 writes repo update output to stdout     -- https://github.com/rpm-software-management/dnf5/issues/1361     -- but seems to cache better@@ -76,17 +78,21 @@                   ["--disableplugin=subscription-manager" | rhsm] ++                   ["--queryformat=" ++ queryformat | queryFormatAllowed] ++                   -- drop modules for F39+-                  ["--setopt=module_platform_id=platform:" ++ show release] +++                  ["--setopt=module_platform_id=platform:" ++ maybe "system" show mrelease] ++                   concatMap renderRepoConfig repoConfigs ++                   map (renderOption . tweakQfOpt (isJust mdnf5)) opts ++ args     -- FIXME drop "/usr/bin/"?     let dnf = fromMaybe "/usr/bin/dnf-3" mdnf5     when debug $       warning $ unwords $ ('\n' : takeBaseName dnf) : map show cmdargs-    res <- cmdLines dnf cmdargs-    unless (null res) $ do-      unless (not checkdate || release == System || multiple) $ warning ""-      putStrLn $ intercalate "\n" res+    -- We have to be careful here: this can be a very large output+    -- https://bugzilla.redhat.com/show_bug.cgi?id=2493905+    (ok, out, err) <- readProcess $ proc dnf cmdargs+    unless (B.null err) $ B.putStr err+    unless (B.null out) $ do+      unless (not checkdate || isNothing mrelease || multiple) $ warning ""+      B.putStr out+    unless (ok == ExitSuccess) exitFailure   where     queryFormatAllowed =       not $ any (`elem` map DnfFlag noQueryFormatOptions) opts
src/Release.hs view
@@ -5,16 +5,17 @@   getRelease,   activeFedoraReleases,   activeEPELReleases,-  BodhiRelease(..),+  activeReleases,   downloadServer   ) where -import Control.Monad.Extra (forM_, unless, void, when)+import Control.Monad.Extra (forM_, void, when) import Data.Bifunctor (first) import qualified Data.CaseInsensitive as CI import Data.List.Extra import Data.Maybe (fromMaybe)+import Data.Ord (Down(Down)) import qualified Data.Text as T import Data.Time.Format (defaultTimeLocale, parseTimeM, rfc822DateFormat) import Data.Time.LocalTime (utcToLocalZonedTime)@@ -36,9 +37,11 @@ import Types import URL -showReleaseCmd :: Bool -> Bool -> RepoSource -> Release  -> Arch -> Maybe Arch-               -> Bool -> IO ()-showReleaseCmd debug dynredir reposource release sysarch march testing =+showReleaseCmd :: Bool -> Bool -> RepoSource -> Maybe Release  -> Arch+               -> Maybe Arch -> Bool -> IO ()+showReleaseCmd _debug _dynredir _reposource Nothing _sysarch _march _testing =+  return ()+showReleaseCmd debug dynredir reposource (Just release) sysarch march testing =   void $ getRelease debug dynredir False True reposource release sysarch march testing  getRelease :: Bool -> Bool -> Bool -> Bool -> RepoSource -> Release -> Arch@@ -131,7 +134,6 @@                    [("epel-testing",url +//+ ["testing", show n ++ "." ++ show m]) | testing],                    [])         EPEL9Next -> return ([("epelnext",urlpath)],[])-        System -> error' "showRelease: unsupported for system"   rawhide <- rawhideFedoraRelease   let basicrepourls =         map (repoConfigArgs reposource sysarch march rawhide release) basicrepos@@ -140,7 +142,7 @@   forM_ basicrepourls $ \(reponame,(url',path')) -> do     let baserepo = url' +//+ path'     when debug $ print $ renderUrl Dir baserepo-    unless (not checkdate || release == System) $ do+    when checkdate $ do       let composeinfo =             url' +//+             if koji@@ -158,7 +160,6 @@                             then ["Everything" | n >= 28] ++ ["state"]                             else ["COMPOSE_ID"]                 Rawhide -> ["COMPOSE_ID"]-                System -> error' "system not supported"       let composeUrl = renderUrl File composeinfo       when debug $ print composeUrl       mtimestr <- curlGetHeader Nothing "Last-Modified" composeUrl@@ -225,7 +226,7 @@           -- state values: ["disabled","pending","frozen","current","archived"]           let pending = releaseState rel /= "current"               postbeta = releasePostBeta rel-              rawhide = pending && releaseBranch rel == "rawhide"+              rawhide = pending && releaseBranch rel == Rawhide               releasestr = if rawhide then "rawhide" else show n           in             if arch == RISCV64@@ -235,7 +236,6 @@               [if pending || postbeta then "development" else "releases",                releasestr]     Rawhide -> getFedoraServer debug dynredir reposource fedoraTop ["development", "rawhide"]-    System -> error' "getURL: unsupported for system"   where     fedoraTop =       -- FIXME support older archs@@ -275,7 +275,6 @@           EPEL9Next -> ["Everything", showArch arch]           Fedora _ -> ["Everything", showArch arch] ++ (if arch == Source then ["tree"] else ["os" | repo `elem` ["releases","development"]])           Rawhide -> ["Everything", showArch arch, if arch == Source then "tree" else "os"]-          System -> error' "repoConfigArgs: unsupported for system"   in (reponame, (url, path ++ ["/"]))   where     repoVersion :: String@@ -293,7 +292,6 @@         Centos _ -> show release ++ '-':repo         OldCentos 8 -> show release ++  '-':repo         OldCentos _ -> show release-        System -> "" -- koji repoConfigArgs (RepoSource True _mirror) sysarch march _rawhide release (repo,url) =   let (compose,path) =@@ -387,3 +385,19 @@     (_,"") -> s     (_,_) -> dropWhileEnd (== '/') s ++ '/' : dropWhile (== '/') t #endif++activeFedoraReleases :: IO [Release]+activeFedoraReleases =+  sortReleases <$> activeBodhiFedoraReleases++activeEPELReleases :: IO [Release]+activeEPELReleases =+  sortReleases <$> activeBodhiEPELReleases++activeReleases :: IO [Release]+activeReleases =+  sortReleases <$> activeBodhiReleases++sortReleases :: [BodhiRelease] -> [Release]+sortReleases =+  sortOn Down . map releaseBranch
src/Types.hs view
@@ -7,6 +7,7 @@   Verbosity(..),   Release(..),   eitherRelease,+  readRelease,   elnVersion   ) where @@ -35,9 +36,42 @@              | Fedora Natural              | ELN              | Rawhide-             | System-  deriving (Eq, Ord)+  deriving Eq +-- derived from fedora-releases Branch+-- | defined such that: EPELNext 9 < EPEL 10 < Fedora 41 < Rawhide+instance Ord Release where+  compare Rawhide Rawhide = EQ+  compare ELN ELN = EQ+  compare (Fedora m) (Fedora n) = compare m n+  compare (EPEL m) (EPEL n) = compare m n+  compare (EpelMinor m1 n1) (EpelMinor m2 n2) =+    case compare m1 m2 of+      LT -> LT+      GT -> GT+      EQ -> compare n1 n2+  compare EPEL9Next EPEL9Next = EQ+  compare (Centos m) (Centos n) = compare m n+  compare (OldCentos m) (OldCentos n) = compare m n+  compare Rawhide _ = GT+  compare _ Rawhide = LT+  compare ELN _ = GT+  compare _ ELN = LT+  compare (Fedora _) _ = GT+  compare _ (Fedora _) = LT+  compare (EPEL m) EPEL9Next = if m == 9 then LT else compare m 9+  compare EPEL9Next (EPEL n) = if n == 9 then GT else compare 9 n+  compare (EPEL m) (EpelMinor maj _) = if m >= maj then GT else LT+  compare (EpelMinor maj _) (EPEL n) = if maj <= n then LT else GT+  compare (EpelMinor _ _) EPEL9Next = GT+  compare EPEL9Next (EpelMinor _ _) = LT+  compare (Centos _) (OldCentos _) = GT+  compare (OldCentos _) (Centos _) = LT+  compare (Centos _) _ = LT+  compare _ (Centos _) = GT+  compare (OldCentos _) _ = LT+  compare _ (OldCentos _) = GT+ -- FIXME determine via EPEL or Centos elnVersion :: Natural elnVersion = 11@@ -87,6 +121,12 @@                    GT -> Fedora r     _ -> Left rel +readRelease :: String -> Maybe Release+readRelease s =+  case eitherRelease s of+    Right r -> Just r+    Left _ -> Nothing+ instance Show Release where   show Rawhide = "rawhide"   show (Fedora n) = "f" ++ show n@@ -96,4 +136,3 @@   show ELN = "eln"   show (Centos n) = 'c' : show n ++ "s"   show (OldCentos n) = 'c' : show n-  show System = "system"
test/tests.hs view
@@ -27,12 +27,14 @@  tests :: [([String],Maybe String)] tests =-  [(["rawhide"], Nothing)+  [(["--list-releases"], Nothing)+  ,(["rawhide"], Nothing)   ,(["-D","rawhide"], Nothing)   ,([current], Nothing)   ,([previous], Nothing)   ,(["eln"], Nothing)   ,(["epel10"], Nothing)+  ,(["epel10.2"], Nothing)   ,(["epel9"], Nothing)   ,(["epel8"], Nothing)   ,(["epel7"], Nothing)