cabal-install
Safe HaskellNone
LanguageHaskell2010

Distribution.Client.ProjectConfig.Import

Description

Project configuration imports.

Synopsis

Parsing skeleton

type ProjectConfigSkeleton = CondTree ConfVar ([(Maybe URI, ProjectConfigPath)], ProjectConfig) Source #

ProjectConfigSkeleton is a tree of conditional blocks and imports wrapping a config. It can be finalized by providing the conditional resolution info and then resolving and downloading the imports

fetchImport :: (ProjectConfigToParse -> IO a) -> FilePath -> HttpTransport -> Verbosity -> FilePath -> ProjectConfigPath -> IO (Maybe URI, a) Source #

Fetch a local file import or remote URL import and parse it.

Messages

docProjectConfigFiles :: [ProjectConfigPath] -> Doc Source #

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 $ docProjectConfigFiles 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"

The listing puts projects first, URLs last and sorts the other paths lexically, dropping any duplicates, like this:

- cabal.project
- 0.config
- 2.config
- cfg/1.config
- cfg/3.config
- with-ghc.config
- https://www.stackage.org/lts-21.25/cabal.config
>>> let p = ProjectConfigPath $ "cabal.project" :| []
>>> let a = ProjectConfigPath $ "0.config" :| ["cabal.project"]
>>> let b = ProjectConfigPath $ "cfg/1.config" :| ["0.config", "cabal.project"]
>>> let c = ProjectConfigPath $ "with.config" :| ["0.config", "cabal.project"]
>>> let d = ProjectConfigPath $ "2.config" :| ["cfg/1.config", "0.config", "cabal.project"]
>>> let e = ProjectConfigPath $ "cfg/3.config" :| ["2.config", "cfg/1.config", "0.config", "cabal.project"]
>>> let f = ProjectConfigPath $ "https://www.stackage.org/lts-21.25/cabal.config" :| ["2.config", "cfg/1.config", "0.config", "cabal.project"]
>>> let g = ProjectConfigPath $ "https://www.stackage.org/lts-21.25/cabal.config" :| ["cfg/3.config", "2.config", "cfg/1.config", "0.config", "cabal.project"]
>>> let ps = [p, a, b, c, d, e, f, g]
>>> render $ docProjectConfigFiles ps
"- cabal.project\n- 0.config\n- 2.config\n- cfg/1.config\n- cfg/3.config\n- with.config\n- https://www.stackage.org/lts-21.25/cabal.config"

cyclicalImportMsg :: ProjectConfigPath -> Doc Source #

A message for a cyclical import, a "cyclical import of".

untrimmedUriImportMsg :: Doc -> ProjectConfigPath -> Doc Source #

A message for an import that has leading or trailing spaces.

Checks

reportDuplicateImports :: Verbosity -> ProjectConfigSkeleton -> IO () Source #

Detect and report any duplicate imports, including those missed when parsing.

Parsing catches cyclical imports and some but not all duplicate imports. In particular, it doesn't catch when the same project configuration is imported via different import paths.