packages feed

fedora-repoquery 0.8.2 → 0.9

raw patch · 9 files changed

+300/−132 lines, 9 filesdep +http-directory

Dependencies added: http-directory

Files

ChangeLog.md view
@@ -1,5 +1,14 @@ # Version history for fedora-repoquery +## 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+- error for i386 arch unless epel6, f25, c7, or older+- do not include i386 in `--all-archs` (regression in 0.8.2)+ ## 0.8.2 (2026-05-10) - `--all-archs`: also include source and i386 - `--koji`: map epel10 to epel10.x
README.md view
@@ -10,7 +10,7 @@ `$ fedora-repoquery rawhide firefox`  ```-firefox-150.0.1-1.fc45.x86_64 (fedora-rawhide)+firefox-152.0-1.fc45.x86_64 (fedora-rawhide) ``` (note it is shorter to write `fedora-repoquery 45`). @@ -30,13 +30,14 @@ `$ fedora-repoquery c10 bash`  ```+bash-5.2.26-4.el10.x86_64 (c10s-BaseOS) bash-5.2.26-6.el10.x86_64 (c10s-BaseOS) ```  `$ fedora-repoquery eln kernel`  ```-kernel-7.1.0-0.rc2.260507g8ab992f815d6.19.eln156.x86_64 (eln-BaseOS)+kernel-7.1.0-0.rc3.260512g50897c955902.24.eln156.x86_64 (eln-BaseOS) ```  Without a release argument, the system yum repo configuration is used:@@ -50,8 +51,9 @@ `$ fedora-repoquery --whatrequires pandoc`  ```+openqa-devel-5^20260604git6376095-3.fc45.noarch (rawhide) pandoc-pdf-3.7.0.2-40.fc44.x86_64 (rawhide)-python3-pypandoc-1.16.2-1.fc44.noarch (rawhide)+python3-pypandoc-1.17-2.fc45.noarch (rawhide) ```  Use the --time (-T) option to display repo timestamps:@@ -70,7 +72,7 @@  ``` 2026-04-24 23:40:25 +08 <https://mirror.freedif.org/fedora/fedora/linux/releases/44/>-2026-05-10 10:47:00 +08 <https://mirror.freedif.org/fedora/fedora/linux/updates/44/>+2026-06-26 08:57:49 +08 <https://mirror.freedif.org/fedora/fedora/linux/updates/44/> ```  One can also query multiple releases (or arch's):@@ -79,9 +81,9 @@  ``` python3-3.14.0-1.fc43.x86_64 (f43)-python3-3.14.4-2.fc43.x86_64 (f43-updates)+python3-3.14.5-1.fc43.x86_64 (f43-updates) python3-3.14.3-2.fc44.x86_64 (f44)-python3-3.14.4-2.fc44.x86_64 (f44-updates)+python3-3.14.6-1.fc44.x86_64 (f44-updates) ```  There is an option to use the CloudFront cache:@@ -90,16 +92,22 @@  ``` rust-1.94.1-1.fc44.x86_64 (f44-cf)-rust-1.95.0-1.fc44.x86_64 (f44-updates-cf)+rust-1.96.0-1.fc44.x86_64 (f44-updates-cf) ``` 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)+```+ ## Help `$ fedora-repoquery --version`  ```-0.8.2+0.9 ```  `$ fedora-repoquery --help`@@ -109,7 +117,8 @@  Usage: fedora-repoquery [--version] [-4|--dnf4] [(-q|--quiet) | (-v|--verbose)]                          [--dynamic] [-T|--time] [-K|--koji] -                        [(-m|--mirror URL) | --cf | (-d|--dl)] [-F|--all-fedora]+                        [(-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) | @@ -155,6 +164,7 @@   --cf                     Use CloudFront cache   -d,--dl                  Use dl.fp.o   -F,--all-fedora          Query all Fedora releases+  -E,--all-epel            Query all EPEL 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.8.2+version:             0.9 synopsis:            Fedora release repos package query tool description:         A CLI tool for repoquerying Fedora and Centos Stream release packages:@@ -52,6 +52,7 @@                        fedora-releases >= 0.2,                        filepath,                        Glob,+                       http-directory,                        optparse-applicative,                        regex-compat,                        safe,
src/Arch.hs view
@@ -21,7 +21,8 @@   deriving Eq  allArchs :: [Arch]-allArchs = [Source, X86_64, AARCH64, PPC64LE, S390X, I386]+-- no i386 repos after F25 and epel6+allArchs = [Source, X86_64, AARCH64, PPC64LE, S390X]  eitherArch :: String -> Either String Arch eitherArch s =
src/BodhiRelease.hs view
@@ -3,18 +3,24 @@ module BodhiRelease (   BodhiRelease (..),   activeFedoraRelease,+  activeEPELRelease,+  activeEPELMinorRelease,   activeFedoraReleases,-  fedoraReleaseState,+  activeEPELReleases,   rawhideFedoraRelease   ) where +import Data.Function (on) import qualified Data.List as L import Data.Maybe (mapMaybe)-import Distribution.Fedora.BodhiReleases (getBodhiFedoraReleases, lookupKey)-import SimpleCmd (error')+import Data.Version.Extra (readVersion, showVersion, Version(..))+import Distribution.Fedora.BodhiReleases (getBodhiFedoraReleases,+                                          getBodhiEPELReleases, lookupKey)+import Safe (headMay)+import SimpleCmd (error', (+-+)) -import Types (Natural)+import Types (Natural, elnVersion)  data BodhiRelease =   Release {releaseVersion :: String, -- to handle "eln"@@ -24,18 +30,56 @@            releasePostBeta :: Bool}   deriving Eq --- Left is oldest active version-activeFedoraRelease :: Natural -> IO (Either Natural BodhiRelease)+activeFedoraRelease :: Natural -> IO (Maybe BodhiRelease) activeFedoraRelease n = do+  -- FIXME include eol releases?   active <- activeFedoraReleases   case L.sortOn releaseVersion active of     [] -> error' "failed to find active releases with Bodhi API"     (oldest:_) ->       return $       case L.find (\r -> releaseVersion r == show n) active of-        Just rel -> Right rel-        Nothing -> Left $ read $ releaseVersion oldest+        Just rel -> Just rel+        Nothing ->+          let oldver = read $ releaseVersion oldest in+            if n < oldver+            then Nothing+            else error' $ "unknown fedora release:" +-+ show n +activeEPELRelease :: Natural -> IO (Maybe BodhiRelease)+activeEPELRelease n = do+  active <- activeEPELReleases+  case L.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+        Just rel -> Just rel+        Nothing ->+          let oldver = read . majorVer $ releaseVersion oldest in+            if n < oldver+            then Nothing+            else error' $ "unknown epel release:" +-+ show n+  where+    majorVer = takeWhile (/= '.')++activeEPELMinorRelease :: Version -> IO (Maybe BodhiRelease)+activeEPELMinorRelease ver = do+  active <- activeEPELReleases+  case L.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+      if majorVer ver < fromIntegral elnVersion &&+         all (\r -> readVersion (releaseVersion r) > ver) minors+      then return Nothing+      else error' $ "unknown epel release:" +-+ showVersion ver+  where+    majorVer v =+      case headMay $ versionBranch v of+        Just m -> m+        Nothing -> error $ "no major version:" +-+ showVersion ver+ activeFedoraReleases :: IO [BodhiRelease] activeFedoraReleases =   L.nub . mapMaybe maybeRelease <$> getBodhiFedoraReleases@@ -50,13 +94,19 @@         Release version state branch composed $         setting == Just ("post_beta" :: String) -fedoraReleaseState :: Natural -> IO String-fedoraReleaseState n = do-  eactive <- activeFedoraRelease n-  return $-    case eactive of-      Left _ -> error' $ "could find F" ++ show n ++ " release (state)"-      Right rel -> releaseState rel+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)  rawhideFedoraRelease :: IO Natural rawhideFedoraRelease = do
src/Main.hs view
@@ -15,6 +15,7 @@ #endif import Control.Monad (forM_, unless, when) import Data.Either (rights, partitionEithers)+import Data.Maybe (isNothing) #if !MIN_VERSION_base(4,11,0) import Data.Semigroup ((<>)) #endif@@ -33,14 +34,16 @@ import List (listVersionsCmd) import Paths_fedora_repoquery (version) import Query-import Release (activeFedoraReleases, downloadServer, releaseBranch,-                showReleaseCmd)+import Release (activeFedoraReleases, activeEPELReleases,downloadServer,+                releaseBranch, showReleaseCmd) import Types (Mirror(..), Release (System), RepoSource(..), Verbosity(..),               eitherRelease)  data Command = Query [DnfOption] [String]              | CacheSize | CacheEmpties | DnfHelp | ReleaseList +data AllReleases = AllFedora | AllEPEL+ main :: IO () main = do   hSetBuffering stdout NoBuffering@@ -66,8 +69,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-epel and --all-releases-    <*> switchWith 'F' "all-fedora" "Query all Fedora releases"+    -- FIXME: --all-releases ?+    <*> optional (flagWith' AllFedora 'F' "all-fedora" "Query all Fedora releases" <|>+                  flagWith' AllEPEL 'E' "all-epel" "Query all EPEL 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 ++ "]")))@@ -151,9 +155,9 @@   <|> dnfFlag "querytags"   <|> dnfOption'' "qf" "queryformat" -runMain :: Arch -> Bool -> Verbosity -> Bool -> Bool -> RepoSource -> Bool-        -> [Arch] -> Bool -> Bool -> Command -> IO ()-runMain sysarch dnf4 verbose dynredir time reposource allreleases archs testing debug command = do+runMain :: Arch -> Bool -> Verbosity -> Bool -> Bool -> RepoSource+        -> Maybe AllReleases -> [Arch] -> Bool -> Bool -> Command -> IO ()+runMain sysarch dnf4 verbose dynredir time reposource mallreleases archs testing debug command = do   case command of     CacheSize -> cacheSize     CacheEmpties -> cleanEmptyCaches@@ -163,19 +167,21 @@       -- spanJust from utility-ht nicer but this gets us enough       let (args,releases) = partitionEithers $ map eitherRelease relargs       in do-        unless (null releases || not allreleases) $+        unless (null releases || isNothing mallreleases) $           error' "cannot specify releases and --all-releases"-        when (null releases && not allreleases) $+        when (null releases && isNothing mallreleases) $           when (verbose == Verbose || debug) $           warning "(using system repos)"         releaselist <-           if null releases           then-            if allreleases-            then-              rights . map (eitherRelease . releaseBranch)-              <$> activeFedoraReleases-            else return [System]+            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 ->           if null args && null opts
src/Release.hs view
@@ -4,6 +4,7 @@   showReleaseCmd,   getRelease,   activeFedoraReleases,+  activeEPELReleases,   BodhiRelease(..),   downloadServer   )@@ -14,12 +15,18 @@ import qualified Data.CaseInsensitive as CI import Data.List.Extra import Data.Maybe (fromMaybe)+import qualified Data.Text as T import Data.Time.Format (defaultTimeLocale, parseTimeM, rfc822DateFormat) import Data.Time.LocalTime (utcToLocalZonedTime)-import Data.Version.Extra (readVersion, Version(..))+import Data.Version.Extra (makeVersion, readVersion, showVersion, Version(..)) import qualified Distribution.Fedora.Release as F import Network.Curl (curlHead, CurlOption(..))-import Safe (tailSafe)+import Network.HTTP.Directory (httpDirectory', noTrailingSlash,+#if MIN_VERSION_http_directory(0,1,9)+                               (+/+)+#endif+                              )+import Safe (lastMay, tailSafe) import SimpleCmd (error', (+-+)) import Text.Regex (mkRegex, subRegex) @@ -47,6 +54,7 @@                        _ -> error' $ "invalid minor branch version:" +-+ version                getRelease' debug dynredir warn checkdate reposource (EpelMinor n minor) sysarch march testing     _ -> getRelease' debug dynredir warn checkdate reposource release sysarch march testing+ -- FIXME should warn or error if url (release) does not exist getRelease' :: Bool -> Bool -> Bool -> Bool -> RepoSource -> Release -> Arch            -> Maybe Arch -> Bool -> IO [(String, URL)]@@ -58,66 +66,72 @@   (basicrepos,morerepos) <-     if koji     then return ([("koji",urlpath)],[])-    else-    case release of-      Centos n -> return ([("BaseOS",urlpath)],-                          [("AppStream",url),(if n >= 9 then "CRB" else "PowerTools",url)])-      ELN -> return ([("BaseOS",urlpath)],-                     [("AppStream",urlpath),("CRB",urlpath)])-      Rawhide -> return ([("development", urlpath)],[])-      -- curl -s https://bodhi.fedoraproject.org/releases/?exclude_archived=True | jq-      Fedora n -> do-        eactiverelease <- activeFedoraRelease n-        case eactiverelease of-          Left _oldest ->-              return (("releases", urlpath) :+    else do+      when (arch == I386) $ checkI386Release release+      case release of+        OldCentos n -> return $+                       if n >= 8+                       then ([("BaseOS",urlpath)],+                             [("AppStream",url),("PowerTools",url)])+                       else ([("os",urlpath)],[])+        Centos n -> return ([("BaseOS",urlpath)],+                            [("AppStream",url),(if n >= 9 then "CRB" else "PowerTools",url)])+        ELN -> return ([("BaseOS",urlpath)],+                       [("AppStream",urlpath),("CRB",urlpath)])+        Rawhide -> return ([("development", urlpath)],[])+        -- curl -s https://bodhi.fedoraproject.org/releases/?exclude_archived=True | jq+        Fedora n -> do+          mactiverelease <- activeFedoraRelease n+          case mactiverelease of+            Nothing ->+                return (("releases", urlpath) :+                        ("updates", url +//+ ["updates",show n]) :+                        [("updates-testing", url +//+ ["updates","testing",show n]) | testing]+                       ,[])+            Just rel -> do+              let composed = releaseComposed rel+                  state = releaseState rel+                  postbeta = releasePostBeta rel+              return $+            -- after Beta Freeze+            -- {"state": "pending", "composed_by_bodhi": true,+            --  "create_automatic_updates": false, "setting_status": "post_beta"}+            --+            -- final freeze+            -- {"state": "frozen", "composed_by_bodhi": true,+            --  "create_automatic_updates": false, "setting_status": "post_beta"}+            --+            -- final unfrozen+            -- {"state": "current", "composed_by_bodhi": true,+            --  "create_automatic_updates": false, "setting_status": "post_beta"}+            --+            -- released+            -- {"state": "current", "composed_by_bodhi": true,+            --  "create_automatic_updates": false, "setting_status": null}+            --+            -- Rawhide+            -- {"state": "pending", "composed_by_bodhi": false,+            --  "create_automatic_updates": true, "setting_status": "pre_beta"}+                if state `elem` ["pending","frozen"] || state == "current" && postbeta+                then (("development", urlpath) :+                      [("updates", url +//+ ["updates",show n]) | postbeta , state == "current"] +++                      -- FIXME add way to disable or invert testing+                      [("updates-testing", url +//+ ["updates","testing",show n]) | testing || composed, state /= "current"]+                     ,[])+                else (("releases", urlpath) :                       ("updates", url +//+ ["updates",show n]) :-                      [("updates-testing", url +//+ ["updates","testing",show n]) | testing]+                      [("updates-testing", url +//+ ["updates","testing",show n]) | testing || postbeta]                      ,[])-          Right rel -> do-            let composed = releaseComposed rel-                state = releaseState rel-                postbeta = releasePostBeta rel-            return $-          -- after Beta Freeze-          -- {"state": "pending", "composed_by_bodhi": true,-          --  "create_automatic_updates": false, "setting_status": "post_beta"}-          ---          -- final freeze-          -- {"state": "frozen", "composed_by_bodhi": true,-          --  "create_automatic_updates": false, "setting_status": "post_beta"}-          ---          -- final unfrozen-          -- {"state": "current", "composed_by_bodhi": true,-          --  "create_automatic_updates": false, "setting_status": "post_beta"}-          ---          -- released-          -- {"state": "current", "composed_by_bodhi": true,-          --  "create_automatic_updates": false, "setting_status": null}-          ---          -- Rawhide-          -- {"state": "pending", "composed_by_bodhi": false,-          --  "create_automatic_updates": true, "setting_status": "pre_beta"}-              if state `elem` ["pending","frozen"] || state == "current" && postbeta-              then (("development", urlpath) :-                    [("updates", url +//+ ["updates",show n]) | postbeta , state == "current"] ++-                    -- FIXME add way to disable or invert testing-                    [("updates-testing", url +//+ ["updates","testing",show n]) | testing || composed, state /= "current"]-                   ,[])-              else (("releases", urlpath) :-                    ("updates", url +//+ ["updates",show n]) :-                    [("updates-testing", url +//+ ["updates","testing",show n]) | testing || postbeta]-                   ,[])-      EPEL n -> return-                (("epel",urlpath) :-                 [("epel-testing",url +//+ ["testing", show n]) | testing],-                 [])-      EpelMinor n m -> return-                (("epel",urlpath) :-                 [("epel-testing",url +//+ ["testing", show n ++ "." ++ show m]) | testing],-                 [])-      EPEL9Next -> return ([("epelnext",urlpath)],[])-      System -> error' "showRelease: unsupported for system"+        EPEL n -> return+                  (("epel",urlpath) :+                   [("epel-testing",url +//+ ["testing", show n]) | testing],+                   [])+        EpelMinor n m -> return+                  (("epel",urlpath) :+                   [("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@@ -133,14 +147,15 @@             then ["repo.json"]             else               case release of+                OldCentos _ -> ["COMPOSE_ID"]                 Centos 10 -> ["metadata","composeinfo.json"]                 Centos _ -> ["COMPOSE_ID"] -- ["metadata","composeinfo.json"]                 ELN -> ["COMPOSE_ID"]-                EPEL _ -> ["Everything", "state"]+                EPEL n -> ["Everything" | n >= 8] ++ ["state"]                 EpelMinor _ _ -> ["Everything", "state"]                 EPEL9Next -> ["Everything", "state"]-                Fedora _ -> if "updates" `isInfixOf` reponame-                            then ["Everything", "state"]+                Fedora n -> if "updates" `isInfixOf` reponame+                            then ["Everything" | n >= 28] ++ ["state"]                             else ["COMPOSE_ID"]                 Rawhide -> ["COMPOSE_ID"]                 System -> error' "system not supported"@@ -161,13 +176,19 @@        -> IO (URL,[String]) getURL debug dynredir reposource@(RepoSource koji _mirror) release arch =   case release of+    OldCentos n -> do+      url <- getOldCentosURL n+      return (URL url, [])     Centos n ->       case n of         10 ->           let url = URL $                 if koji                 then "https://odcs.stream.centos.org/stream-10"-                else "https://composes.stream.centos.org/stream-10/production/latest-CentOS-Stream/compose/"+                else+                  -- FIXME add --nightly and --devel flags?+                  -- was "https://composes.stream.centos.org/stream-10/production/latest-CentOS-Stream/compose/"+                  "https://mirror.stream.centos.org/10-stream/"           in return (url,[])         9 ->           let url = URL $@@ -176,25 +197,31 @@                 else "https://mirror.stream.centos.org/9-stream/"           in return (url,[])         8 -> return (URL "http://vault.centos.org/8-stream/", [])-        _ -> error' "old Centos is not supported"+        _ -> error' $ "unknown centos-stream" +-+ show n     ELN ->       getFedoraServer debug dynredir reposource ["eln"] ["1"]-    EPEL n | n < 7 ->-               return-               (URL "https://archives.fedoraproject.org/pub/archive/epel", [show n])-    EPEL n -> getFedoraServer debug dynredir reposource ["epel"] [show n]-    EpelMinor n m -> getFedoraServer debug dynredir reposource ["epel"] [show n ++ "." ++ show m]+    EPEL n -> do+      mactiverel <- activeEPELRelease n+      case mactiverel of+        Nothing ->+          return+          (URL "https://archives.fedoraproject.org/pub/archive/epel", [show n])+        Just _rel -> getFedoraServer debug dynredir reposource ["epel"] [show n]+    EpelMinor n m -> do+      let ver = makeVersion $ map fromIntegral [n,m]+      mactiverel <- activeEPELMinorRelease ver+      case mactiverel of+        Just _rel -> getFedoraServer debug dynredir reposource ["epel"] [show n ++ "." ++ show m]+        Nothing ->+          return (URL "https://archives.fedoraproject.org/pub/archive/epel", [show n ++ "." ++ show m])     EPEL9Next -> getFedoraServer debug dynredir reposource ["epel","next"] ["9"]     Fedora n -> do-      eactiverelease <- activeFedoraRelease n-      case eactiverelease of-        Left oldest ->-          if n < oldest-          then+      mactiverel <- activeFedoraRelease n+      case mactiverel of+        Nothing ->           return           (URL "https://archives.fedoraproject.org/pub/archive" +//+ fedoraTop, ["releases", show n])-          else error' $ "unknown fedora release:" +-+ show n-        Right rel ->+        Just rel ->           -- state values: ["disabled","pending","frozen","current","archived"]           let pending = releaseState rel /= "current"               postbeta = releasePostBeta rel@@ -240,6 +267,7 @@                    CloudFront -> "-cf"       path =         case release of+          OldCentos n -> [repo, showArch arch] ++ ["os" | n == 8]           Centos _ -> [repo, showArch arch] ++ (if arch == Source then ["tree"] else ["os"])           ELN -> [repo, showArch arch] ++ (if arch == Source then ["tree"] else ["os"])           EPEL n -> (if n >= 8 then ("Everything" :) else id) [showArch arch] ++ ["tree" | arch == Source]@@ -263,6 +291,8 @@         EPEL9Next -> show release ++ if repo == "epelnext-testing" then "-testing" else ""         EPEL _ -> show release ++ if repo == "epel-testing" then "-testing" else ""         Centos _ -> show release ++ '-':repo+        OldCentos 8 -> show release ++  '-':repo+        OldCentos _ -> show release         System -> "" -- koji repoConfigArgs (RepoSource True _mirror) sysarch march _rawhide release (repo,url) =@@ -329,4 +359,31 @@ #if !MIN_VERSION_base(4,15,0) singleton :: a -> [a] singleton x = [x]+#endif++checkI386Release :: Release -> IO ()+checkI386Release release =+  case release of+    Fedora n | n < 26 -> return ()+    EPEL n | n < 7 -> return ()+    OldCentos n | n < 8 -> return ()+    _ -> error' $ showArch I386 +-+ "not available for" +-+ show release++getOldCentosURL :: Natural -> IO String+getOldCentosURL n = do+  let vault = "https://vault.centos.org"+  ls <- map (T.unpack . noTrailingSlash) <$> httpDirectory' vault+  let vers = filter (show n `isPrefixOf`) ls \\ ["8-stream", "4.0beta", "4.2beta"]+  case lastMay $ sort $ map readVersion vers of+    Nothing -> error' $ "unknown centos version" +-+ show n+    Just latest -> return $ vault +/+ showVersion latest++#if !MIN_VERSION_http_directory(0,1,9)+infixr 5 +/++(+/+) :: String -> String -> String+s +/+ t =+  case (s,t) of+    ("",_) -> t+    (_,"") -> s+    (_,_) -> dropWhileEnd (== '/') s ++ '/' : dropWhile (== '/') t #endif
src/Types.hs view
@@ -6,12 +6,14 @@   RepoSource(..),   Verbosity(..),   Release(..),-  eitherRelease+  eitherRelease,+  elnVersion   ) where  import Data.Char (isDigit) import Data.List.Extra (lower, unsnoc) import Numeric.Natural+import SimpleCmd (error', (+-+))  --import Distribution.Fedora.Repoquery @@ -21,14 +23,19 @@ data Mirror = DownloadFpo | DlFpo | CloudFront | Mirror String   deriving Eq --- FIXME: True for koji make into type+-- FIXME: True for koji, make into type data RepoSource = RepoSource Bool Mirror   deriving Eq --- FIXME deal with epel11.x-data Release = EpelMinor Natural Natural | EPEL Natural | EPEL9Next-             | Centos Natural | Fedora Natural-             | ELN | Rawhide | System+data Release = EpelMinor Natural Natural+             | EPEL Natural+             | EPEL9Next+             | OldCentos Natural+             | Centos Natural+             | Fedora Natural+             | ELN+             | Rawhide+             | System   deriving (Eq, Ord)  -- FIXME determine via EPEL or Centos@@ -43,21 +50,31 @@     "rawhide" -> Right Rawhide     -- FIXME add proper parsing:     "epel9-next" -> Right EPEL9Next-    -- FIXME add epel11.x-    ('e':'p':'e':'l':'1':'0':'.':n@(_:_)) | all isDigit n -> let br = EpelMinor 10 (read n)-                                                 in Right br-    ('e':'p':'e':'l':n@(_:_)) | all isDigit n -> let br = EPEL (read n)-                                                 in Right br+    -- disallow "epel9.4" etc+    ('e':'p':'e':'l':d:'.':_) | isDigit d -> error' $ "unknown release:" +-+ rel+    -- disallow "epel10." etc+    ['e','p','e','l',d,d','.'] | all isDigit [d,d'] -> error' $ "bad release:" +-+ rel+    ('e':'p':'e':'l':'1':d:'.':n@(_:_)) | all isDigit (d:n) ->+                                            Right $+                                            EpelMinor (read ['1',d]) $ read n+    ('e':'p':'e':'l':n@(_:_)) | all isDigit n -> Right $ EPEL $ read n+    ('c':'e':'n':'t':'o':'s':n@(_:_)) | all isDigit n ->+                                          Right $ OldCentos $ read n     ('c':n@(_:_)) ->       let ver =             case unsnoc n of-              Just (v,'s') -> v+              Just (v,'s') | all isDigit v ->+                if read v < (8 :: Natural)+                then error' $ "centos-stream" +-+ v +-+ "does not exist"+                else v               _ -> n       in if null ver          then Left rel          else            if all isDigit ver-           then Right (Centos $ read ver)+           then+             let v = read ver+             in Right $ (if v < 8 then OldCentos else Centos) v            else Left rel     "eln" -> Right ELN     ('f':n@(_:_)) | all isDigit n -> let r = read n in Right (Fedora r)@@ -65,7 +82,7 @@                let r = read ns in                  Right $                  case compare r elnVersion of-                   LT -> Centos r+                   LT -> (if r >= 8 then Centos else OldCentos) r                    EQ -> ELN                    GT -> Fedora r     _ -> Left rel@@ -78,4 +95,5 @@   show EPEL9Next = "epel9" ++ "-next"   show ELN = "eln"   show (Centos n) = 'c' : show n ++ "s"+  show (OldCentos n) = 'c' : show n   show System = "system"
test/tests.hs view
@@ -32,8 +32,17 @@   ,([current], Nothing)   ,([previous], Nothing)   ,(["eln"], Nothing)+  ,(["epel10"], Nothing)   ,(["epel9"], Nothing)+  ,(["epel8"], Nothing)+  ,(["epel7"], Nothing)+  ,(["epel6"], Nothing)   ,(["c10s"], Nothing)+  ,(["c9s"], Nothing)+  ,(["c8s"], Nothing)+  ,(["centos8"], Nothing)+  ,(["centos7"], Nothing)+  ,(["centos6"], Nothing)   ,(["--cf", current], Nothing)   ,(["-K", "epel10"], Nothing)   ,(["-T", "rawhide"], Just "coreutils")@@ -43,11 +52,18 @@   ,([prevprev], Just "fontconfig")   ,(["-t", previous], Just "podman")   ,(["eln"], Just "ibus")+  ,(["epel6"], Just "ghc")+  ,(["epel7"], Just "ghc")+  ,(["epel8"], Just "ghc")   ,(["epel9"], Just "ghc")   ,(["epel10"], Just "ghc")-  ,(["epel10.0"], Just "ghc-srpm-macros")+  ,(["epel10.2"], Just "ghc-srpm-macros")+  ,(["epel10.1"], Just "ghc-srpm-macros")   ,(["c10"], Just "bash")   ,(["c9"], Just "kernel")+  ,(["c8"], Just "bash")+  ,(["c7"], Just "gcc")+  ,(["c6"], Just "gcc")   ,(["rawhide", "--whatprovides"], Just "perl(Regexp::Pattern::License)")   ]