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 +9/−0
- README.md +19/−9
- fedora-repoquery.cabal +2/−1
- src/Arch.hs +2/−1
- src/BodhiRelease.hs +65/−15
- src/Main.hs +20/−14
- src/Release.hs +134/−77
- src/Types.hs +32/−14
- test/tests.hs +17/−1
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)") ]