on master help sign in
Module name conflict detection
commit7fbe8df701e72411e532ba86862caa92ef36ef1c authorMichael Snoyman <michael@snoyman.com> dateTue 18 Feb 2014, 16:30 (13 years ago) parent1aad1de
4 files changed+61
.gitignore+1 Stackage/Build.hs+7 Stackage/ModuleNameConflict.hs+52 stackage.cabal+1
.gitignore+1
@@ -15,3 +15,4 @@ cabal-dev
1515/logs-tools/
1616build-plan.txt
1717hackage-map.txt
18+module-name-conflicts.txt
Stackage/Build.hs+7
@@ -9,12 +9,14 @@ import Prelude hiding (pi)
99import Stackage.CheckCabalVersion (checkCabalVersion)
1010import Stackage.Config
1111import Stackage.InstallInfo
12+import Stackage.ModuleNameConflict
1213import Stackage.Types
1314import Stackage.Util
1415import System.Exit (ExitCode (ExitSuccess), exitWith)
1516import System.IO (BufferMode (NoBuffering),
1617 IOMode (WriteMode), hPutStrLn,
1718 hSetBuffering, withBinaryFile)
19+import qualified System.IO.UTF8
1820import System.Process (rawSystem, runProcess,
1921 waitForProcess)
2022
@@ -104,3 +106,8 @@ build settings' bp = do
104106 unless (ec == ExitSuccess) $ do
105107 putStrLn "Build failed, please see build.log"
106108 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
1515 exposed-modules: Stackage.NarrowDatabase
1616 Stackage.LoadDatabase
1717 Stackage.HaskellPlatform
18+ Stackage.ModuleNameConflict
1819 Stackage.Util
1920 Stackage.Types
2021 Stackage.Config