diff --git a/cabal-install-solver/src/Distribution/Solver/Types/ProjectConfigPath.hs b/cabal-install-solver/src/Distribution/Solver/Types/ProjectConfigPath.hs index 48141df39c3c21dd2878d9f4597b34323715d70d..c57ade0c3e35621380ab26637d77d9d4c623ed2e 100644 --- a/cabal-install-solver/src/Distribution/Solver/Types/ProjectConfigPath.hs +++ b/cabal-install-solver/src/Distribution/Solver/Types/ProjectConfigPath.hs @@ -1,5 +1,4 @@ {-# LANGUAGE DeriveGeneric #-} -{-# LANGUAGE LambdaCase #-} module Distribution.Solver.Types.ProjectConfigPath ( @@ -11,6 +10,7 @@ module Distribution.Solver.Types.ProjectConfigPath -- * Messages , docProjectConfigPath + , docProjectConfigPaths , cyclicalImportMsg , docProjectConfigPathFailReason @@ -56,13 +56,51 @@ instance Structured ProjectConfigPath -- imported by: B.config -- imported by: A.project -- @ --- >>> render . docProjectConfigPath $ ProjectConfigPath $ "D.config" :| ["C.config", "B.config", "A.project" ] +-- >>> render . docProjectConfigPath $ ProjectConfigPath $ "D.config" :| ["C.config", "B.config", "A.project"] -- "D.config\n imported by: C.config\n imported by: B.config\n imported by: A.project" docProjectConfigPath :: ProjectConfigPath -> Doc docProjectConfigPath (ProjectConfigPath (p :| [])) = text p docProjectConfigPath (ProjectConfigPath (p :| ps)) = vcat $ text p : [ text " " <+> text "imported by:" <+> text l | l <- ps ] +-- | Renders the paths as a list without showing which path imports another, +-- like this; +-- @ +-- - cabal.project +-- - project-cabal/constraints.config +-- - project-cabal/ghc-latest.config +-- - project-cabal/ghc-options.config +-- - project-cabal/pkgs.config +-- - project-cabal/pkgs/benchmarks.config +-- - project-cabal/pkgs/buildinfo.config +-- - project-cabal/pkgs/cabal.config +-- - project-cabal/pkgs/install.config +-- - project-cabal/pkgs/integration-tests.config +-- - project-cabal/pkgs/tests.config +-- @ +-- +-- >>> :{ +-- do +-- let ps = +-- [ ProjectConfigPath ("cabal.project" :| []) +-- , ProjectConfigPath ("project-cabal/constraints.config" :| ["cabal.project"]) +-- , ProjectConfigPath ("project-cabal/ghc-latest.config" :| ["cabal.project"]) +-- , ProjectConfigPath ("project-cabal/ghc-options.config" :| ["cabal.project"]) +-- , ProjectConfigPath ("project-cabal/pkgs.config" :| ["cabal.project"]) +-- , ProjectConfigPath ("project-cabal/pkgs/benchmarks.config" :| ["project-cabal/pkgs.config","cabal.project"]) +-- , ProjectConfigPath ("project-cabal/pkgs/buildinfo.config" :| ["project-cabal/pkgs.config","cabal.project"]) +-- , ProjectConfigPath ("project-cabal/pkgs/cabal.config" :| ["project-cabal/pkgs.config","cabal.project"]) +-- , ProjectConfigPath ("project-cabal/pkgs/install.config" :| ["project-cabal/pkgs.config","cabal.project"]) +-- , ProjectConfigPath ("project-cabal/pkgs/integration-tests.config" :| ["project-cabal/pkgs.config","cabal.project"]) +-- , ProjectConfigPath ("project-cabal/pkgs/tests.config" :| ["project-cabal/pkgs.config","cabal.project"]) +-- ] +-- return . render $ docProjectConfigPaths ps +-- :} +-- "- cabal.project\n- project-cabal/constraints.config\n- project-cabal/ghc-latest.config\n- project-cabal/ghc-options.config\n- project-cabal/pkgs.config\n- project-cabal/pkgs/benchmarks.config\n- project-cabal/pkgs/buildinfo.config\n- project-cabal/pkgs/cabal.config\n- project-cabal/pkgs/install.config\n- project-cabal/pkgs/integration-tests.config\n- project-cabal/pkgs/tests.config" +docProjectConfigPaths :: [ProjectConfigPath] -> Doc +docProjectConfigPaths ps = vcat + [ text "-" <+> text p | ProjectConfigPath (p :| _) <- ps ] + -- | A message for a cyclical import, assuming the head of the path is the -- duplicate. cyclicalImportMsg :: ProjectConfigPath -> Doc diff --git a/cabal-install/src/Distribution/Client/ProjectConfig.hs b/cabal-install/src/Distribution/Client/ProjectConfig.hs index 5d04f101c7dfa372dabb092cf73313ba7d1fe7a8..99dde932037b886c65320227a8dc923b461704a8 100644 --- a/cabal-install/src/Distribution/Client/ProjectConfig.hs +++ b/cabal-install/src/Distribution/Client/ProjectConfig.hs @@ -58,7 +58,7 @@ module Distribution.Client.ProjectConfig ) where import Distribution.Client.Compat.Prelude -import Text.PrettyPrint (render) +import Text.PrettyPrint (nest, render, text, vcat) import Prelude () import Distribution.Client.Glob @@ -882,10 +882,10 @@ renderBadPackageLocations (BadPackageLocations provenance bpls) renderErrors f = unlines (map f bpls) renderExplicit = - "When using configuration(s) from " - ++ intercalate ", " (render . docProjectConfigPath <$> mapMaybe getExplicit (Set.toList provenance)) - ++ ", the following errors occurred:\n" - ++ renderErrors renderBadPackageLocation + "When using configuration from:\n" + ++ render (nest 2 . docProjectConfigPaths $ mapMaybe getExplicit (Set.toList provenance)) + ++ "\nThe following errors occurred:\n" + ++ render (nest 2 $ vcat ((text "-" <+>) . text <$> map renderBadPackageLocation bpls)) getExplicit (Explicit path) = Just path getExplicit Implicit = Nothing diff --git a/cabal-testsuite/PackageTests/ConditionalAndImport/cabal-missing-package.project b/cabal-testsuite/PackageTests/ConditionalAndImport/cabal-missing-package.project new file mode 100644 index 0000000000000000000000000000000000000000..136ebb028a26afd8740e8977713d2dc01a95885f --- /dev/null +++ b/cabal-testsuite/PackageTests/ConditionalAndImport/cabal-missing-package.project @@ -0,0 +1 @@ +import: missing/pkgs.config diff --git a/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.out b/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.out index e14881e8581f8b4d45260e6d6ee3494244c7443f..7a6333d21bcc65d98dba10d2b2f638c8333ee982 100644 --- a/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.out +++ b/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.out @@ -129,3 +129,5 @@ After searching the rest of the dependency tree exhaustively, these were the goa Error: [Cabal-7090] Error parsing project file <ROOT>/bad-conditional.project: Cannot set compiler in a conditional clause of a cabal project file +# checking that missing package message lists configuration provenance +# cabal v2-build diff --git a/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.test.hs b/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.test.hs index 651658c441ad18dec2005dbe82ef0657853e1bdc..f0ba4299c7afb47db73ea2bf424fe402e4a76321 100644 --- a/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.test.hs +++ b/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.test.hs @@ -226,4 +226,15 @@ main = cabalTest . withRepo "repo" . recordMode RecordMarked $ do badIf <- fails $ cabal' "v2-build" [ "--project-file=bad-conditional.project" ] assertOutputContains "Cannot set compiler in a conditional clause of a cabal project file" badIf + log "checking that missing package message lists configuration provenance" + missing <- fails $ cabal' "v2-build" [ "--project-file=cabal-missing-package.project" ] + assertOutputContains + "When using configuration from: \ + \ - cabal-missing-package.project \ + \ - missing/pkgs.config \ + \ - missing/pkgs/default.config \ + \The following errors occurred: \ + \ - The package location 'pkg-doesnt-exist' does not exist." + missing + return () diff --git a/cabal-testsuite/PackageTests/ConditionalAndImport/missing/pkgs.config b/cabal-testsuite/PackageTests/ConditionalAndImport/missing/pkgs.config new file mode 100644 index 0000000000000000000000000000000000000000..afca189fce60e222c545e5ab7ae323c61fc500b2 --- /dev/null +++ b/cabal-testsuite/PackageTests/ConditionalAndImport/missing/pkgs.config @@ -0,0 +1 @@ +import: pkgs/default.config diff --git a/cabal-testsuite/PackageTests/ConditionalAndImport/missing/pkgs/default.config b/cabal-testsuite/PackageTests/ConditionalAndImport/missing/pkgs/default.config new file mode 100644 index 0000000000000000000000000000000000000000..fbdd530d3ed886174310831f6673d38bf20f7dc7 --- /dev/null +++ b/cabal-testsuite/PackageTests/ConditionalAndImport/missing/pkgs/default.config @@ -0,0 +1 @@ +packages: pkg-doesnt-exist diff --git a/changelog.d/issue-9971 b/changelog.d/issue-9971 new file mode 100644 index 0000000000000000000000000000000000000000..9bfb2e4822f76cd6aeb7b092c27bb2e2426cbb99 --- /dev/null +++ b/changelog.d/issue-9971 @@ -0,0 +1,6 @@ +synopsis: Renders project configuration provenance as a list of canonical paths +packages: cabal-install cabal-install-solver +prs: #9985 +issues: #9971 + +description: Removes interleaved rendering of project imports.