module Cmd.Local ( commandCmd, installCmd, installDepsCmd, localCmd, nvrCmd, prepCmd, sortCmd, RpmWith(..), srpmCmd ) where import Distribution.RPM.Build.Order (dependencySortRpmOpts) import qualified System.Process as P import System.Environment import Branches import Common import Common.System import Git import Package -- FIXME package countdown -- FIXME --ignore-uninstalled subpackages installCmd :: Maybe ForceShort -> Bool -> [String] -> IO () installCmd mforceshort reinstall = withPackageByBranches Nothing Nothing Nothing ExactlyOne installPkg where installPkg :: Package -> AnyBranch -> IO () installPkg pkg br = do spec <- localBranchSpecFile pkg br rpms <- builtRpms br spec -- removing arch let packages = map takeNVRName rpms installed <- filterM pkgInstalled packages if isJust mforceshort || null installed || reinstall then doInstallPkg spec rpms installed else putStrLn $ unwords installed ++ " already installed!\n" where doInstallPkg spec rpms installed = do putStrLn $ takeBaseName (head rpms) ++ "\n" buildRPMs True mforceshort rpms br spec putStrLn "" unless (mforceshort == Just ShortCircuit) $ if reinstall then do let reinstalls = filter (\ f -> takeNVRName f `elem` installed) rpms unless (null reinstalls) $ sudo_ "/usr/bin/dnf" $ "reinstall" : "-q" : "-y" : reinstalls let remaining = filterDebug $ rpms \\ reinstalls unless (null remaining) $ sudo_ "/usr/bin/dnf" $ "install" : "-q" : "-y" : remaining else sudo_ "/usr/bin/dnf" $ "install" : "-q" : "-y" : filterDebug rpms filterDebug = filter (\p -> not (any (`isInfixOf` p) ["-debuginfo-", "-debugsource-"])) localCmd :: Maybe ForceShort -> [String] -> IO () localCmd mforceshort = withPackageByBranches Nothing Nothing Nothing ZeroOrOne localBuildPkg where localBuildPkg :: Package -> AnyBranch -> IO () localBuildPkg pkg br = do spec <- localBranchSpecFile pkg br rpms <- builtRpms br spec buildRPMs False mforceshort rpms br spec -- FIXME single branch installDepsCmd :: [String] -> IO () installDepsCmd = withPackageByBranches Nothing Nothing Nothing ZeroOrOne installDepsPkg where installDepsPkg :: Package -> AnyBranch -> IO () installDepsPkg pkg br = localBranchSpecFile pkg br >>= installDeps -- FIXME single branch srpmCmd :: [String] -> IO () srpmCmd = withPackageByBranches Nothing Nothing Nothing ZeroOrOne srpmBuildPkg where srpmBuildPkg :: Package -> AnyBranch -> IO () srpmBuildPkg pkg br = do spec <- localBranchSpecFile pkg br void $ generateSrpm (Just br) spec data RpmWith = RpmWith String | RpmWithout String sortCmd :: Maybe RpmWith -> [String] -> IO () sortCmd _ [] = return () sortCmd mrpmwith args = do (brs,pkgs) <- splitBranchesPkgs False Nothing args withPackageByBranches' Nothing Nothing Nothing ExactlyOne dummy (brs,pkgs) let rpmopts = maybe [] toRpmOption mrpmwith packages <- dependencySortRpmOpts rpmopts $ reverse pkgs putStrLn $ unwords packages where dummy _ br = gitSwitchBranch br toRpmOption :: RpmWith -> [String] toRpmOption (RpmWith opt) = ["--with=" ++ opt] toRpmOption (RpmWithout opt) = ["--without=" ++ opt] prepCmd :: [String] -> IO () prepCmd = withPackageByBranches Nothing Nothing Nothing ZeroOrOne prepPackage nvrCmd :: Maybe BranchOpts -> [String] -> IO () nvrCmd mbrnchopts = withPackageByBranches Nothing Nothing mbrnchopts AnyNumber nvrBranch where nvrBranch :: Package -> AnyBranch -> IO () nvrBranch pkg br = do spec <- localBranchSpecFile pkg br case br of RelBranch rbr -> pkgNameVerRel' rbr spec OtherBranch _obr -> do sbr <- systemBranch pkgNameVerRel' sbr spec >>= putStrLn commandCmd :: String -> Maybe BranchOpts -> [String] -> IO () commandCmd cs mbrnchopts = withPackageByBranches (Just True) Nothing mbrnchopts AnyNumber cmdBranch where cmdBranch :: Package -> AnyBranch -> IO () cmdBranch pkg _br = do curEnv <- getEnvironment let p = (P.shell cs) { P.env = Just (("p",unPackage pkg):curEnv) } (_,_,_,h) <- P.createProcess p void $ P.waitForProcess h