diff options
-rw-r--r-- | src/Haddock/Options.hs | 3 | ||||
-rw-r--r-- | src/Main.hs | 39 | ||||
-rw-r--r-- | tests/html-tests/README | 6 | ||||
-rw-r--r-- | tests/html-tests/accept.hs | 30 | ||||
-rw-r--r-- | tests/html-tests/runtests.hs | 49 |
5 files changed, 86 insertions, 41 deletions
diff --git a/src/Haddock/Options.hs b/src/Haddock/Options.hs index 8cb70d00..7323a806 100644 --- a/src/Haddock/Options.hs +++ b/src/Haddock/Options.hs @@ -71,6 +71,7 @@ data Flag | Flag_OptGhc String | Flag_GhcLibDir String | Flag_GhcVersion + | Flag_PrintGhcPath | Flag_PrintGhcLibDir | Flag_NoWarnings | Flag_UseUnicode @@ -147,6 +148,8 @@ options backwardsCompat = "option to be forwarded to GHC", Option [] ["ghc-version"] (NoArg Flag_GhcVersion) "output GHC version in numeric format", + Option [] ["print-ghc-path"] (NoArg Flag_PrintGhcPath) + "output path to GHC binary", Option [] ["print-ghc-libdir"] (NoArg Flag_PrintGhcLibDir) "output GHC lib dir", Option ['w'] ["no-warnings"] (NoArg Flag_NoWarnings) "turn off all warnings", diff --git a/src/Main.hs b/src/Main.hs index ba48a709..cc5d1302 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -50,7 +50,7 @@ import Data.Int #ifdef IN_GHC_TREE import System.FilePath #else -import GHC.Paths +import qualified GHC.Paths as GhcPaths import Paths_haddock #endif @@ -155,7 +155,7 @@ main = handleTopExceptions $ do readPackagesAndProcessModules :: [Flag] -> [String] -> IO ([(DocPaths, InterfaceFile)], [Interface], LinkEnv) readPackagesAndProcessModules flags files = do - libDir <- getGhcLibDir flags + libDir <- fmap snd (getGhcDirs flags) -- Catches all GHC source errors, then prints and re-throws them. let handleSrcErrors action' = flip handleSourceError action' $ \err -> do @@ -329,23 +329,24 @@ getHaddockLibDir flags = case [str | Flag_Lib str <- flags] of [] -> #ifdef IN_GHC_TREE - getInTreeLibDir + fmap snd getInTreeDirs #else getDataDir -- provided by Cabal #endif fs -> return (last fs) -getGhcLibDir :: [Flag] -> IO String -getGhcLibDir flags = - case [ dir | Flag_GhcLibDir dir <- flags ] of - [] -> +getGhcDirs :: [Flag] -> IO (String, String) +getGhcDirs flags = do + (ghcPath, libDir) <- #ifdef IN_GHC_TREE - getInTreeLibDir + getInTreeDirs #else - return libdir -- from GHC.Paths + return (GhcPaths.ghc, GhcPaths.libdir) #endif - xs -> return $ last xs + case [ dir | Flag_GhcLibDir dir <- flags ] of + [] -> return (ghcPath, libDir) + xs -> return (ghcPath, last xs) shortcutFlags :: [Flag] -> IO () @@ -356,8 +357,12 @@ shortcutFlags flags = do when (Flag_Version `elem` flags) byeVersion when (Flag_GhcVersion `elem` flags) byeGhcVersion + when (Flag_PrintGhcPath `elem` flags) $ do + dir <- fmap fst (getGhcDirs flags) + bye $ dir ++ "\n" + when (Flag_PrintGhcLibDir `elem` flags) $ do - dir <- getGhcLibDir flags + dir <- fmap snd (getGhcDirs flags) bye $ dir ++ "\n" when (Flag_UseUnicode `elem` flags && Flag_Html `notElem` flags) $ @@ -404,16 +409,12 @@ getPrologue flags = #ifdef IN_GHC_TREE -getInTreeLibDir :: IO String -getInTreeLibDir = do +getInTreeDirs :: IO (String, String) +getInTreeDirs = do m <- getExecDir case m of - Nothing -> error "No GhcLibDir found" -#ifdef NEW_GHC_LAYOUT - Just d -> return (d </> ".." </> "lib") -#else - Just d -> return (d </> "..") -#endif + Nothing -> error "No GhcDir found" + Just d -> let p = d </> ".." in return (p </> "bin" </> "ghc", p </> "lib") getExecDir :: IO (Maybe String) diff --git a/tests/html-tests/README b/tests/html-tests/README index 644d0a71..9afb10e7 100644 --- a/tests/html-tests/README +++ b/tests/html-tests/README @@ -9,12 +9,12 @@ To add a new test: passes since there is no reference file to compare with. 3) To make a reference file from the output file, do - runhaskell copy.hs <modulename> + runhaskell accept.hs <modulename> Tips and tricks: -To copy all output files into reference files, run - runhaskell copy.hs +To "accept" all output files (copy them to reference files), run + runhaskell accept.hs You can run all tests despite failing tests, like so cabal test --test-option=all diff --git a/tests/html-tests/accept.hs b/tests/html-tests/accept.hs new file mode 100644 index 00000000..fa18fe9c --- /dev/null +++ b/tests/html-tests/accept.hs @@ -0,0 +1,30 @@ +import System.Cmd +import System.Environment +import System.FilePath +import System.Exit +import System.Directory +import Data.List +import Control.Monad +import Text.Regex + + +main = do + args <- getArgs + dir <- getCurrentDirectory + contents <- getDirectoryContents (dir </> "output") + if not $ null args + then + mapM copy [ "output" </> file | file <- contents, ".html" `isSuffixOf` file, takeBaseName file `elem` args ] + else + mapM copy [ "output" </> file | file <- contents, ".html" `isSuffixOf` file ] + + +copy file = do + let new = "tests" </> takeFileName file <.> ".ref" + print file + print new + contents <- readFile file + writeFile new (stripLinks contents) + + +stripLinks f = subRegex (mkRegexWithOpts "<A HREF=[^>]*>" False False) f "<A HREF=\"\">" diff --git a/tests/html-tests/runtests.hs b/tests/html-tests/runtests.hs index 2f7ed2e2..48ea5214 100644 --- a/tests/html-tests/runtests.hs +++ b/tests/html-tests/runtests.hs @@ -1,17 +1,22 @@ +import Control.Monad +import Data.List +import Data.Maybe +import Distribution.InstalledPackageInfo +import Distribution.Package +import Distribution.Simple.Compiler +import Distribution.Simple.GHC +import Distribution.Simple.PackageIndex +import Distribution.Simple.Program +import Distribution.Simple.Utils +import Distribution.Verbosity import System.Cmd +import System.Directory import System.Environment -import System.FilePath import System.Exit -import System.Directory +import System.FilePath import System.Process -import Data.List -import Control.Monad import Text.Printf import Text.Regex -import Distribution.Simple.Utils -import Distribution.Simple.Program -import Distribution.Verbosity -import Data.Maybe packageRoot = "." @@ -51,17 +56,23 @@ test = do waitForProcess h2 putStrLn "" - -- TODO: use Distribution.* to get the packages instead - libdir <- rawSystemStdout normal haddockPath ["--print-ghc-libdir"] - let librariesPath = ".."</>".."</>"share"</>"doc"</>"ghc"</>"html"</>"libraries" - - let mkDep name version = - let path = init libdir </> librariesPath </> name ++ "-" ++ version - in "-i " ++ path ++ "," ++ path </> name ++ ".haddock" - - let base = mkDep "base" "4.3.1.0" - process = mkDep "process" "1.0.1.5" - ghcprim = mkDep "ghc-prim" "0.2.0.0" + -- TODO: maybe do something more clever here using haddock.cabal + ghcPath <- fmap init $ rawSystemStdout normal haddockPath ["--print-ghc-path"] + (_, conf) <- configure normal (Just ghcPath) Nothing emptyProgramConfiguration + pkgIndex <- getInstalledPackages normal [GlobalPackageDB] conf + let safeHead xs = case xs of x : _ -> Just x; [] -> Nothing + let mkDep pkgName = + maybe (error "Couldn't find test dependencies") id $ do + let pkgs = lookupPackageName pkgIndex (PackageName pkgName) + (_, pkgs') <- safeHead pkgs + pkg <- safeHead pkgs' + ifacePath <- safeHead (haddockInterfaces pkg) + htmlPath <- safeHead (haddockHTMLs pkg) + return ("-i " ++ htmlPath ++ "," ++ ifacePath) + + let base = mkDep "base" + process = mkDep "process" + ghcprim = mkDep "ghc-prim" putStrLn "Running tests..." handle <- runProcess haddockPath |