1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
{-# LANGUAGE DeriveDataTypeable, RecordWildCards #-}
{-# OPTIONS_GHC -fno-warn-missing-fields -fno-cse #-}
module Action.CmdLine(
CmdLine(..), Language(..), getCmdLine,
defaultGenerate,
whenLoud, whenNormal
) where
import System.Console.CmdArgs
import System.Directory
import System.Environment
import System.FilePath
import Data.List.Extra
import Data.Version
import Paths_hoogle(version)
data Language = Haskell | Frege deriving (Data,Typeable,Show,Eq,Enum,Bounded)
data CmdLine
= Search
{color :: Maybe Bool
,link :: Bool
,numbers :: Bool
,info :: Bool
,database :: FilePath
,count :: Int
,query :: [String]
,repeat_ :: Int
,language :: Language
,compare_ :: [String]
}
| Generate
{download :: Maybe Bool
,database :: FilePath
,insecure :: Bool
,include :: [String]
,local_ :: [Maybe FilePath]
,debug :: Bool
,language :: Language
}
| Server
{port :: Int
,database :: FilePath
,cdn :: String
,logs :: FilePath
,local :: Bool
,language :: Language
,scope :: String
,host :: String
,https :: Bool
,cert :: FilePath
,key :: FilePath
}
| Replay
{logs :: FilePath
,database :: FilePath
,repeat_ :: Int
,language :: Language
,scope :: String
}
| Test
{deep :: Bool
,database :: FilePath
,language :: Language
}
deriving (Data,Typeable,Show)
getCmdLine :: [String] -> IO CmdLine
getCmdLine args = do
args <- withArgs args $ cmdArgsRun cmdLineMode
-- fill in the default database
-- If a database has not been given, and the default does not exist,
-- and this is not a generate command, fallback to the Debian database.
args <- if database args /= "" then return args else do
dir <- getAppUserDataDirectory "hoogle"
let db = dir </> "default-" ++ lower (show $ language args) ++ "- " ++ showVersion version ++ ".hoo"
debdb = "/var/lib/hoogle/databases/default.hoo"
db_exists <- doesFileExist db
case args of
Generate{..} -> return $ args{database=db}
_ | db_exists -> return $ args{database=db}
_ -> return $ args{database=debdb}
-- fix up people using Hoogle 4 instructions
args <- case args of
Generate{..} | "all" `elem` include -> do
putStrLn "Warning: 'all' argument is no longer required, and has been ignored."
return $ args{include = delete "all" include}
_ -> return args
return args
defaultGenerate :: CmdLine
defaultGenerate = generate{language=Haskell}
cmdLineMode = cmdArgsMode $ modes [search_ &= auto,generate,server,replay,test]
&= verbosity &= program "hoogle"
&= summary ("Hoogle " ++ showVersion version ++ ", http://hoogle.haskell.org/")
search_ = Search
{color = def &= name "colour" &= help "Use colored output (requires ANSI terminal)"
,link = def &= help "Give URL's for each result"
,numbers = def &= help "Give counter for each result"
,info = def &= help "Give extended information about the first result"
,database = def &= typFile &= help "Name of database to use (use .hoo extension)"
,count = 10 &= name "n" &= help "Maximum number of results to return"
,query = def &= args &= typ "QUERY"
,repeat_ = 1 &= help "Number of times to repeat (for benchmarking)"
,language = enum [x &= explicit &= name (lower $ show x) &= help ("Work with " ++ show x) | x <- [minBound..maxBound]] &= groupname "Language"
,compare_ = def &= help "Type signatures to compare against"
} &= help "Perform a search"
generate = Generate
{download = def &= help "Download all files from the web"
,insecure = def &= help "Allow insecure HTTPS connections"
,include = def &= args &= typ "PACKAGE"
,local_ = def &= opt "" &= help "Index local packages"
,debug = def &= help "Generate debug information"
} &= help "Generate Hoogle databases"
server = Server
{port = 80 &= typ "INT" &= help "Port number"
,cdn = "" &= typ "URL" &= help "URL prefix to use"
,logs = "" &= opt "log.txt" &= typFile &= help "File to log requests to (defaults to stdout)"
,local = False &= help "Allow following file:// links, restricts to 127.0.0.1 Set --host explicitely (including to '*' for any host) to override the localhost-only behaviour"
,scope = def &= help "Default scope to start with"
,host = "" &= help "Set the host to bind on (e.g., an ip address; '!4' for ipv4-only; '!6' for ipv6-only; default: '*' for any host)."
,https = def &= help "Start an https server (use --cert and --key to specify paths to the .pem files)"
,cert = "cert.pem" &= typFile &= help "Path to the certificate pem file (when running an https server)"
,key = "key.pem" &= typFile &= help "Path to the key pem file (when running an https server)"
} &= help "Start a Hoogle server"
replay = Replay
{logs = "log.txt" &= args &= typ "FILE"
} &= help "Replay a log file"
test = Test
{deep = False &= help "Run extra long tests"
} &= help "Run the test suite"
|