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 +8/−2
- README.md +39/−37
- fedora-repoquery.cabal +4/−1
- src/BodhiRelease.hs +46/−46
- src/List.hs +5/−5
- src/Main.hs +20/−20
- src/Query.hs +20/−14
- src/Release.hs +26/−12
- src/Types.hs +42/−3
- test/tests.hs +3/−1
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)