{-# LANGUAGE OverloadedStrings #-} module Query ( repoqueryCmd, ) where import Control.Monad.Extra import qualified Data.List.Extra as L import Data.Maybe (isJust, fromMaybe) import SimpleCmd (cmdLines) import System.Directory (doesFileExist, findExecutable) import System.FilePath (takeBaseName) import Arch import Common (warning) import ShowRelease (showRelease) import Types import URL (URL, renderUrl) -- FIXME --no-redirect? -- FIXME error if no testing repo repoqueryCmd :: Bool -> Bool -> Verbosity -> Release -> RepoSource -> Arch -> [Arch] -> Bool -> [String] -> IO () repoqueryCmd dnf4 debug verbose release reposource sysarch archs testing args = do forM_ (if null archs then [sysarch] else archs) $ \arch -> do repoConfigs <- showRelease debug verbose True reposource release sysarch (Just arch) testing let qfAllowed = not $ any (`elem` ["-i","--info","-l","--list","-s","--source","--nvr","--nevra","--envra","-qf","--queryformat", "--changelog", "--provides", "--requires"]) args -- dnf5 writes repo update output to stdout -- https://github.com/rpm-software-management/dnf5/issues/1361 -- but seems to cache better mdnf5 <- if dnf4 then return Nothing else findExecutable "dnf5" let queryformat = "%{name}-%{version}-%{release}.%{arch} (%{repoid})" ++ if isJust mdnf5 then "\n" else "" -- LANG=C.utf8 rhsm <- doesFileExist "/etc/dnf/plugins/subscription-manager.conf" let cmdargs = "repoquery" : ["--quiet" | verbose /= Verbose] ++ -- https://bugzilla.redhat.com/show_bug.cgi?id=1876828 ["--disableplugin=subscription-manager" | rhsm] ++ (if qfAllowed then ["--qf", queryformat] else []) ++ -- drop modules for F39+ ["--setopt=module_platform_id=platform:" ++ show release] ++ concatMap renderRepoConfig repoConfigs ++ 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 (verbose == Quiet) $ warning "" putStrLn $ L.intercalate "\n" res renderRepoConfig :: (String, URL) -> [String] renderRepoConfig (name, url) = ["--repofrompath=" ++ name ++ "," ++ renderUrl url, "--repo=" ++ name, "--setopt=" ++ name ++ ".metadata_expire=6h" ]