Skip to content

Commit

Permalink
Haddock errors are no longer fatal, but prevent common ones anyway
Browse files Browse the repository at this point in the history
Haddock errors aren't fatal any more, but Cabal now knows not to invoke Haddock when there is no input for it to process.
  • Loading branch information
typedrat committed Jul 27, 2018
1 parent 39a9fb6 commit 338c358
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 19 deletions.
4 changes: 4 additions & 0 deletions Cabal/ChangeLog.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
# 2.4.0.0 (current development version)
* `Distribution.Simple.Haddock` now checks to ensure that it
does not erroneously call Haddock with no target modules.
([#5232](https://github.com/haskell/cabal/issues/5232),
[#5459](https://github.com/haskell/cabal/issues/5459)).
* Add more Lens combinators (`to`, `traversed`, `filtered`,
`non`) and an optic to access the modules in a component
of a `PackageDescription` by the `ComponentName`.
Expand Down
22 changes: 13 additions & 9 deletions Cabal/Distribution/Simple/Haddock.hs
Original file line number Diff line number Diff line change
Expand Up @@ -525,15 +525,19 @@ runHaddock :: Verbosity
-> ConfiguredProgram
-> HaddockArgs
-> IO ()
runHaddock verbosity tmpFileOpts comp platform haddockProg args = do
let haddockVersion = fromMaybe (error "unable to determine haddock version")
(programVersion haddockProg)
renderArgs verbosity tmpFileOpts haddockVersion comp platform args $
\(flags,result)-> do

runProgram verbosity haddockProg flags

notice verbosity $ "Documentation created: " ++ result
runHaddock verbosity tmpFileOpts comp platform haddockProg args
| null (argTargets args) = warn verbosity $
"Haddocks are being requested, but there aren't any modules given "
++ "to create documentation for."
| otherwise = do
let haddockVersion = fromMaybe (error "unable to determine haddock version")
(programVersion haddockProg)
renderArgs verbosity tmpFileOpts haddockVersion comp platform args $
\(flags,result)-> do

runProgram verbosity haddockProg flags

notice verbosity $ "Documentation created: " ++ result


renderArgs :: Verbosity
Expand Down
6 changes: 3 additions & 3 deletions Cabal/Distribution/Types/PackageDescription/Lens.hs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import Distribution.Types.Executable (Executable, exeModules)
import Distribution.Types.Executable.Lens (exeName)
import Distribution.Types.ForeignLib (ForeignLib, foreignLibModules)
import Distribution.Types.ForeignLib.Lens (foreignLibName)
import Distribution.Types.Library (Library, allLibModules)
import Distribution.Types.Library (Library, explicitLibModules)
import Distribution.Types.Library.Lens (libName)
import Distribution.Types.PackageDescription (PackageDescription)
import Distribution.Types.PackageId (PackageIdentifier)
Expand Down Expand Up @@ -156,9 +156,9 @@ extraDocFiles f s = fmap (\x -> s { T.extraDocFiles = x }) (f (T.extraDocFiles s

componentModules :: ComponentName -> AGetter PackageDescription [ModuleName]
componentModules cname = case cname of
CLibName -> library . traversed . to allLibModules
CLibName -> library . traversed . to explicitLibModules
CSubLibName name ->
componentModules' name subLibraries (libName . non "") allLibModules
componentModules' name subLibraries (libName . non "") explicitLibModules
CFLibName name ->
componentModules' name foreignLibs foreignLibName foreignLibModules
CExeName name ->
Expand Down
22 changes: 18 additions & 4 deletions cabal-install/Distribution/Client/ProjectBuilding.hs
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,15 @@ import Distribution.Client.SourceFiles
import Distribution.Client.SrcDist (allPackageSourceFiles)
import Distribution.Client.Utils (removeExistingFile)

import Distribution.Compat.Lens
import Distribution.Package hiding (InstalledPackageId, installedPackageId)
import qualified Distribution.PackageDescription as PD
import Distribution.InstalledPackageInfo (InstalledPackageInfo)
import qualified Distribution.InstalledPackageInfo as Installed
import Distribution.Simple.BuildPaths (haddockDirName)
import qualified Distribution.Simple.InstallDirs as InstallDirs
import Distribution.Types.BuildType
import Distribution.Types.PackageDescription.Lens (componentModules)
import Distribution.Simple.Program
import qualified Distribution.Simple.Setup as Cabal
import Distribution.Simple.Command (CommandUI)
Expand Down Expand Up @@ -1049,8 +1051,8 @@ buildAndInstallUnpackedPackage verbosity
isParallelBuild = buildSettingNumJobs >= 2

whenHaddock action
| elabBuildHaddocks pkg = action
| otherwise = return ()
| hasValidHaddockTargets pkg = action
| otherwise = return ()

configureCommand = Cabal.configureCommand defaultProgramDb
configureFlags v = flip filterConfigureFlags v $
Expand Down Expand Up @@ -1115,6 +1117,18 @@ buildAndInstallUnpackedPackage verbosity
Just logFile -> withFile logFile AppendMode (action . Just)


hasValidHaddockTargets :: ElaboratedConfiguredPackage -> Bool
hasValidHaddockTargets pkg
| not (elabBuildHaddocks pkg) = False
| otherwise = any componentHasHaddocks components
where
components = elabHaddockTargets pkg
pd = elabPkgDescription pkg

componentHasHaddocks (ComponentTarget name _) =
not (null (pd ^. componentModules name))


buildInplaceUnpackedPackage :: Verbosity
-> DistDirLayout
-> BuildTimeSettings -> Lock -> Lock
Expand Down Expand Up @@ -1285,8 +1299,8 @@ buildInplaceUnpackedPackage verbosity
| otherwise = action

whenHaddock action
| elabBuildHaddocks pkg = action
| otherwise = return ()
| hasValidHaddockTargets pkg = action
| otherwise = return ()

whenReRegister action
= case buildStatus of
Expand Down
14 changes: 11 additions & 3 deletions cabal-install/Distribution/Client/ProjectOrchestration.hs
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,7 @@ import Distribution.Simple.Command (commandShowOptions)
import Distribution.Simple.Configure (computeEffectiveProfiling)

import Distribution.Simple.Utils
( die'
, notice, noticeNoWrap, debugNoWrap )
( die', warn, notice, noticeNoWrap, debugNoWrap )
import Distribution.Verbosity
import Distribution.Text
import Distribution.Simple.Compiler
Expand Down Expand Up @@ -940,7 +939,7 @@ dieOnBuildFailures verbosity plan buildOutcomes

-- For all failures, print either a short summary (if we showed the
-- build log) or all details
die' verbosity $ unlines
dieIfNotHaddockFailure verbosity $ unlines
[ case failureClassification of
ShowBuildSummaryAndLog reason _
| verbosity > normal
Expand Down Expand Up @@ -969,6 +968,15 @@ dieOnBuildFailures verbosity plan buildOutcomes
maybeToList (InstallPlan.lookup plan pkgid)
]

dieIfNotHaddockFailure
| all isHaddockFailure failuresClassification = warn
| otherwise = die'
where
isHaddockFailure (_, ShowBuildSummaryOnly (HaddocksFailed _) ) = True
isHaddockFailure (_, ShowBuildSummaryAndLog (HaddocksFailed _) _) = True
isHaddockFailure _ = False


classifyBuildFailure :: BuildFailure -> BuildFailurePresentation
classifyBuildFailure BuildFailure {
buildFailureReason = reason,
Expand Down
3 changes: 3 additions & 0 deletions cabal-install/changelog
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
-*-change-log-*-

2.4.0.0 (current development version)
* 'new-build' now treats Haddock errors non-fatally. In addition,
it attempts to avoid trying to generate Haddocks when there is
nothing to generate them from. (#5232, #5459)
* 'new-run', 'new-test', and 'new-bench' now will attempt to resolve
ambiguous selectors by filtering out selectors that would be invalid.
(#4679, #5461)
Expand Down

0 comments on commit 338c358

Please sign in to comment.