aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Haddock/Options.hs3
-rw-r--r--src/Main.hs39
-rw-r--r--tests/html-tests/README6
-rw-r--r--tests/html-tests/accept.hs30
-rw-r--r--tests/html-tests/runtests.hs49
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