From 81058e674b2edd2a09d860ede0b9686784c5546b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 10 Oct 2025 08:48:49 +0000 Subject: [PATCH 1/5] Initial plan From 73a11430432e1ed1c892ba3130a532567e627e65 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 10 Oct 2025 08:57:50 +0000 Subject: [PATCH 2/5] Filter private internal libraries from package rendering Co-authored-by: nikita-volkov <1560937+nikita-volkov@users.noreply.github.com> --- src/Distribution/Server/Packages/Render.hs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Distribution/Server/Packages/Render.hs b/src/Distribution/Server/Packages/Render.hs index f57f81a1..067ab266 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 From 6d375402459660769a798dce43b718cd21ffc136 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 10 Oct 2025 09:13:22 +0000 Subject: [PATCH 3/5] Also filter private libraries from dependency listing Co-authored-by: nikita-volkov <1560937+nikita-volkov@users.noreply.github.com> --- src/Distribution/Server/Packages/Render.hs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Distribution/Server/Packages/Render.hs b/src/Distribution/Server/Packages/Render.hs index 067ab266..d50e74e3 100644 --- a/src/Distribution/Server/Packages/Render.hs +++ b/src/Distribution/Server/Packages/Render.hs @@ -194,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 From 762ecadd7103cc113e13bcacd3bb5ba59642cf76 Mon Sep 17 00:00:00 2001 From: Nikita Volkov Date: Sun, 12 Oct 2025 11:45:26 +0300 Subject: [PATCH 4/5] Address the conditional case visibility can be a part of CondTree, e. g., ```haskell library foo-internal if flag(foo) visibility: public else visibility: private ``` See https://github.com/haskell/hackage-server/pull/1437#discussion_r2421962253 --- src/Distribution/Server/Packages/Render.hs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Distribution/Server/Packages/Render.hs b/src/Distribution/Server/Packages/Render.hs index d50e74e3..4718d936 100644 --- a/src/Distribution/Server/Packages/Render.hs +++ b/src/Distribution/Server/Packages/Render.hs @@ -199,10 +199,13 @@ allCondLibs desc = filter (isPublicCondLib . snd) $ ++ (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 + -- We need to check all branches since visibility can be conditional + isPublicCondLib :: CondTree ConfVar [Dependency] Library -> Bool + isPublicCondLib (CondNode lib _ branches) = + let rootIsPublic = libName lib == LMainLibName || libVisibility lib == LibraryVisibilityPublic + branchIsPublic (CondBranch _ thenTree elseTree) = + isPublicCondLib thenTree || maybe False isPublicCondLib elseTree + in rootIsPublic || any branchIsPublic branches type DependencyTree = CondTree ConfVar [Dependency] IsBuildable From d9720b54b4f51e0a4b9d9c39fdfb9b0c82160c63 Mon Sep 17 00:00:00 2001 From: Nikita Volkov Date: Sun, 12 Oct 2025 13:37:57 +0300 Subject: [PATCH 5/5] Remove redundant checks --- src/Distribution/Server/Packages/Render.hs | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/Distribution/Server/Packages/Render.hs b/src/Distribution/Server/Packages/Render.hs index 4718d936..b14cd286 100644 --- a/src/Distribution/Server/Packages/Render.hs +++ b/src/Distribution/Server/Packages/Render.hs @@ -159,8 +159,7 @@ doPackageRender users info = PackageRender 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 + isPublicLibrary lib = libVisibility lib == LibraryVisibilityPublic moduleHasDocs :: Maybe TarIndex -> ModuleName -> Bool moduleHasDocs Nothing = const False @@ -194,18 +193,8 @@ doPackageRender users info = PackageRender renderComponentName name@(CNotLibName _) = componentNameRaw name allCondLibs :: GenericPackageDescription -> [(LibraryName, CondTree ConfVar [Dependency] Library)] -allCondLibs desc = filter (isPublicCondLib . snd) $ - maybeToList ((LMainLibName,) <$> condLibrary desc) +allCondLibs desc = maybeToList ((LMainLibName,) <$> condLibrary desc) ++ (first LSubLibName <$> condSubLibraries desc) - where - -- Check if a conditional library tree contains a public library - -- We need to check all branches since visibility can be conditional - isPublicCondLib :: CondTree ConfVar [Dependency] Library -> Bool - isPublicCondLib (CondNode lib _ branches) = - let rootIsPublic = libName lib == LMainLibName || libVisibility lib == LibraryVisibilityPublic - branchIsPublic (CondBranch _ thenTree elseTree) = - isPublicCondLib thenTree || maybe False isPublicCondLib elseTree - in rootIsPublic || any branchIsPublic branches type DependencyTree = CondTree ConfVar [Dependency] IsBuildable