diff --git a/src/Distribution/Server/Packages/Render.hs b/src/Distribution/Server/Packages/Render.hs index f57f81a1..d50e74e3 100644 --- a/src/Distribution/Server/Packages/Render.hs +++ b/src/Distribution/Server/Packages/Render.hs @@ -42,6 +42,7 @@ import Distribution.Types.VersionInterval.Legacy -- I criticized this unfortunate development at length at: -- https://github.com/haskell/cabal/issues/7916 import Distribution.ModuleName as ModuleName +import Distribution.Types.LibraryVisibility (LibraryVisibility(LibraryVisibilityPublic)) -- hackage-server import Distribution.Server.Framework.CacheControl (ETag) @@ -148,7 +149,7 @@ doPackageRender users info = PackageRender else NotBuildable renderModules :: Maybe TarIndex -> [(LibraryName, ModSigIndex)] - renderModules docindex = flip fmap (allLibraries flatDesc) $ \lib -> + renderModules docindex = flip fmap (filter isPublicLibrary $ allLibraries flatDesc) $ \lib -> let mod_ix = mkForest $ exposedModules lib -- Assumes that there is an HTML per reexport ++ map moduleReexportName (reexportedModules lib) @@ -156,6 +157,10 @@ doPackageRender users info = PackageRender sig_ix = mkForest $ signatures lib mkForest = moduleForest . map (\m -> (m, moduleHasDocs docindex m)) in (libName lib, ModSigIndex { modIndex = mod_ix, sigIndex = sig_ix }) + where + -- Only show main library or internal libraries with public visibility + isPublicLibrary lib = libName lib == LMainLibName + || libVisibility lib == LibraryVisibilityPublic moduleHasDocs :: Maybe TarIndex -> ModuleName -> Bool moduleHasDocs Nothing = const False @@ -189,8 +194,15 @@ doPackageRender users info = PackageRender renderComponentName name@(CNotLibName _) = componentNameRaw name allCondLibs :: GenericPackageDescription -> [(LibraryName, CondTree ConfVar [Dependency] Library)] -allCondLibs desc = maybeToList ((LMainLibName,) <$> condLibrary desc) +allCondLibs desc = filter (isPublicCondLib . snd) $ + maybeToList ((LMainLibName,) <$> condLibrary desc) ++ (first LSubLibName <$> condSubLibraries desc) + where + -- Check if a conditional library tree contains a public library + -- We check the root node since visibility is a property of the library itself + isPublicCondLib condTree = + let lib = condTreeData condTree + in libName lib == LMainLibName || libVisibility lib == LibraryVisibilityPublic type DependencyTree = CondTree ConfVar [Dependency] IsBuildable