summaryrefslogtreecommitdiff
path: root/utils/hpc/Main.hs
diff options
context:
space:
mode:
Diffstat (limited to 'utils/hpc/Main.hs')
-rw-r--r--utils/hpc/Main.hs217
1 files changed, 0 insertions, 217 deletions
diff --git a/utils/hpc/Main.hs b/utils/hpc/Main.hs
deleted file mode 100644
index f7617ec677..0000000000
--- a/utils/hpc/Main.hs
+++ /dev/null
@@ -1,217 +0,0 @@
-{-# LANGUAGE ScopedTypeVariables, TupleSections #-}
--- (c) 2007 Andy Gill
-
--- Main driver for Hpc
-import Control.Monad (forM, forM_, when)
-import Data.Bifunctor (bimap)
-import Data.List (intercalate, partition, uncons)
-import Data.List.NonEmpty (NonEmpty((:|)))
-import Data.Maybe (catMaybes, isJust)
-import Data.Version
-import System.Environment
-import System.Exit
-import System.Console.GetOpt
-import System.Directory (doesPathExist)
-
-import HpcFlags
-import HpcReport
-import HpcMarkup
-import HpcCombine
-import HpcShowTix
-import HpcDraft
-import HpcOverlay
-import Paths_hpc_bin
-
-helpList :: IO ()
-helpList = do
- putStrLn $
- "Usage: hpc COMMAND ...\n\n" ++
- section "Commands" help ++
- section "Reporting Coverage" reporting ++
- section "Processing Coverage files" processing ++
- section "Coverage Overlays" overlays ++
- section "Others" other ++
- ""
- putStrLn ""
- putStrLn "or: hpc @response_file_1 @response_file_2 ..."
- putStrLn ""
- putStrLn "The contents of a Response File must have this format:"
- putStrLn "COMMAND ..."
- putStrLn ""
- putStrLn "example:"
- putStrLn "report my_library.tix --include=ModuleA \\"
- putStrLn "--include=ModuleB"
- where
- help = ["help"]
- reporting = ["report","markup"]
- overlays = ["overlay","draft"]
- processing = ["sum","combine","map"]
- other = [ name hook
- | hook <- hooks
- , name hook `notElem`
- (concat [help,reporting,processing,overlays])
- ]
-
-section :: String -> [String] -> String
-section _ [] = ""
-section msg cmds = msg ++ ":\n"
- ++ unlines [ take 14 (" " ++ cmd ++ repeat ' ') ++ summary hook
- | cmd <- cmds
- , hook <- hooks
- , name hook == cmd
- ]
-
-dispatch :: [String] -> IO ()
-dispatch [] = do
- helpList
- exitWith ExitSuccess
-dispatch (txt:args0) = do
- case lookup txt hooks' of
- Just plugin -> parse plugin args0
- _ -> case getResponseFileName txt of
- Nothing -> parse help_plugin (txt:args0)
- Just firstResponseFileName -> do
- let
- (responseFileNames', nonResponseFileNames) = partitionFileNames args0
- -- if arguments are combination of Response Files and non-Response Files, exit with error
- when (length nonResponseFileNames > 0) $ do
- let
- putStrLn $ "First argument '" <> txt <> "' is a Response File, " <>
- "followed by non-Response File(s): '" <> intercalate "', '" nonResponseFileNames <> "'"
- putStrLn $ "When first argument is a Response File, " <>
- "all arguments should be Response Files."
- exitFailure
- let
- responseFileNames :: NonEmpty FilePath
- responseFileNames = firstResponseFileName :| responseFileNames'
-
- forM_ responseFileNames $ \responseFileName -> do
- exists <- doesPathExist responseFileName
- when (not exists) $ do
- putStrLn $ "Response File '" <> responseFileName <> "' does not exist"
- exitFailure
-
- -- read all Response Files
- responseFileNamesAndText :: NonEmpty (FilePath, String) <-
- forM responseFileNames $ \responseFileName ->
- fmap (responseFileName, ) (readFile responseFileName)
- forM_ responseFileNamesAndText $ \(responseFileName, responseFileText) ->
- -- parse first word of Response File, which should be a command
- case uncons $ words responseFileText of
- Nothing -> do
- putStrLn $ "Response File '" <> responseFileName <> "' has no command"
- exitFailure
- Just (responseFileCommand, args1) -> case lookup responseFileCommand hooks' of
- -- check command for validity
- -- It is important than a Response File cannot specify another Response File;
- -- this is prevented
- Nothing -> do
- putStrLn $ "Response File '" <> responseFileName <>
- "' command '" <> responseFileCommand <> "' invalid"
- exitFailure
- Just plugin -> do
- putStrLn $ "Response File '" <> responseFileName <> "':"
- parse plugin args1
-
- where
- getResponseFileName :: String -> Maybe FilePath
- getResponseFileName s = do
- (firstChar, filename) <- uncons s
- if firstChar == '@'
- then pure filename
- else Nothing
-
- -- first member of tuple is list of Response File names,
- -- second member of tuple is list of all other arguments
- partitionFileNames :: [String] -> ([FilePath], [String])
- partitionFileNames xs = let
- hasFileName :: [(String, Maybe FilePath)]
- hasFileName = fmap (\x -> (x, getResponseFileName x)) xs
- (fileNames, nonFileNames) :: ([Maybe FilePath], [String]) =
- bimap (fmap snd) (fmap fst) $ partition (isJust . snd) hasFileName
- in (catMaybes fileNames, nonFileNames)
-
- parse plugin args =
- case getOpt Permute (options plugin []) args of
- (_,_,errs) | not (null errs)
- -> do putStrLn "hpc failed:"
- sequence_ [ putStr (" " ++ err)
- | err <- errs
- ]
- putStrLn $ "\n"
- command_usage plugin
- exitFailure
- (o,ns,_) -> do
- let flags = final_flags plugin
- . foldr (.) id o
- $ init_flags plugin
- implementation plugin flags ns
-
-main :: IO ()
-main = do
- args <- getArgs
- dispatch args
-
-------------------------------------------------------------------------------
-
-hooks :: [Plugin]
-hooks = [ help_plugin
- , report_plugin
- , markup_plugin
- , sum_plugin
- , combine_plugin
- , map_plugin
- , showtix_plugin
- , overlay_plugin
- , draft_plugin
- , version_plugin
- ]
-
-hooks' :: [(String, Plugin)]
-hooks' = [ (name hook,hook) | hook <- hooks ]
-
-------------------------------------------------------------------------------
-
-help_plugin :: Plugin
-help_plugin = Plugin { name = "help"
- , usage = "[<HPC_COMMAND>]"
- , summary = "Display help for hpc or a single command"
- , options = help_options
- , implementation = help_main
- , init_flags = default_flags
- , final_flags = default_final_flags
- }
-
-help_main :: Flags -> [String] -> IO ()
-help_main _ [] = do
- helpList
- exitWith ExitSuccess
-help_main _ (sub_txt:_) = do
- case lookup sub_txt hooks' of
- Nothing -> do
- putStrLn $ "no such HPC command: " <> sub_txt
- exitFailure
- Just plugin' -> do
- command_usage plugin'
- exitWith ExitSuccess
-
-help_options :: FlagOptSeq
-help_options = id
-
-------------------------------------------------------------------------------
-
-version_plugin :: Plugin
-version_plugin = Plugin { name = "version"
- , usage = ""
- , summary = "Display version for hpc"
- , options = id
- , implementation = version_main
- , init_flags = default_flags
- , final_flags = default_final_flags
- }
-
-version_main :: Flags -> [String] -> IO ()
-version_main _ _ = putStrLn ("hpc tools, version " ++ showVersion version)
-
-
-------------------------------------------------------------------------------