on master help sign in
Module name conflict detection
7fbe8dfMichael Snoyman
.gitignore+1
@@ -15,3 +15,4 @@ cabal-dev
15/logs-tools/
15/logs-tools/
16build-plan.txt
16build-plan.txt
17hackage-map.txt
17hackage-map.txt
18+module-name-conflicts.txt
Stackage/Build.hs+7
@@ -9,12 +9,14 @@ import Prelude hiding (pi)
9import Stackage.CheckCabalVersion (checkCabalVersion)
9import Stackage.CheckCabalVersion (checkCabalVersion)
10import Stackage.Config
10import Stackage.Config
11import Stackage.InstallInfo
11import Stackage.InstallInfo
12+import Stackage.ModuleNameConflict
12import Stackage.Types
13import Stackage.Types
13import Stackage.Util
14import Stackage.Util
14import System.Exit (ExitCode (ExitSuccess), exitWith)
15import System.Exit (ExitCode (ExitSuccess), exitWith)
15import System.IO (BufferMode (NoBuffering),
16import System.IO (BufferMode (NoBuffering),
16 IOMode (WriteMode), hPutStrLn,
17 IOMode (WriteMode), hPutStrLn,
17 hSetBuffering, withBinaryFile)
18 hSetBuffering, withBinaryFile)
19+import qualified System.IO.UTF8
18import System.Process (rawSystem, runProcess,
20import System.Process (rawSystem, runProcess,
19 waitForProcess)
21 waitForProcess)
20
22
@@ -104,3 +106,8 @@ build settings' bp = do
104 unless (ec == ExitSuccess) $ do
106 unless (ec == ExitSuccess) $ do
105 putStrLn "Build failed, please see build.log"
107 putStrLn "Build failed, please see build.log"
106 exitWith ec
108 exitWith ec
109+
110+ putStrLn "Build completed successfully, checking for module name conflicts"
111+ conflicts <- getModuleNameConflicts $ packageDir settings
112+ System.IO.UTF8.writeFile "module-name-conflicts.txt"
113+ $ renderModuleNameConflicts conflicts
Stackage/ModuleNameConflict.hsnew file+52
@@ -0,0 +1,52 @@
1+module Stackage.ModuleNameConflict
2+ ( ModuleNameConflicts
3+ , getModuleNameConflicts
4+ , renderModuleNameConflicts
5+ , parseModuleNameConflicts
6+ ) where
7+
8+import Distribution.Simple.Configure (configCompiler, getInstalledPackages)
9+import Distribution.Simple.Compiler (CompilerFlavor (GHC), PackageDB (GlobalPackageDB, SpecificPackageDB))
10+import Distribution.Verbosity (normal)
11+import Distribution.Simple.Program (defaultProgramConfiguration)
12+import Distribution.Simple.PackageIndex (moduleNameIndex)
13+import Distribution.InstalledPackageInfo (sourcePackageId)
14+import Distribution.Package (PackageIdentifier (PackageIdentifier), PackageName (PackageName))
15+import qualified Data.Map as Map
16+import qualified Data.Set as Set
17+import Data.List (intercalate)
18+import Distribution.ModuleName (components)
19+
20+type ModuleNameConflicts = Map.Map (Set.Set String) (Set.Set String)
21+
22+getModuleNameConflicts :: FilePath -> IO ModuleNameConflicts
23+getModuleNameConflicts path = do
24+ (compiler, progConfig) <-
25+ configCompiler (Just GHC) Nothing Nothing defaultProgramConfiguration normal
26+ let stack =
27+ [ GlobalPackageDB
28+ , SpecificPackageDB path
29+ ]
30+ packageIndex <- getInstalledPackages normal compiler stack progConfig
31+ let modMap = moduleNameIndex packageIndex
32+ packageName (PackageIdentifier (PackageName x) _) = x
33+ simpleMN = intercalate "." . components
34+ overlaps = Map.unionsWith Set.union
35+ $ map (\(mn, pkgs) -> Map.singleton pkgs (Set.singleton $ simpleMN mn))
36+ $ Map.toList
37+ $ Map.filter (\x -> Set.size x > 1)
38+ $ Map.map Set.fromList
39+ $ fmap (map (packageName . sourcePackageId)) modMap
40+ return overlaps
41+
42+renderModuleNameConflicts :: ModuleNameConflicts -> String
43+renderModuleNameConflicts =
44+ unlines . map (unwords . Set.toList) . concatMap (\(x, y) -> [x, y]) . Map.toList
45+
46+parseModuleNameConflicts :: String -> ModuleNameConflicts
47+parseModuleNameConflicts =
48+ Map.fromList . toPairs . map (Set.fromList . words) . lines
49+ where
50+ toPairs [] = []
51+ toPairs [_] = []
52+ toPairs (x:y:z) = (x, y) : toPairs z
stackage.cabal+1
@@ -15,6 +15,7 @@ library
15 exposed-modules: Stackage.NarrowDatabase
15 exposed-modules: Stackage.NarrowDatabase
16 Stackage.LoadDatabase
16 Stackage.LoadDatabase
17 Stackage.HaskellPlatform
17 Stackage.HaskellPlatform
18+ Stackage.ModuleNameConflict
18 Stackage.Util
19 Stackage.Util
19 Stackage.Types
20 Stackage.Types
20 Stackage.Config
21 Stackage.Config