packages feed

CabalSearch-0.0.1: Main.hs

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"]