hark-0.2: src/Drivers/Content.hs
{-----------------------------------------------------------------
(c) 2008-2009 Markus Dittrich
This program is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public
License Version 3 as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License Version 3 for more details.
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
--------------------------------------------------------------------}
-- | this module contains the top level functions for retrieving
-- the contents of a package.
module Drivers.Content ( display_package_contents
, display_binary_package_contents
, display_doc_package_contents
, display_etc_package_contents
, display_include_package_contents
, display_library_package_contents
, display_share_package_contents
, retrieve_package_content
) where
-- imports
import qualified Data.ByteString as B(ByteString, null, putStrLn,
split)
import Prelude
-- local imports
import Helpers.ByteString(binStr, docStr, etcStr, includeStr, libStr,
lib64Str, sbinStr, shareStr, slashW, usrStr)
import Helpers.PrettyPrint(Color(..), putColorBStrLn)
import Parsers.Content(FileType(..), PackageContentItem(..),
retrieve_package_content)
-- | function for displaying the full content of a package
display_package_contents :: FilePath -> IO ()
display_package_contents = display_content_dispatcher (\_ -> True)
-- | function for displaying the binary files installed by a package
display_binary_package_contents :: FilePath -> IO ()
display_binary_package_contents =
display_content_dispatcher is_binary_file
-- | function for displaying the doc files installed by a package
display_doc_package_contents :: FilePath -> IO ()
display_doc_package_contents = display_content_dispatcher is_doc_file
-- | function for displaying the \/etc content of a package
display_etc_package_contents :: FilePath -> IO ()
display_etc_package_contents = display_content_dispatcher is_etc_file
-- | function for displaying the include files installed by a package
display_include_package_contents :: FilePath -> IO ()
display_include_package_contents =
display_content_dispatcher is_include_file
-- | function for displaying the library files installed by a package
display_library_package_contents :: FilePath -> IO ()
display_library_package_contents =
display_content_dispatcher is_library_file
-- | function for displaying the include files installed by a package
display_share_package_contents :: FilePath -> IO ()
display_share_package_contents =
display_content_dispatcher is_share_file
-- | dispatch the content lookup mechanism with the package filter
-- filterFunc provided by the caller
display_content_dispatcher :: (PackageContentItem -> Bool) -> FilePath
-> IO ()
display_content_dispatcher filterFunc targetPkg =
retrieve_package_content targetPkg
>>= print_content . filter filterFunc
-- | print the list of PackageContentItem corresponding
-- to a particular file
print_content :: [PackageContentItem] -> IO ()
print_content [] = return ()
print_content (item:items) =
do
case fileType item of
Dir -> putColorBStrLn Red $ name item
Sym -> putColorBStrLn Cyan $ name item
_ -> B.putStrLn $ name item
print_content items
-- | Filter all binary files out of the complete package content,
-- i.e., everything in \/bin, \/sbin, \/usr\/bin, \/usr\/sbin
-- is shown.
is_binary_file :: PackageContentItem -> Bool
is_binary_file item
| B.null $ name item = False
| otherwise = match_bin $ tail $ B.split slashW
$ name item
where
match_bin :: [B.ByteString] -> Bool
match_bin [] = False
match_bin (x:y:_) = (x == usrStr) &&
((y == binStr) || (y == sbinStr))
match_bin (x:_) = (x == binStr) || (x == sbinStr)
-- | Filter all doc files (i.e. files in \/usr\/share\/doc)
is_doc_file :: PackageContentItem -> Bool
is_doc_file item
| B.null $ name item = False
| otherwise = match_bin $ tail $ B.split slashW
$ name item
where
match_bin :: [B.ByteString] -> Bool
match_bin [] = False
match_bin (x:y:z:_) = (x == usrStr) && (y == shareStr)
&& (z == docStr)
match_bin (_:_) = False
-- | Filter all library files out of the complete package content,
-- i.e., everything in \/lib, \/lib64, \/usr\/lib, \/usr\/lib64
-- is shown.
-- NOTE: This may return more than the actual libs since some
-- packages install a whole host of stuff in /usr/lib. If we
-- really only want libs we could filter out the *.so and such
is_library_file :: PackageContentItem -> Bool
is_library_file item
| B.null $ name item = False
| otherwise = match_bin $ tail $ B.split slashW
$ name item
where
match_bin :: [B.ByteString] -> Bool
match_bin [] = False
match_bin (x:y:_) = (x == usrStr) &&
((y == libStr) || (y == lib64Str))
match_bin (x:_) = (x == libStr) || (x == lib64Str)
-- | Filter all files in \/usr\/include out of the complete
-- package content,
is_include_file :: PackageContentItem -> Bool
is_include_file item
| B.null $ name item = False
| otherwise = match_bin $ tail $ B.split slashW
$ name item
where
match_bin :: [B.ByteString] -> Bool
match_bin [] = False
match_bin (x:y:_) = (x == usrStr) && (y == includeStr)
match_bin _ = False
-- | Filter all files in \/etc out of the complete package content
is_etc_file :: PackageContentItem -> Bool
is_etc_file item
| B.null $ name item = False
| otherwise = match_bin $ tail $ B.split slashW
$ name item
where
match_bin :: [B.ByteString] -> Bool
match_bin [] = False
match_bin (x:_) = (x == etcStr)
-- | Filter all files in \/usr\/share out of the complete package
-- content
is_share_file :: PackageContentItem -> Bool
is_share_file item
| B.null $ name item = False
| otherwise = match_bin $ tail $ B.split slashW
$ name item
where
match_bin :: [B.ByteString] -> Bool
match_bin [] = False
match_bin (x:y:_) = (x == usrStr) && (y == shareStr)
match_bin _ = False