module Main where import Control.Monad import System.Directory import System.Environment import System.Exit import System.FilePath (()) import System.Posix.User (getUserEntryForName, getEffectiveUserName, UserEntry(..)) import Data.List import CabalIndex ensureIndex :: FilePath -> String -> Bool -> IO () ensureIndex dir name force = do -- Check directory dirExists <- doesDirectoryExist dir unless dirExists $ do putStrLn $ "Creating: " ++ dir createDirectory dir -- Check db file dbExists <- doesFileExist name when (force || not dbExists) $ do putStrLn $ "Building database: " ++ name buildDatabase dir name main :: IO () main = do args <- getArgs homeDir <- homeDirectory `fmap` (getUserEntryForName =<< getEffectiveUserName) let dbDir = homeDir ".cabalsearch" dbPath = dbDir "packages.sqlite3" arg = head args -- show info when (length args /= 1 || "--help" `elem` args) $ do name <- getProgName putStrLn $ "usage: " ++ name ++ " searchTerm" putStrLn $ " or: " ++ name ++ " --rebuild" exitFailure -- work go (arg `isPrefixOf` "--rebuild") arg dbDir dbPath where go rebuild term dbDir dbPath = do -- rebuild index when rebuild $ do ensureIndex dbDir dbPath True exitSuccess -- run query ensureIndex dbDir dbPath False res <- queryPackages (dbDir dbPath) term forM_ res $ \(name, meta) -> putStrLn $ concat ["* ", name, "\n", meta, "\n"]