| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Distribution.Client.ProjectConfig.Import
Contents
Description
Project configuration imports.
Synopsis
- type ProjectConfigSkeleton = CondTree ConfVar ([(Maybe URI, ProjectConfigPath)], ProjectConfig)
- projectSkeletonImports :: ProjectConfigSkeleton -> [(Maybe URI, ProjectConfigPath)]
- fetchImport :: (ProjectConfigToParse -> IO a) -> FilePath -> HttpTransport -> Verbosity -> FilePath -> ProjectConfigPath -> IO (Maybe URI, a)
- docProjectConfigFiles :: [ProjectConfigPath] -> Doc
- cyclicalImportMsg :: ProjectConfigPath -> Doc
- untrimmedUriImportMsg :: Doc -> ProjectConfigPath -> Doc
- reportDuplicateImports :: Verbosity -> ProjectConfigSkeleton -> IO ()
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.