diff --git a/.typos-srcs.toml b/.typos-srcs.toml index bdaebdeada6..6aa7c3b2c98 100644 --- a/.typos-srcs.toml +++ b/.typos-srcs.toml @@ -16,6 +16,7 @@ extend-exclude = [ ".hlint.yaml", "Cabal-tests/tests/ParserTests/errors/common1.cabal", # import: windo doesn't exist "Cabal-tests/tests/ParserTests/errors/common1.errors", + "cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/www-stackage-org/lts-21.25.config", ] [default] diff --git a/cabal-install/src/Distribution/Client/ProjectConfig.hs b/cabal-install/src/Distribution/Client/ProjectConfig.hs index fef10acbed0..a0eea1ac5cc 100644 --- a/cabal-install/src/Distribution/Client/ProjectConfig.hs +++ b/cabal-install/src/Distribution/Client/ProjectConfig.hs @@ -255,7 +255,7 @@ import System.IO , withBinaryFile ) -import Distribution.Client.ProjectConfig.Import (ProjectConfigSkeleton, docProjectConfigFiles, projectSkeletonImports) +import Distribution.Client.ProjectConfig.Import import Distribution.Deprecated.ProjectParseUtils (ProjectParseError (..), ProjectParseWarning) import Distribution.Solver.Types.ProjectConfigPath @@ -855,7 +855,10 @@ readProjectFileSkeletonGen then do monitorFiles [monitorFileHashed extensionFile] pcs <- liftIO $ parseConfig extensionFile - monitorFiles $ map monitorFileHashed (projectConfigPathRoot <$> projectSkeletonImports pcs) + monitorFiles + [ monitorFileHashed (projectConfigPathRoot path) + | (Nothing, path) <- projectSkeletonImports pcs + ] return pcs else do monitorFiles [monitorNonExistentFile extensionFile] @@ -973,15 +976,20 @@ reportParseResultParsec verbosity fpath contents pr = do -- | Reads a named extended (with imports and conditionals) config file in the given project root dir, or returns empty. parseProjectFileSkeletonLegacy :: Verbosity -> HttpTransport -> DistDirLayout -> String -> String -> FilePath -> IO (OldParser.ProjectParseResult ProjectConfigSkeleton) -parseProjectFileSkeletonLegacy verbosity httpTransport distDirLayout extensionName extensionDescription extensionFile = - parseProject extensionFile (distDownloadSrcDirectory distDirLayout) httpTransport verbosity . ProjectConfigToParse - =<< BS.readFile extensionFile +parseProjectFileSkeletonLegacy verbosity httpTransport distDirLayout extensionName extensionDescription extensionFile = do + bs <- BS.readFile extensionFile + res <- parseProject extensionFile (distDownloadSrcDirectory distDirLayout) httpTransport verbosity $ ProjectConfigToParse bs + case res of + x@(OldParser.ProjectParseOk _ skeleton) -> reportDuplicateImports verbosity skeleton >> pure x + x@OldParser.ProjectParseFailed{} -> pure x parseProjectFileSkeletonParsec :: Verbosity -> HttpTransport -> DistDirLayout -> String -> String -> FilePath -> IO (Parsec.ParseResult ProjectFileSource ProjectConfigSkeleton, BS.ByteString) parseProjectFileSkeletonParsec verbosity httpTransport distDirLayout extensionName extensionDescription extensionFile = do bs <- BS.readFile extensionFile res <- Parsec.parseProject extensionFile (distDownloadSrcDirectory distDirLayout) httpTransport verbosity $ ProjectConfigToParse bs - return (res, bs) + case snd $ runParseResult res of + x@(Right skeleton) -> reportDuplicateImports verbosity skeleton >> pure (res, bs) + x@Left{} -> pure (res, bs) -- | Render the 'ProjectConfig' format. -- diff --git a/cabal-install/src/Distribution/Client/ProjectConfig/Import.hs b/cabal-install/src/Distribution/Client/ProjectConfig/Import.hs index c6fa0fbff09..6e6c4b6beb8 100644 --- a/cabal-install/src/Distribution/Client/ProjectConfig/Import.hs +++ b/cabal-install/src/Distribution/Client/ProjectConfig/Import.hs @@ -1,3 +1,7 @@ +{-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE RecordWildCards #-} {-# LANGUAGE TupleSections #-} {-# LANGUAGE ViewPatterns #-} {-# LANGUAGE NoImplicitPrelude #-} @@ -13,31 +17,39 @@ module Distribution.Client.ProjectConfig.Import , docProjectConfigFiles , cyclicalImportMsg , untrimmedUriImportMsg + + -- * Checks + , reportDuplicateImports ) where -import Control.Arrow (Kleisli (..), arr, (>>>)) +import Control.Arrow (Kleisli (..), arr, second, (>>>)) import qualified Data.ByteString.Char8 as BS import Data.Coerce (coerce) +import Data.Function ((&)) +import Data.Functor ((<&>)) +import Data.List ((\\)) +import qualified Data.Map as Map import Distribution.Client.Compat.Prelude hiding (empty, (<>)) +import qualified Distribution.Client.Compat.Prelude as Prelude ((<>)) import Distribution.Client.HttpUtils import Distribution.Client.ProjectConfig.Types import Distribution.Compat.Lens (view) import Distribution.PackageDescription (ConfVar (..)) -import Distribution.Simple.Utils (debug, ordNub) +import Distribution.Simple.Utils (debug, noticeDoc, ordNub) import Distribution.Solver.Types.ProjectConfigPath import Distribution.Types.CondTree (CondTree (..), traverseCondTreeA) import Distribution.Utils.String (trim) import Network.URI (URI (..), parseURI) import System.Directory (createDirectoryIfMissing) import System.FilePath (isAbsolute, isPathSeparator, makeValid, ()) -import Text.PrettyPrint +import Text.PrettyPrint (Doc, empty, int, nest, semi, text, vcat, (<>)) -- | 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 -type ProjectConfigSkeleton = CondTree ConfVar ([ProjectConfigPath], ProjectConfig) +type ProjectConfigSkeleton = CondTree ConfVar ([(Maybe URI, ProjectConfigPath)], ProjectConfig) -projectSkeletonImports :: ProjectConfigSkeleton -> [ProjectConfigPath] +projectSkeletonImports :: ProjectConfigSkeleton -> [(Maybe URI, ProjectConfigPath)] projectSkeletonImports = fst . view traverseCondTreeA -- | Fetch a local file import or remote URL import and parse it. @@ -48,9 +60,9 @@ fetchImport -> Verbosity -> FilePath -> ProjectConfigPath - -> IO a + -> IO (Maybe URI, a) fetchImport parser cacheDir httpTransport verbosity projectDir normLocPath = - fetchImportConfig normLocPath >>= runKleisli (arr ProjectConfigToParse >>> Kleisli parser) . snd + fetchImportConfig normLocPath >>= runKleisli (second (arr ProjectConfigToParse >>> Kleisli parser)) where fetchImportConfig :: ProjectConfigPath -> IO (Maybe URI, BS.ByteString) fetchImportConfig (ProjectConfigPath (pci :| _)) = do @@ -66,6 +78,51 @@ fetchImport parser cacheDir httpTransport verbosity projectDir normLocPath = BS.readFile $ if isAbsolute pci then pci else coerce projectDir pci +-- | Not just any file path. The project itself. +newtype ProjectFilePath = ProjectFilePath FilePath + deriving (Eq, Generic) + +-- | Isomorphic with 'ProjectConfigPath' but with separate constructors for the +-- root, imported file and imported URI. +data ProjectNode a where + ProjectRoot :: FilePath -> ProjectNode ProjectFilePath + ProjectFileImport :: FilePath -> ProjectConfigPath -> ProjectNode FilePath + ProjectUriImport :: URI -> ProjectConfigPath -> ProjectNode URI + +instance Eq (ProjectNode a) where + (==) a b + | ProjectRoot root <- a + , ProjectRoot root' <- b = + root == root' + | ProjectFileImport importOf importBy <- a + , ProjectFileImport importOf' importBy' <- b = + (==) + (consProjectConfigPath importOf importBy) + (consProjectConfigPath importOf' importBy') + | ProjectUriImport importOf importBy <- a + , ProjectUriImport importOf' importBy' <- b = + (==) + (consProjectConfigPath (show importOf) importBy) + (consProjectConfigPath (show importOf') importBy') + +instance Pretty (ProjectNode a) where + pretty = \case + ProjectRoot root -> text root + ProjectFileImport importOf importBy -> pretty $ consProjectConfigPath importOf importBy + ProjectUriImport importOf importBy -> pretty $ consProjectConfigPath (show importOf) importBy + +instance Show (ProjectNode a) where show = prettyShow + +-- | Sorts the same as 'ProjectConfigPath' does. +instance Ord (ProjectNode a) where + compare = + (compare :: ProjectConfigPath -> ProjectConfigPath -> Ordering) + `on` ( \case + ProjectRoot root -> ProjectConfigPath $ root :| [] + ProjectFileImport importOf importBy -> consProjectConfigPath importOf importBy + ProjectUriImport importOf importBy -> consProjectConfigPath (show importOf) importBy + ) + -- | Renders the paths as a list without showing which path imports another, -- like this; -- @@ -133,10 +190,43 @@ docProjectConfigFiles (sortBy compareLexicographically -> ps) = -- | A message for a cyclical import, a "cyclical import of". cyclicalImportMsg :: ProjectConfigPath -> Doc cyclicalImportMsg path@(ProjectConfigPath (duplicate :| _)) = + seenImportMsg + (text "cyclical import of" <+> text duplicate <> semi) + (ProjectFileImport duplicate path) + [] + +-- | A message for a duplicate import, a "duplicate import of". If a check for +-- cyclical imports has already been made then this would report a duplicate +-- import by two different paths. +duplicateImportMsg :: Doc -> ProjectNode a -> [ProjectNode a] -> Doc +duplicateImportMsg intro = seenImportMsg intro + +seenImportMsg :: Doc -> ProjectNode a -> [ProjectNode a] -> Doc +seenImportMsg intro projectNode seenImports = vcat - [ text "cyclical import of" <+> text duplicate <> semi - , nest 2 (docProjectConfigPath path) + [ intro + , maybe empty (nest 2 . docProjectConfigPath) path + , nest 2 $ + vcat + [ docProjectConfigPath i + | Just i <- importBy <$> filter ((duplicate ==) . importOf) seenImports + ] ] + where + duplicate = importOf projectNode + path = importBy projectNode + + importOf :: ProjectNode a -> FilePath + importOf = \case + ProjectRoot dup -> dup + ProjectFileImport dup _ -> dup + ProjectUriImport dup _ -> show dup + + importBy :: ProjectNode a -> Maybe ProjectConfigPath + importBy = \case + ProjectRoot _ -> Nothing + ProjectFileImport _ by -> Just by + ProjectUriImport _ by -> Just by -- | A message for an import that has leading or trailing spaces. untrimmedUriImportMsg :: Doc -> ProjectConfigPath -> Doc @@ -145,3 +235,69 @@ untrimmedUriImportMsg intro path = [ intro <+> text "import has leading or trailing whitespace" <> semi , nest 2 (docProjectConfigPath path) ] + +-- | 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. +reportDuplicateImports :: Verbosity -> ProjectConfigSkeleton -> IO () +reportDuplicateImports verbosity skeleton = do + let (dupeRoots, dupeFiles, dupeUris) = detectDupes $ projectSkeletonImports skeleton + unless (Map.null dupeRoots) (noticeDoc verbosity $ vcat (dupesMsg <$> Map.toList dupeRoots)) + unless (Map.null dupeFiles) (noticeDoc verbosity $ vcat (dupesMsg <$> Map.toList dupeFiles)) + unless (Map.null dupeUris) (noticeDoc verbosity $ vcat (dupesMsg <$> Map.toList dupeUris)) + +toDupes :: Ord k => [(k, [ProjectNode a])] -> Map k [Dupes a] +toDupes xs = + xs + & Map.fromListWith (Prelude.<>) + & Map.filter ((> 1) . length) + <&> \ys -> [Dupes v ys | v <- ys] + +detectDupes :: [(Maybe URI, ProjectConfigPath)] -> (DupesMap ProjectFilePath, DupesMap FilePath, DupesMap URI) +detectDupes xs = (toDupes roots, toDupes files, toDupes uris) + where + (<$$>) = fmap . fmap + roots = + [ (h, [ProjectRoot h]) + | (Nothing, (h, Nothing)) <- unconsProjectConfigPath <$$> xs + ] + files = + [ (h, [ProjectFileImport h (consProjectConfigPath h t)]) + | (Nothing, (h, Just t)) <- unconsProjectConfigPath <$$> xs + ] + uris = + [ (f, [ProjectUriImport u (consProjectConfigPath f t)]) + | (Just u, (f, Just t)) <- unconsProjectConfigPath <$$> xs + , show u == f + ] + +data Dupes a = Dupes + { dupesImport :: ProjectNode a + -- ^ The import that we're checking for duplicates. + , dupesImports :: [ProjectNode a] + -- ^ All the imports of this file. + } + deriving (Eq) + +instance Ord (Dupes a) where + compare x y = + (compare `on` length . dupesImports) x y + `thenCmp` (compare `on` sort . dupesImports) x y + `thenCmp` (compare `on` dupesImport) x y + where + thenCmp :: Ordering -> Ordering -> Ordering + thenCmp EQ o2 = o2 + thenCmp o1 _ = o1 + +type DupesMap a = Map FilePath [Dupes a] + +dupesMsg :: (FilePath, [Dupes a]) -> Doc +dupesMsg (duplicate, ds@(take 1 . sort -> dupes)) = + vcat $ + ((text "Warning:" <+> int (length ds) <+> text "imports of" <+> text duplicate) <> semi) + : ((\Dupes{..} -> duplicateImportMsg empty dupesImport (sort $ dupesImports \\ [dupesImport])) <$> dupes) + +-- $setup +-- >>> import Text.PrettyPrint (render) diff --git a/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs b/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs index d6c75b9ad3b..55bee551e1f 100644 --- a/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs +++ b/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs @@ -4,30 +4,34 @@ {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE RecordWildCards #-} -{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TupleSections #-} {-# LANGUAGE ViewPatterns #-} -- | Project configuration, implementation in terms of legacy types. module Distribution.Client.ProjectConfig.Legacy - ( -- Project config skeletons - parseProject + ( -- * Skeletons + ProjectConfigSkeleton , instantiateProjectConfigSkeletonFetchingCompiler , instantiateProjectConfigSkeletonWithCompiler , singletonProjectConfigSkeleton - -- * Project config in terms of legacy types - , LegacyProjectConfig + -- * Parsing + , parseProject , parseLegacyProjectConfig + + -- * Legacy Configuration + , LegacyProjectConfig , showLegacyProjectConfig - -- * Conversion to and from legacy config types + -- * Conversions , commandLineFlagsToProjectConfig , convertLegacyProjectConfig , convertLegacyGlobalConfig , convertToLegacyProjectConfig - -- * Internals, just for tests + -- * Internals + + -- | These functions are exposed just for tests. , parsePackageLocationTokenQ , renderPackageLocationToken ) where @@ -224,7 +228,7 @@ instantiateProjectConfigSkeletonFetchingCompiler fetch flags skel instantiateProjectConfigSkeletonWithCompiler :: OS -> Arch -> CompilerInfo -> FlagAssignment -> ProjectConfigSkeleton -> ProjectConfig instantiateProjectConfigSkeletonWithCompiler os arch impl _flags skel = go $ mapTreeConds (fst . simplifyWithSysParams os arch impl) skel where - go :: CondTree FlagName ([ProjectConfigPath], ProjectConfig) -> ProjectConfig + go :: CondTree FlagName ([(Maybe URI, ProjectConfigPath)], ProjectConfig) -> ProjectConfig go (CondNode (_, l) ts) = let branches = concatMap processBranch ts in l <> mconcat branches @@ -249,8 +253,10 @@ parseProject rootPath cacheDir httpTransport verbosity configToParse = projectDir <- makeAbsolute dir projectPath <- canonicalizeConfigPath projectDir (ProjectConfigPath $ projectFileName :| []) parseProjectSkeleton cacheDir httpTransport verbosity projectDir projectPath configToParse - -- NOTE: Reverse the warnings so they are in line number order. - <&> \case ProjectParseOk ws x -> ProjectParseOk (reverse ws) x; x -> x + <&> \case + -- NOTE: Reverse the warnings so they are in line number order. + ProjectParseOk ws skeleton -> ProjectParseOk (reverse ws) skeleton + x@ProjectParseFailed{} -> x parseProjectSkeleton :: FilePath @@ -283,9 +289,9 @@ parseProjectSkeleton cacheDir httpTransport verbosity projectDir source (Project (isUntrimmedUriConfigPath importLocPath) (noticeDoc verbosity $ untrimmedUriImportMsg (Disp.text "Warning:") importLocPath) let parser = parseProjectSkeleton cacheDir httpTransport verbosity projectDir importLocPath - res <- fetchImport parser cacheDir httpTransport verbosity projectDir normLocPath + (mbUri, res) <- fetchImport parser cacheDir httpTransport verbosity projectDir normLocPath rest <- go [] xs - let fs = (\z -> CondNode ([normLocPath], z) mempty) <$> fieldsToConfig normSource (reverse acc) + let fs = (\z -> CondNode ([(mbUri, normLocPath)], z) mempty) <$> fieldsToConfig normSource (reverse acc) pure . fmap mconcat . sequence $ [projectParse Nothing normSource fs, res, rest] (ParseUtils.Section l "if" p xs') -> do normSource <- canonicalizeConfigPath projectDir source @@ -350,20 +356,19 @@ parseProjectSkeleton cacheDir httpTransport verbosity projectDir source (Project addWarnings (ProjectParseOk ws' x') = ProjectParseOk (ws' ++ ((p,) <$> ws)) x' addWarnings x' = x' liftPR p _ (ParseFailed e) = pure $ projectParseFail Nothing (Just p) e - modifiesCompiler :: ProjectConfig -> Bool modifiesCompiler pc = isSet projectConfigHcFlavor || isSet projectConfigHcPath || isSet projectConfigHcPkg where isSet f = f (projectConfigShared pc) /= NoFlag sanityWalkPCS :: Bool -> ProjectConfigSkeleton -> ProjectParseResult ProjectConfigSkeleton - sanityWalkPCS underConditional t@(CondNode (listToMaybe -> c, d) comps) + sanityWalkPCS underConditional t@(CondNode (fmap snd . listToMaybe -> c, d) comps) | underConditional && modifiesCompiler d = projectParseFail Nothing c $ ParseUtils.FromString "Cannot set compiler in a conditional clause of a cabal project file" Nothing | otherwise = mapM_ sanityWalkBranch comps >> pure t - sanityWalkBranch :: CondBranch ConfVar ([ProjectConfigPath], ProjectConfig) -> ProjectParseResult () + sanityWalkBranch :: CondBranch ConfVar ([(Maybe URI, ProjectConfigPath)], ProjectConfig) -> ProjectParseResult () sanityWalkBranch (CondBranch _c t f) = traverse_ (sanityWalkPCS True) f >> sanityWalkPCS True t >> pure () ------------------------------------------------------------------ diff --git a/cabal-install/src/Distribution/Client/ProjectConfig/Parsec.hs b/cabal-install/src/Distribution/Client/ProjectConfig/Parsec.hs index 866d635bff6..8fe8c42a670 100644 --- a/cabal-install/src/Distribution/Client/ProjectConfig/Parsec.hs +++ b/cabal-install/src/Distribution/Client/ProjectConfig/Parsec.hs @@ -54,7 +54,7 @@ import qualified Data.Map.Strict as Map import qualified Data.Set as Set import Distribution.Client.Errors.Parser (ProjectFileSource (..)) import qualified Distribution.Compat.CharParsing as P -import Network.URI (uriFragment, uriPath, uriScheme) +import Network.URI (URI, uriFragment, uriPath, uriScheme) import System.Directory (makeAbsolute) import System.FilePath (splitFileName) import qualified Text.Parsec @@ -133,9 +133,9 @@ parseProjectSkeleton cacheDir httpTransport verbosity projectDir source (Project (isUntrimmedUriConfigPath importLocPath) (noticeDoc verbosity $ untrimmedUriImportMsg (Disp.text "Warning:") importLocPath) let parser = parseProjectSkeleton cacheDir httpTransport verbosity projectDir importLocPath - importParseResult <- fetchImport parser cacheDir httpTransport verbosity projectDir normLocPath + (mbUri, importParseResult) <- fetchImport parser cacheDir httpTransport verbosity projectDir normLocPath rest <- go [] xs - let fs = (\z -> CondNode ([normLocPath], z) mempty) <$> fieldsToConfig normSource (reverse acc) + let fs = (\z -> CondNode ([(mbUri, normLocPath)], z) mempty) <$> fieldsToConfig normSource (reverse acc) pure . fmap mconcat . sequence $ [fs, importParseResult, rest] ) (parseImport pos importLines) @@ -186,7 +186,6 @@ parseProjectSkeleton cacheDir httpTransport verbosity projectDir source (Project config <- parseFieldGrammarCheckingStanzas cabalSpec fs (projectConfigFieldGrammar sourceConfigPath (knownProgramNames programDb)) stanzas config' <- view stateConfig <$> execStateT (goSections programDb sections) (SectionS config) return config' - modifiesCompiler :: ProjectConfig -> Bool modifiesCompiler pc = isSet projectConfigHcFlavor || isSet projectConfigHcPath || isSet projectConfigHcPkg where @@ -197,7 +196,7 @@ parseProjectSkeleton cacheDir httpTransport verbosity projectDir source (Project | underConditional && modifiesCompiler d = parseFatalFailure zeroPos "Cannot set compiler in a conditional clause of a cabal project file" | otherwise = mapM_ sanityWalkBranch comps >> pure t - sanityWalkBranch :: CondBranch ConfVar ([ProjectConfigPath], ProjectConfig) -> ParseResult ProjectFileSource () + sanityWalkBranch :: CondBranch ConfVar ([(Maybe URI, ProjectConfigPath)], ProjectConfig) -> ParseResult ProjectFileSource () sanityWalkBranch (CondBranch _c t f) = traverse_ (sanityWalkPCS True) f >> sanityWalkPCS True t >> pure () programDb = defaultProgramDb diff --git a/cabal-install/src/Distribution/Client/ScriptUtils.hs b/cabal-install/src/Distribution/Client/ScriptUtils.hs index 6127e544e1b..6f6e03eccf5 100644 --- a/cabal-install/src/Distribution/Client/ScriptUtils.hs +++ b/cabal-install/src/Distribution/Client/ScriptUtils.hs @@ -58,7 +58,7 @@ import Distribution.Client.ProjectConfig , withGlobalConfig , withProjectOrGlobalConfig ) -import Distribution.Client.ProjectConfig.Import (ProjectConfigSkeleton) +import Distribution.Client.ProjectConfig.Import (ProjectConfigSkeleton, reportDuplicateImports) import Distribution.Client.ProjectConfig.Legacy ( instantiateProjectConfigSkeletonFetchingCompiler , parseProject @@ -92,6 +92,9 @@ import Distribution.Compiler ( CompilerId (..) , perCompilerFlavorToList ) +import qualified Distribution.Deprecated.ProjectParseUtils as OldParser + ( ProjectParseResult (..) + ) import Distribution.FieldGrammar ( parseFieldGrammar , takeFields @@ -521,9 +524,12 @@ readProjectBlockFromScript :: Verbosity -> HttpTransport -> DistDirLayout -> Str readProjectBlockFromScript verbosity httpTransport DistDirLayout{distDownloadSrcDirectory} scriptName str = do case extractScriptBlock "project" str of Left _ -> return mempty - Right x -> - reportParseResult verbosity "script" scriptName - =<< parseProject scriptName distDownloadSrcDirectory httpTransport verbosity (ProjectConfigToParse x) + Right bs -> do + res <- parseProject scriptName distDownloadSrcDirectory httpTransport verbosity (ProjectConfigToParse bs) + case res of + OldParser.ProjectParseOk _ skeleton -> reportDuplicateImports verbosity skeleton + OldParser.ProjectParseFailed{} -> pure () + reportParseResult verbosity "script" scriptName res -- | Extract the first encountered script metadata block started end -- terminated by the tokens diff --git a/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.out b/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.out index 4e2cfe368c3..546c850b51d 100644 --- a/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.out +++ b/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.out @@ -194,9 +194,6 @@ Could not resolve dependencies: (constraint from oops-0.project requires ==1.4.3.0) [__1] fail (backjumping, conflict set: hashable, oops) After searching the rest of the dependency tree exhaustively, these were the goals I've had most trouble fulfilling: hashable (3), oops (2) -# checking if we detect when the same config is imported via many different paths (we don't) -# cabal v2-build -Up to date # checking bad conditional # cabal v2-build Error: [Cabal-7167] diff --git a/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.test.hs b/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.test.hs index 5bcf8726850..2cec97c31cf 100644 --- a/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.test.hs +++ b/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.test.hs @@ -133,39 +133,6 @@ main = cabalTest . withRepo "repo" . recordMode RecordMarked $ do readFileVerbatim "oops.expect.txt" >>= flip (assertOn isInfixOf multilineNeedleHaystack) oopsing . normalizePathSeparators - -- The project is named yops as it is like hops but with y's for forks. - -- +-- yops-0.project - -- +-- yops/yops-1.config - -- +-- yops-2.config - -- +-- yops/yops-3.config - -- +-- yops-4.config - -- +-- yops/yops-5.config - -- +-- yops-6.config - -- +-- yops/yops-7.config - -- +-- yops-8.config - -- +-- yops/yops-9.config (no further imports) - -- +-- yops/yops-3.config - -- +-- yops-4.config - -- +-- yops/yops-5.config - -- +-- yops-6.config - -- +-- yops/yops-7.config - -- +-- yops-8.config - -- +-- yops/yops-9.config (no further imports) - -- +-- yops/yops-5.config - -- +-- yops-6.config - -- +-- yops/yops-7.config - -- +-- yops-8.config - -- +-- yops/yops-9.config (no further imports) - -- +-- yops/yops-7.config - -- +-- yops-8.config - -- +-- yops/yops-9.config (no further imports) - -- +-- yops/yops-9.config (no further imports) - -- - -- We don't check and don't error or warn on the same config being imported - -- via many different paths. - log "checking if we detect when the same config is imported via many different paths (we don't)" - yopping <- cabal' "v2-build" [ "--project-file=yops-0.project" ] - log "checking bad conditional" badIf <- fails $ cabal' "v2-build" [ "--project-file=bad-conditional.project" ] assertOutputContains "Cannot set compiler in a conditional clause of a cabal project file" badIf diff --git a/cabal-testsuite/PackageTests/ProjectImport/DedupUsingConfigFromComplex/cabal.out b/cabal-testsuite/PackageTests/ProjectImport/DedupUsingConfigFromComplex/cabal.out index 43a3f25acc2..63d1e42ff56 100644 --- a/cabal-testsuite/PackageTests/ProjectImport/DedupUsingConfigFromComplex/cabal.out +++ b/cabal-testsuite/PackageTests/ProjectImport/DedupUsingConfigFromComplex/cabal.out @@ -1,4 +1,320 @@ # check "using config from message" with URI imports # cabal v2-build +Warning: 2 imports of 4.config; + 4.config + imported by: cfg/3.config + imported by: 0.config + imported by: no-pkgs.project + 4.config + imported by: cfg/3.config + imported by: 2.config + imported by: cfg/1.config + imported by: 0.config + imported by: no-pkgs.project +Warning: 3 imports of 6.config; + 6.config + imported by: cfg/5.config + imported by: 0.config + imported by: no-pkgs.project + 6.config + imported by: cfg/5.config + imported by: 4.config + imported by: cfg/3.config + imported by: 0.config + imported by: no-pkgs.project + 6.config + imported by: cfg/5.config + imported by: 4.config + imported by: cfg/3.config + imported by: 2.config + imported by: cfg/1.config + imported by: 0.config + imported by: no-pkgs.project +Warning: 4 imports of 8.config; + 8.config + imported by: cfg/7.config + imported by: 0.config + imported by: no-pkgs.project + 8.config + imported by: cfg/7.config + imported by: 6.config + imported by: cfg/5.config + imported by: 0.config + imported by: no-pkgs.project + 8.config + imported by: cfg/7.config + imported by: 6.config + imported by: cfg/5.config + imported by: 4.config + imported by: cfg/3.config + imported by: 0.config + imported by: no-pkgs.project + 8.config + imported by: cfg/7.config + imported by: 6.config + imported by: cfg/5.config + imported by: 4.config + imported by: cfg/3.config + imported by: 2.config + imported by: cfg/1.config + imported by: 0.config + imported by: no-pkgs.project +Warning: 2 imports of cfg/3.config; + cfg/3.config + imported by: 0.config + imported by: no-pkgs.project + cfg/3.config + imported by: 2.config + imported by: cfg/1.config + imported by: 0.config + imported by: no-pkgs.project +Warning: 3 imports of cfg/5.config; + cfg/5.config + imported by: 0.config + imported by: no-pkgs.project + cfg/5.config + imported by: 4.config + imported by: cfg/3.config + imported by: 0.config + imported by: no-pkgs.project + cfg/5.config + imported by: 4.config + imported by: cfg/3.config + imported by: 2.config + imported by: cfg/1.config + imported by: 0.config + imported by: no-pkgs.project +Warning: 4 imports of cfg/7.config; + cfg/7.config + imported by: 0.config + imported by: no-pkgs.project + cfg/7.config + imported by: 6.config + imported by: cfg/5.config + imported by: 0.config + imported by: no-pkgs.project + cfg/7.config + imported by: 6.config + imported by: cfg/5.config + imported by: 4.config + imported by: cfg/3.config + imported by: 0.config + imported by: no-pkgs.project + cfg/7.config + imported by: 6.config + imported by: cfg/5.config + imported by: 4.config + imported by: cfg/3.config + imported by: 2.config + imported by: cfg/1.config + imported by: 0.config + imported by: no-pkgs.project +Warning: 5 imports of cfg/9.config; + cfg/9.config + imported by: 0.config + imported by: no-pkgs.project + cfg/9.config + imported by: 8.config + imported by: cfg/7.config + imported by: 0.config + imported by: no-pkgs.project + cfg/9.config + imported by: 8.config + imported by: cfg/7.config + imported by: 6.config + imported by: cfg/5.config + imported by: 0.config + imported by: no-pkgs.project + cfg/9.config + imported by: 8.config + imported by: cfg/7.config + imported by: 6.config + imported by: cfg/5.config + imported by: 4.config + imported by: cfg/3.config + imported by: 0.config + imported by: no-pkgs.project + cfg/9.config + imported by: 8.config + imported by: cfg/7.config + imported by: 6.config + imported by: cfg/5.config + imported by: 4.config + imported by: cfg/3.config + imported by: 2.config + imported by: cfg/1.config + imported by: 0.config + imported by: no-pkgs.project +Warning: 25 imports of https://www.stackage.org/lts-21.25/cabal.config; + https://www.stackage.org/lts-21.25/cabal.config + imported by: cfg/1.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: cfg/3.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: cfg/5.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: cfg/7.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: cfg/9.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: 2.config + imported by: cfg/1.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: 4.config + imported by: cfg/3.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: 6.config + imported by: cfg/5.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: 8.config + imported by: cfg/7.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: cfg/3.config + imported by: 2.config + imported by: cfg/1.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: cfg/5.config + imported by: 4.config + imported by: cfg/3.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: cfg/7.config + imported by: 6.config + imported by: cfg/5.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: cfg/9.config + imported by: 8.config + imported by: cfg/7.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: 4.config + imported by: cfg/3.config + imported by: 2.config + imported by: cfg/1.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: 6.config + imported by: cfg/5.config + imported by: 4.config + imported by: cfg/3.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: 8.config + imported by: cfg/7.config + imported by: 6.config + imported by: cfg/5.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: cfg/5.config + imported by: 4.config + imported by: cfg/3.config + imported by: 2.config + imported by: cfg/1.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: cfg/7.config + imported by: 6.config + imported by: cfg/5.config + imported by: 4.config + imported by: cfg/3.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: cfg/9.config + imported by: 8.config + imported by: cfg/7.config + imported by: 6.config + imported by: cfg/5.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: 6.config + imported by: cfg/5.config + imported by: 4.config + imported by: cfg/3.config + imported by: 2.config + imported by: cfg/1.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: 8.config + imported by: cfg/7.config + imported by: 6.config + imported by: cfg/5.config + imported by: 4.config + imported by: cfg/3.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: cfg/7.config + imported by: 6.config + imported by: cfg/5.config + imported by: 4.config + imported by: cfg/3.config + imported by: 2.config + imported by: cfg/1.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: cfg/9.config + imported by: 8.config + imported by: cfg/7.config + imported by: 6.config + imported by: cfg/5.config + imported by: 4.config + imported by: cfg/3.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: 8.config + imported by: cfg/7.config + imported by: 6.config + imported by: cfg/5.config + imported by: 4.config + imported by: cfg/3.config + imported by: 2.config + imported by: cfg/1.config + imported by: 0.config + imported by: no-pkgs.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: cfg/9.config + imported by: 8.config + imported by: cfg/7.config + imported by: 6.config + imported by: cfg/5.config + imported by: 4.config + imported by: cfg/3.config + imported by: 2.config + imported by: cfg/1.config + imported by: 0.config + imported by: no-pkgs.project # check project configuration with URI imports is listed in full and # check package directories and locations are reported in order diff --git a/cabal-testsuite/PackageTests/ProjectImport/DedupUsingConfigFromSimple/cabal.out b/cabal-testsuite/PackageTests/ProjectImport/DedupUsingConfigFromSimple/cabal.out index 92fd8204a40..27e4321ba80 100644 --- a/cabal-testsuite/PackageTests/ProjectImport/DedupUsingConfigFromSimple/cabal.out +++ b/cabal-testsuite/PackageTests/ProjectImport/DedupUsingConfigFromSimple/cabal.out @@ -1 +1,40 @@ # cabal v2-build +Warning: 2 imports of a-very-extra.config; + a-very-extra.config + imported by: cabal.project + a-very-extra.config + imported by: cabal.project +Warning: 2 imports of an-extra.config; + an-extra.config + imported by: cabal.project + an-extra.config + imported by: cabal.project +Warning: 10 imports of https://www.stackage.org/lts-21.25/cabal.config; + https://www.stackage.org/lts-21.25/cabal.config + imported by: cabal.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: cabal.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: a-very-extra.config + imported by: cabal.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: a-very-extra.config + imported by: cabal.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: a-very-extra.config + imported by: cabal.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: a-very-extra.config + imported by: cabal.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: an-extra.config + imported by: cabal.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: an-extra.config + imported by: cabal.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: an-extra.config + imported by: cabal.project + https://www.stackage.org/lts-21.25/cabal.config + imported by: an-extra.config + imported by: cabal.project diff --git a/cabal-testsuite/PackageTests/ProjectImport/DedupUsingConfigFromSimple/cabal.test.hs b/cabal-testsuite/PackageTests/ProjectImport/DedupUsingConfigFromSimple/cabal.test.hs index a99809e1c52..97abc2f93ec 100644 --- a/cabal-testsuite/PackageTests/ProjectImport/DedupUsingConfigFromSimple/cabal.test.hs +++ b/cabal-testsuite/PackageTests/ProjectImport/DedupUsingConfigFromSimple/cabal.test.hs @@ -1,6 +1,6 @@ import Test.Cabal.Prelude -main = cabalTest . flakyIfCI 10975 . recordMode RecordMarked $ do +main = cabalTest . flakyIfCI 10975 . flakyIfCI 10927 . recordMode RecordMarked $ do let log = recordHeader . pure out <- fails $ cabal' "v2-build" [ "all", "--dry-run" ] diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/Foo.hs b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/Foo.hs new file mode 100644 index 00000000000..8a39fe134cf --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/Foo.hs @@ -0,0 +1,4 @@ +module Foo where + +a :: Int +a = 42 diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.parser-default.out b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.parser-default.out new file mode 100644 index 00000000000..56e241712e0 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.parser-default.out @@ -0,0 +1,402 @@ +# checking that we detect when the same config is imported via many different paths +# cabal v2-build +Warning: 2 imports of yops-4.config; + yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 3 imports of yops-6.config; + yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.project + yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 4 imports of yops-8.config; + yops-8.config + imported by: yops/yops-7.config + imported by: yops-0.project + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.project + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 2 imports of yops/yops-3.config; + yops/yops-3.config + imported by: yops-0.project + yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 3 imports of yops/yops-5.config; + yops/yops-5.config + imported by: yops-0.project + yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 4 imports of yops/yops-7.config; + yops/yops-7.config + imported by: yops-0.project + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.project + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 5 imports of yops/yops-9.config; + yops/yops-9.config + imported by: yops-0.project + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-0.project + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.project + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following would be built: + - foo-0.1 (lib:foo) (first run) +# checking that we detect when the same config is imported via many different paths +# cabal v2-build +Warning: 2 imports of woops-4.config; + woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 3 imports of woops-6.config; + woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 4 imports of woops-8.config; + woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.project + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 2 imports of woops/woops-3.config; + woops/woops-3.config + imported by: woops-0.project + woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 3 imports of woops/woops-5.config; + woops/woops-5.config + imported by: woops-0.project + woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 4 imports of woops/woops-7.config; + woops/woops-7.config + imported by: woops-0.project + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 5 imports of woops/woops-9.config; + woops/woops-9.config + imported by: woops-0.project + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.project + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 25 imports of www-stackage-org/lts-21.25.config; + www-stackage-org/lts-21.25.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following would be built: + - foo-0.1 (lib:foo) (first run) diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.parser-fallback.out b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.parser-fallback.out new file mode 100644 index 00000000000..56e241712e0 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.parser-fallback.out @@ -0,0 +1,402 @@ +# checking that we detect when the same config is imported via many different paths +# cabal v2-build +Warning: 2 imports of yops-4.config; + yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 3 imports of yops-6.config; + yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.project + yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 4 imports of yops-8.config; + yops-8.config + imported by: yops/yops-7.config + imported by: yops-0.project + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.project + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 2 imports of yops/yops-3.config; + yops/yops-3.config + imported by: yops-0.project + yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 3 imports of yops/yops-5.config; + yops/yops-5.config + imported by: yops-0.project + yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 4 imports of yops/yops-7.config; + yops/yops-7.config + imported by: yops-0.project + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.project + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 5 imports of yops/yops-9.config; + yops/yops-9.config + imported by: yops-0.project + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-0.project + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.project + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following would be built: + - foo-0.1 (lib:foo) (first run) +# checking that we detect when the same config is imported via many different paths +# cabal v2-build +Warning: 2 imports of woops-4.config; + woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 3 imports of woops-6.config; + woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 4 imports of woops-8.config; + woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.project + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 2 imports of woops/woops-3.config; + woops/woops-3.config + imported by: woops-0.project + woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 3 imports of woops/woops-5.config; + woops/woops-5.config + imported by: woops-0.project + woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 4 imports of woops/woops-7.config; + woops/woops-7.config + imported by: woops-0.project + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 5 imports of woops/woops-9.config; + woops/woops-9.config + imported by: woops-0.project + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.project + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 25 imports of www-stackage-org/lts-21.25.config; + www-stackage-org/lts-21.25.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following would be built: + - foo-0.1 (lib:foo) (first run) diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.parser-legacy.out b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.parser-legacy.out new file mode 100644 index 00000000000..56e241712e0 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.parser-legacy.out @@ -0,0 +1,402 @@ +# checking that we detect when the same config is imported via many different paths +# cabal v2-build +Warning: 2 imports of yops-4.config; + yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 3 imports of yops-6.config; + yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.project + yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 4 imports of yops-8.config; + yops-8.config + imported by: yops/yops-7.config + imported by: yops-0.project + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.project + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 2 imports of yops/yops-3.config; + yops/yops-3.config + imported by: yops-0.project + yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 3 imports of yops/yops-5.config; + yops/yops-5.config + imported by: yops-0.project + yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 4 imports of yops/yops-7.config; + yops/yops-7.config + imported by: yops-0.project + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.project + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 5 imports of yops/yops-9.config; + yops/yops-9.config + imported by: yops-0.project + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-0.project + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.project + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following would be built: + - foo-0.1 (lib:foo) (first run) +# checking that we detect when the same config is imported via many different paths +# cabal v2-build +Warning: 2 imports of woops-4.config; + woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 3 imports of woops-6.config; + woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 4 imports of woops-8.config; + woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.project + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 2 imports of woops/woops-3.config; + woops/woops-3.config + imported by: woops-0.project + woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 3 imports of woops/woops-5.config; + woops/woops-5.config + imported by: woops-0.project + woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 4 imports of woops/woops-7.config; + woops/woops-7.config + imported by: woops-0.project + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 5 imports of woops/woops-9.config; + woops/woops-9.config + imported by: woops-0.project + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.project + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 25 imports of www-stackage-org/lts-21.25.config; + www-stackage-org/lts-21.25.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following would be built: + - foo-0.1 (lib:foo) (first run) diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.parser-parsec.out b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.parser-parsec.out new file mode 100644 index 00000000000..56e241712e0 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.parser-parsec.out @@ -0,0 +1,402 @@ +# checking that we detect when the same config is imported via many different paths +# cabal v2-build +Warning: 2 imports of yops-4.config; + yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 3 imports of yops-6.config; + yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.project + yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 4 imports of yops-8.config; + yops-8.config + imported by: yops/yops-7.config + imported by: yops-0.project + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.project + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 2 imports of yops/yops-3.config; + yops/yops-3.config + imported by: yops-0.project + yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 3 imports of yops/yops-5.config; + yops/yops-5.config + imported by: yops-0.project + yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 4 imports of yops/yops-7.config; + yops/yops-7.config + imported by: yops-0.project + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.project + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Warning: 5 imports of yops/yops-9.config; + yops/yops-9.config + imported by: yops-0.project + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-0.project + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.project + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.project + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.project +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following would be built: + - foo-0.1 (lib:foo) (first run) +# checking that we detect when the same config is imported via many different paths +# cabal v2-build +Warning: 2 imports of woops-4.config; + woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 3 imports of woops-6.config; + woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 4 imports of woops-8.config; + woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.project + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 2 imports of woops/woops-3.config; + woops/woops-3.config + imported by: woops-0.project + woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 3 imports of woops/woops-5.config; + woops/woops-5.config + imported by: woops-0.project + woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 4 imports of woops/woops-7.config; + woops/woops-7.config + imported by: woops-0.project + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 5 imports of woops/woops-9.config; + woops/woops-9.config + imported by: woops-0.project + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.project + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Warning: 25 imports of www-stackage-org/lts-21.25.config; + www-stackage-org/lts-21.25.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.project +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following would be built: + - foo-0.1 (lib:foo) (first run) diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.script-parser-default.out b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.script-parser-default.out new file mode 100644 index 00000000000..ee9a8ae5545 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.script-parser-default.out @@ -0,0 +1,402 @@ +# checking that we detect when the same config is imported via many different paths +# cabal v2-build +Warning: 2 imports of yops-4.config; + yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 3 imports of yops-6.config; + yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.script.hs + yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 4 imports of yops-8.config; + yops-8.config + imported by: yops/yops-7.config + imported by: yops-0.script.hs + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.script.hs + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 2 imports of yops/yops-3.config; + yops/yops-3.config + imported by: yops-0.script.hs + yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 3 imports of yops/yops-5.config; + yops/yops-5.config + imported by: yops-0.script.hs + yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 4 imports of yops/yops-7.config; + yops/yops-7.config + imported by: yops-0.script.hs + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.script.hs + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 5 imports of yops/yops-9.config; + yops/yops-9.config + imported by: yops-0.script.hs + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-0.script.hs + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.script.hs + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following would be built: + - fake-package-0 (exe:script-yops-0.script.hs) (first run) +# checking that we detect when the same config is imported via many different paths +# cabal v2-build +Warning: 2 imports of woops-4.config; + woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 3 imports of woops-6.config; + woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 4 imports of woops-8.config; + woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.script.hs + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 2 imports of woops/woops-3.config; + woops/woops-3.config + imported by: woops-0.script.hs + woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 3 imports of woops/woops-5.config; + woops/woops-5.config + imported by: woops-0.script.hs + woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 4 imports of woops/woops-7.config; + woops/woops-7.config + imported by: woops-0.script.hs + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 5 imports of woops/woops-9.config; + woops/woops-9.config + imported by: woops-0.script.hs + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.script.hs + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 25 imports of www-stackage-org/lts-21.25.config; + www-stackage-org/lts-21.25.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following would be built: + - fake-package-0 (exe:script-woops-0.script.hs) (first run) diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.script-parser-fallback.out b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.script-parser-fallback.out new file mode 100644 index 00000000000..ee9a8ae5545 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.script-parser-fallback.out @@ -0,0 +1,402 @@ +# checking that we detect when the same config is imported via many different paths +# cabal v2-build +Warning: 2 imports of yops-4.config; + yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 3 imports of yops-6.config; + yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.script.hs + yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 4 imports of yops-8.config; + yops-8.config + imported by: yops/yops-7.config + imported by: yops-0.script.hs + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.script.hs + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 2 imports of yops/yops-3.config; + yops/yops-3.config + imported by: yops-0.script.hs + yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 3 imports of yops/yops-5.config; + yops/yops-5.config + imported by: yops-0.script.hs + yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 4 imports of yops/yops-7.config; + yops/yops-7.config + imported by: yops-0.script.hs + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.script.hs + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 5 imports of yops/yops-9.config; + yops/yops-9.config + imported by: yops-0.script.hs + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-0.script.hs + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.script.hs + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following would be built: + - fake-package-0 (exe:script-yops-0.script.hs) (first run) +# checking that we detect when the same config is imported via many different paths +# cabal v2-build +Warning: 2 imports of woops-4.config; + woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 3 imports of woops-6.config; + woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 4 imports of woops-8.config; + woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.script.hs + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 2 imports of woops/woops-3.config; + woops/woops-3.config + imported by: woops-0.script.hs + woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 3 imports of woops/woops-5.config; + woops/woops-5.config + imported by: woops-0.script.hs + woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 4 imports of woops/woops-7.config; + woops/woops-7.config + imported by: woops-0.script.hs + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 5 imports of woops/woops-9.config; + woops/woops-9.config + imported by: woops-0.script.hs + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.script.hs + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 25 imports of www-stackage-org/lts-21.25.config; + www-stackage-org/lts-21.25.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following would be built: + - fake-package-0 (exe:script-woops-0.script.hs) (first run) diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.script-parser-legacy.out b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.script-parser-legacy.out new file mode 100644 index 00000000000..ee9a8ae5545 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.script-parser-legacy.out @@ -0,0 +1,402 @@ +# checking that we detect when the same config is imported via many different paths +# cabal v2-build +Warning: 2 imports of yops-4.config; + yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 3 imports of yops-6.config; + yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.script.hs + yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 4 imports of yops-8.config; + yops-8.config + imported by: yops/yops-7.config + imported by: yops-0.script.hs + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.script.hs + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 2 imports of yops/yops-3.config; + yops/yops-3.config + imported by: yops-0.script.hs + yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 3 imports of yops/yops-5.config; + yops/yops-5.config + imported by: yops-0.script.hs + yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 4 imports of yops/yops-7.config; + yops/yops-7.config + imported by: yops-0.script.hs + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.script.hs + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 5 imports of yops/yops-9.config; + yops/yops-9.config + imported by: yops-0.script.hs + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-0.script.hs + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.script.hs + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following would be built: + - fake-package-0 (exe:script-yops-0.script.hs) (first run) +# checking that we detect when the same config is imported via many different paths +# cabal v2-build +Warning: 2 imports of woops-4.config; + woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 3 imports of woops-6.config; + woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 4 imports of woops-8.config; + woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.script.hs + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 2 imports of woops/woops-3.config; + woops/woops-3.config + imported by: woops-0.script.hs + woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 3 imports of woops/woops-5.config; + woops/woops-5.config + imported by: woops-0.script.hs + woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 4 imports of woops/woops-7.config; + woops/woops-7.config + imported by: woops-0.script.hs + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 5 imports of woops/woops-9.config; + woops/woops-9.config + imported by: woops-0.script.hs + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.script.hs + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 25 imports of www-stackage-org/lts-21.25.config; + www-stackage-org/lts-21.25.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following would be built: + - fake-package-0 (exe:script-woops-0.script.hs) (first run) diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.script-parser-parsec.out b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.script-parser-parsec.out new file mode 100644 index 00000000000..ee9a8ae5545 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.script-parser-parsec.out @@ -0,0 +1,402 @@ +# checking that we detect when the same config is imported via many different paths +# cabal v2-build +Warning: 2 imports of yops-4.config; + yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 3 imports of yops-6.config; + yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.script.hs + yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 4 imports of yops-8.config; + yops-8.config + imported by: yops/yops-7.config + imported by: yops-0.script.hs + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.script.hs + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 2 imports of yops/yops-3.config; + yops/yops-3.config + imported by: yops-0.script.hs + yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 3 imports of yops/yops-5.config; + yops/yops-5.config + imported by: yops-0.script.hs + yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 4 imports of yops/yops-7.config; + yops/yops-7.config + imported by: yops-0.script.hs + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.script.hs + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Warning: 5 imports of yops/yops-9.config; + yops/yops-9.config + imported by: yops-0.script.hs + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-0.script.hs + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-0.script.hs + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-0.script.hs + yops/yops-9.config + imported by: yops-8.config + imported by: yops/yops-7.config + imported by: yops-6.config + imported by: yops/yops-5.config + imported by: yops-4.config + imported by: yops/yops-3.config + imported by: yops-2.config + imported by: yops/yops-1.config + imported by: yops-0.script.hs +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following would be built: + - fake-package-0 (exe:script-yops-0.script.hs) (first run) +# checking that we detect when the same config is imported via many different paths +# cabal v2-build +Warning: 2 imports of woops-4.config; + woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 3 imports of woops-6.config; + woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 4 imports of woops-8.config; + woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.script.hs + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 2 imports of woops/woops-3.config; + woops/woops-3.config + imported by: woops-0.script.hs + woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 3 imports of woops/woops-5.config; + woops/woops-5.config + imported by: woops-0.script.hs + woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 4 imports of woops/woops-7.config; + woops/woops-7.config + imported by: woops-0.script.hs + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 5 imports of woops/woops-9.config; + woops/woops-9.config + imported by: woops-0.script.hs + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.script.hs + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Warning: 25 imports of www-stackage-org/lts-21.25.config; + www-stackage-org/lts-21.25.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs + www-stackage-org/lts-21.25.config + imported by: woops/woops-9.config + imported by: woops-8.config + imported by: woops/woops-7.config + imported by: woops-6.config + imported by: woops/woops-5.config + imported by: woops-4.config + imported by: woops/woops-3.config + imported by: woops-2.config + imported by: woops/woops-1.config + imported by: woops-0.script.hs +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following would be built: + - fake-package-0 (exe:script-woops-0.script.hs) (first run) diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.test.hs b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.test.hs new file mode 100644 index 00000000000..fdd839b777f --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/cabal.test.hs @@ -0,0 +1,74 @@ +import Test.Cabal.Prelude +import Test.Cabal.OutputNormalizer +import Data.Function ((&)) +import Data.Functor ((<&>)) +import Data.List (isInfixOf) + +-- The project is named yops as it is like hops but with y's for forks. +-- +-- yops-0.project +-- +-- yops/yops-1.config +-- +-- yops-2.config +-- +-- yops/yops-3.config +-- +-- yops-4.config +-- +-- yops/yops-5.config +-- +-- yops-6.config +-- +-- yops/yops-7.config +-- +-- yops-8.config +-- +-- yops/yops-9.config (no further imports) +-- +-- yops/yops-3.config +-- +-- yops-4.config +-- +-- yops/yops-5.config +-- +-- yops-6.config +-- +-- yops/yops-7.config +-- +-- yops-8.config +-- +-- yops/yops-9.config (no further imports) +-- +-- yops/yops-5.config +-- +-- yops-6.config +-- +-- yops/yops-7.config +-- +-- yops-8.config +-- +-- yops/yops-9.config (no further imports) +-- +-- yops/yops-7.config +-- +-- yops-8.config +-- +-- yops/yops-9.config (no further imports) +-- +-- yops/yops-9.config (no further imports) +main = do + -- NOTE: Options are --project-file-parser= + cabalTest' "parser-legacy" $ recordTest (yProjectOpts "legacy") (wProjectOpts "legacy") + cabalTest' "parser-default" $ recordTest (yProjectOpts "default") (wProjectOpts "default") + cabalTest' "parser-parsec" $ recordTest (yProjectOpts "parsec") (wProjectOpts "parsec") + cabalTest' "parser-fallback" $ recordTest (yProjectOpts "fallback") (wProjectOpts "fallback") + + cabalTest' "script-parser-legacy" $ recordTest (yScriptOpts "legacy") (wScriptOpts "legacy") + cabalTest' "script-parser-default" $ recordTest (yScriptOpts "default") (wScriptOpts "default") + cabalTest' "script-parser-parsec" $ recordTest (yScriptOpts "parsec") (wScriptOpts "parsec") + cabalTest' "script-parser-fallback" $ recordTest (yScriptOpts "fallback") (wScriptOpts "fallback") + where + recordTest yOpts wOpts = recordMode RecordMarked $ runTest yOpts wOpts + log = recordHeader . pure + + yProjectOpts parser = [ "--project-file=yops-0.project", "--project-file-parser=" ++ parser, "--dry-run" ] + wProjectOpts parser = [ "--project-file=woops-0.project", "--project-file-parser=" ++ parser, "--dry-run" ] + yScriptOpts parser = [ "yops-0.script.hs", "--project-file-parser=" ++ parser, "--dry-run" ] + wScriptOpts parser = [ "woops-0.script.hs", "--project-file-parser=" ++ parser, "--dry-run" ] + + runTest yOpts wOpts = do + log "checking that we detect when the same config is imported via many different paths" + yopping <- cabal' "v2-build" yOpts + assertOutputContains "Warning: 2 imports of yops-4.config" yopping + assertOutputContains "Warning: 3 imports of yops-6.config" yopping + assertOutputContains "Warning: 4 imports of yops-8.config" yopping + assertOutputContains ("Warning: 2 imports of " ++ ("yops" "yops-3.config")) yopping + assertOutputContains ("Warning: 3 imports of " ++ ("yops" "yops-5.config")) yopping + assertOutputContains ("Warning: 4 imports of " ++ ("yops" "yops-7.config")) yopping + assertOutputContains ("Warning: 5 imports of " ++ ("yops" "yops-9.config")) yopping + + log "checking that we detect when the same config is imported via many different paths" + wooping <- cabal' "v2-build" wOpts + assertOutputContains "Warning: 2 imports of woops-4.config" wooping + assertOutputContains "Warning: 3 imports of woops-6.config" wooping + assertOutputContains "Warning: 4 imports of woops-8.config" wooping + assertOutputContains ("Warning: 2 imports of " ++ ("woops" "woops-3.config")) wooping + assertOutputContains ("Warning: 3 imports of " ++ ("woops" "woops-5.config")) wooping + assertOutputContains ("Warning: 4 imports of " ++ ("woops" "woops-7.config")) wooping + assertOutputContains ("Warning: 5 imports of " ++ ("woops" "woops-9.config")) wooping + assertOutputContains ("Warning: 25 imports of " ++ ("www-stackage-org" "lts-21.25.config")) wooping diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/foo.cabal b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/foo.cabal new file mode 100644 index 00000000000..232f27167bd --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/foo.cabal @@ -0,0 +1,9 @@ +name: foo +version: 0.1 +license: BSD3 +cabal-version: >=1.2 +build-type: Simple + +library + exposed-modules: Foo + build-depends: base diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops-0.project b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops-0.project new file mode 100644 index 00000000000..79933c8c1cb --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops-0.project @@ -0,0 +1,7 @@ +packages: . + +import: woops/woops-1.config +import: woops/woops-3.config +import: woops/woops-5.config +import: woops/woops-7.config +import: woops/woops-9.config diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops-0.script.hs b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops-0.script.hs new file mode 100644 index 00000000000..4c00db118ce --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops-0.script.hs @@ -0,0 +1,14 @@ +#!/usr/bin/env cabal +{- cabal: +build-depends: base +-} +{- project: +import: woops/woops-1.config +import: woops/woops-3.config +import: woops/woops-5.config +import: woops/woops-7.config +import: woops/woops-9.config +-} + +main :: IO () +main = putStrLn "woops project imports" diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops-2.config b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops-2.config new file mode 100644 index 00000000000..bfcc9f5ca03 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops-2.config @@ -0,0 +1,2 @@ +import: woops/woops-3.config +import: www-stackage-org/lts-21.25.config diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops-4.config b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops-4.config new file mode 100644 index 00000000000..5e72539b5bd --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops-4.config @@ -0,0 +1,2 @@ +import: woops/woops-5.config +import: www-stackage-org/lts-21.25.config diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops-6.config b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops-6.config new file mode 100644 index 00000000000..ee6648a8e90 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops-6.config @@ -0,0 +1,2 @@ +import: woops/woops-7.config +import: www-stackage-org/lts-21.25.config diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops-8.config b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops-8.config new file mode 100644 index 00000000000..9310455c702 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops-8.config @@ -0,0 +1,2 @@ +import: woops/woops-9.config +import: www-stackage-org/lts-21.25.config diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops/woops-1.config b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops/woops-1.config new file mode 100644 index 00000000000..a01c49aef77 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops/woops-1.config @@ -0,0 +1,2 @@ +import: ../woops-2.config +import: ../www-stackage-org/lts-21.25.config diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops/woops-3.config b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops/woops-3.config new file mode 100644 index 00000000000..9e595466161 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops/woops-3.config @@ -0,0 +1,3 @@ +import: ../woops-4.config +import: ../www-stackage-org/lts-21.25.config + diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops/woops-5.config b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops/woops-5.config new file mode 100644 index 00000000000..712d0dd962d --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops/woops-5.config @@ -0,0 +1,2 @@ +import: ../woops-6.config +import: ../www-stackage-org/lts-21.25.config diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops/woops-7.config b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops/woops-7.config new file mode 100644 index 00000000000..c6e8daa30df --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops/woops-7.config @@ -0,0 +1,2 @@ +import: ../woops-8.config +import: ../www-stackage-org/lts-21.25.config diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops/woops-9.config b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops/woops-9.config new file mode 100644 index 00000000000..8f9ed87a8ad --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/woops/woops-9.config @@ -0,0 +1,2 @@ +-- No imports here +import: ../www-stackage-org/lts-21.25.config diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/www-stackage-org/lts-21.25.config b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/www-stackage-org/lts-21.25.config new file mode 100644 index 00000000000..6fd532310d8 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/www-stackage-org/lts-21.25.config @@ -0,0 +1,47 @@ +-- NOTE: This file is intentionally gutted of contents to save space in our Git +-- repository. When it had been commited in full as downloaded, on the +-- development branch before squashing, I checked with Git on how big this data +-- file is, uncompressed and stored: +-- +-- $ git hash-object cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/www-stackage-org/lts-21.25.config +-- 04f7e085d85d4479df8a828d9faff56ce1ddc728 +-- +-- $ git cat-file -s 04f7e085d85d4479df8a828d9faff56ce1ddc728 +--108495 +-- +-- $ echo 04f7e085d85d4479df8a828d9faff56ce1ddc728 | git cat-file --batch-check='%(objectsize:disk)' +-- 6010 +-- +-- The point of having a project whole *.config file from Stackage was to show +-- that parsing a project import has a cost. Typically, the snapshot `*.config` +-- files Stackage provides for Cabal are quite big and costly to import. We +-- shouldn't be importing them more than once. + +-- Duplicate imports by way of unique import paths are checked for after +-- parsing. I'd initially proposed that all duplicate imports should trigger an +-- error but reviewers wanted a warning instead for those imported by unique +-- import paths. Exact duplicate imports by the same path are still checked for +-- at parsing and stop parsing with an error. +-- +-- If you wish to see how bad it could get, either replace this file's contents +-- with one downloaded from Stackage (you may then need to comment out its +-- with-compiler field) or import from stackage from this file. Uncomment the +-- next line to do the latter: +-- import: https://www.stackage.org/lts-21.25/cabal.config + +-- With the above import uncommented, doing a dry run build takes noticable time +-- when there are 25 imports from Stackage: +-- +-- $ time cabal build all --dry-run --project-file=woops-0.project --project-file-parser=parsec +-- ... +-- Warning: 25 imports of https://www.stackage.org/lts-21.25/cabal.config; +-- ... +-- Executed in 15.97 secs +-- +-- $ time cabal build all --dry-run --project-file=woops-0.project --project-file-parser=legacy +-- ... +-- Warning: 25 imports of https://www.stackage.org/lts-21.25/cabal.config; +-- ... +-- Executed in 14.10 secs + +constraints: base installed diff --git a/cabal-testsuite/PackageTests/ConditionalAndImport/yops-0.project b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops-0.project similarity index 100% rename from cabal-testsuite/PackageTests/ConditionalAndImport/yops-0.project rename to cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops-0.project diff --git a/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops-0.script.hs b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops-0.script.hs new file mode 100644 index 00000000000..69f52e46caf --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops-0.script.hs @@ -0,0 +1,14 @@ +#!/usr/bin/env cabal +{- cabal: +build-depends: base +-} +{- project: +import: yops/yops-1.config +import: yops/yops-3.config +import: yops/yops-5.config +import: yops/yops-7.config +import: yops/yops-9.config +-} + +main :: IO () +main = putStrLn "yops project imports" diff --git a/cabal-testsuite/PackageTests/ConditionalAndImport/yops-2.config b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops-2.config similarity index 100% rename from cabal-testsuite/PackageTests/ConditionalAndImport/yops-2.config rename to cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops-2.config diff --git a/cabal-testsuite/PackageTests/ConditionalAndImport/yops-4.config b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops-4.config similarity index 100% rename from cabal-testsuite/PackageTests/ConditionalAndImport/yops-4.config rename to cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops-4.config diff --git a/cabal-testsuite/PackageTests/ConditionalAndImport/yops-6.config b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops-6.config similarity index 100% rename from cabal-testsuite/PackageTests/ConditionalAndImport/yops-6.config rename to cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops-6.config diff --git a/cabal-testsuite/PackageTests/ConditionalAndImport/yops-8.config b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops-8.config similarity index 100% rename from cabal-testsuite/PackageTests/ConditionalAndImport/yops-8.config rename to cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops-8.config diff --git a/cabal-testsuite/PackageTests/ConditionalAndImport/yops/yops-1.config b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops/yops-1.config similarity index 100% rename from cabal-testsuite/PackageTests/ConditionalAndImport/yops/yops-1.config rename to cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops/yops-1.config diff --git a/cabal-testsuite/PackageTests/ConditionalAndImport/yops/yops-3.config b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops/yops-3.config similarity index 100% rename from cabal-testsuite/PackageTests/ConditionalAndImport/yops/yops-3.config rename to cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops/yops-3.config diff --git a/cabal-testsuite/PackageTests/ConditionalAndImport/yops/yops-5.config b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops/yops-5.config similarity index 100% rename from cabal-testsuite/PackageTests/ConditionalAndImport/yops/yops-5.config rename to cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops/yops-5.config diff --git a/cabal-testsuite/PackageTests/ConditionalAndImport/yops/yops-7.config b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops/yops-7.config similarity index 100% rename from cabal-testsuite/PackageTests/ConditionalAndImport/yops/yops-7.config rename to cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops/yops-7.config diff --git a/cabal-testsuite/PackageTests/ConditionalAndImport/yops/yops-9.config b/cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops/yops-9.config similarity index 100% rename from cabal-testsuite/PackageTests/ConditionalAndImport/yops/yops-9.config rename to cabal-testsuite/PackageTests/ProjectImport/UniquePathDuplicates/yops/yops-9.config diff --git a/changelog.d/pr-9933 b/changelog.d/pr-9933 new file mode 100644 index 00000000000..f8566f80747 --- /dev/null +++ b/changelog.d/pr-9933 @@ -0,0 +1,26 @@ +packages: cabal-install-solver cabal-install +significance: significant +prs: #9578 #9933 +issues: #9562 +synopsis: Detect non-cyclical duplicate project imports +description: + Detect and report on duplicate imports that are non-cyclical. Give more detail + when reporting duplicate imports. + + ``` + $ cabal build --project-file=cabal.project + ... + Warning: 2 imports of config/config-3.config; + config/config-3.config + imported by: cabal.project + config/config-3.config + imported by: config-2.config + imported by: config/config-1.config + imported by: cabal.project + ``` + + Move these types and functions from `cabal-install-solver` to `cabal-install`: + + - `docProjectConfigFiles` + - `cyclicalImportMsg` + - `untrimmedUriImportMsg`