packages feed

cabal-rpm-0.9.1: src/Commands/Depends.hs

-- |
-- Module      :  Commands.Depends
-- Copyright   :  (C) 2014 Jens Petersen
--
-- Maintainer  :  Jens Petersen <petersen@fedoraproject.org>
-- Stability   :  alpha
--
-- Explanation: cabal wrapper which yum installs dependencies

-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.

module Commands.Depends (
    depends,
    Depends (..)
    ) where

import Dependencies (dependencies, missingPackages, packageDependencies)
import PackageUtils (PackageData (..), packageName, prepare, stripPkgDevel)
import Setup (quiet)
import SysCmd (cmd, (+-+))

import Control.Applicative ((<$>))
import Control.Monad (filterM)
import Data.List (nub, sort, (\\))
import Distribution.PackageDescription (PackageDescription (..))
import System.Directory	(removeDirectoryRecursive)

data Depends = Depends | Requires | Missing

depends :: PackageData -> Depends -> IO ()
depends pkgdata action = do
  let pkgDesc = packageDesc pkgdata
  case action of
    Depends -> do
      (deps, tools, clibs, pkgcfgs, _) <- dependencies pkgDesc
      let clibs' = map (\ lib -> "lib" ++ lib ++ ".so") clibs
      let pkgcfgs' = map (++ ".pc") pkgcfgs
      mapM_ putStrLn $ deps ++ tools ++ clibs' ++ pkgcfgs'
    Requires -> do
      (deps, tools, clibs, pkgcfgs, _) <- packageDependencies pkgDesc
      mapM_ putStrLn $ sort $ deps ++ tools ++ clibs ++ pkgcfgs
    Missing -> do
      miss <- missingPackages pkgDesc >>= filterM notAvail
      let name = packageName $ package pkgDesc
      putMissing name miss
      final <- recurseMissing miss (map stripPkgDevel miss)
      putStrLn ""
      mapM_ putStrLn $ sort $ map stripPkgDevel final

recurseMissing :: [String] -> [String] -> IO [String]
recurseMissing already [] = return already
recurseMissing already (dep:deps) = do
  miss <- missingDepsPkg dep
  putMissing dep miss
  let accum = nub $ miss ++ already
  deeper <- recurseMissing accum (miss \\ accum)
  let accum2 = nub $ accum ++ deeper
  more <- recurseMissing accum2 (deps \\ accum2)
  return $ nub $ accum2 ++ more

notAvail :: String -> IO Bool
notAvail pkg = null <$> cmd "repoquery" [pkg]

missingDepsPkg :: String -> IO [String]
missingDepsPkg pkg = do
  pkgdata <- prepare (Just pkg) quiet
  maybe (return ()) removeDirectoryRecursive $ workingDir pkgdata
  missingPackages (packageDesc pkgdata) >>= filterM notAvail

putMissing :: String -> [String] -> IO ()
putMissing _ [] = return ()
putMissing pkg deps = putStrLn $ pkg +-+ "misses:" +-+ unwords (map stripPkgDevel deps)