Add missing path unifications.
authorAndrey Mokhov <andrey.mokhov@gmail.com>
Thu, 12 May 2016 00:05:08 +0000 (01:05 +0100)
committerAndrey Mokhov <andrey.mokhov@gmail.com>
Thu, 12 May 2016 00:05:08 +0000 (01:05 +0100)
src/Oracles/ModuleFiles.hs
src/Rules/Data.hs
src/Rules/Selftest.hs

index e77d2ba..233cdc0 100644 (file)
@@ -28,20 +28,22 @@ determineBuilder file = case takeExtension file of
 
 -- | Given a module name extract the directory and file name, e.g.:
 --
--- > decodeModule "Data.Functor.Identity" == ("Data/Functor/", "Identity")
--- > decodeModule "Prelude"               == ("./", "Prelude")
+-- > decodeModule "Data.Functor.Identity" == ("Data/Functor", "Identity")
+-- > decodeModule "Prelude"               == ("", "Prelude")
 decodeModule :: String -> (FilePath, String)
-decodeModule = splitFileName . replaceEq '.' '/'
+decodeModule modName = (intercalate "/" (init xs), last xs)
+  where
+    xs = words $ replaceEq '.' ' ' modName
 
 -- | Given the directory and file name find the corresponding module name, e.g.:
 --
--- > encodeModule "Data/Functor/" "Identity.hs" == "Data.Functor.Identity"
--- > encodeModule "./" "Prelude"                == "Prelude"
--- > uncurry encodeModule (decodeModule name)   == name
+-- > encodeModule "Data/Functor" "Identity.hs" == "Data.Functor.Identity"
+-- > encodeModule "" "Prelude"                 == "Prelude"
+-- > uncurry encodeModule (decodeModule name)  == name
 encodeModule :: FilePath -> String -> String
 encodeModule dir file
-    | dir == "./" = replaceEq '/' '.' $        takeBaseName file
-    | otherwise   = replaceEq '/' '.' $ dir ++ takeBaseName file
+    | dir == "" =                                takeBaseName file
+    | otherwise = replaceEq '/' '.' dir ++ '.' : takeBaseName file
 
 -- | Find the generator for a given 'Context' and a source file. For example:
 -- findGenerator (Context Stage1 compiler vanilla)
@@ -102,7 +104,7 @@ moduleFilesOracle = void $ do
         result <- fmap concat . forM dirs $ \dir -> do
             todo <- filterM (doesDirectoryExist . (dir -/-) . fst) modDirFiles
             forM todo $ \(mDir, mFiles) -> do
-                let fullDir = dir -/- mDir
+                let fullDir = unifyPath $ dir -/- mDir
                 files <- getDirectoryFiles fullDir ["*"]
                 let noBoot   = filter (not . (isSuffixOf "-boot")) files
                     cmp fe f = compare (dropExtension fe) f
index 719352f..f901069 100644 (file)
@@ -44,7 +44,8 @@ buildPackageData context@Context {..} = do
         copyFile inTreeMk mk
         autogenFiles <- getDirectoryFiles (oldPath -/- "build") ["autogen/*"]
         createDirectory $ buildPath context -/- "autogen"
-        forM_ autogenFiles $ \file -> do
+        forM_ autogenFiles $ \file' -> do
+            let file = unifyPath file'
             copyFile (oldPath -/- "build" -/- file) (buildPath context -/- file)
         let haddockPrologue = "haddock-prologue.txt"
         copyFile (oldPath -/- haddockPrologue) (buildPath context -/- haddockPrologue)
@@ -111,7 +112,8 @@ buildPackageData context@Context {..} = do
                           ++ [ "posix" | not windows ]
                           ++ [ "win32" |     windows ]
                 -- TODO: adding cmm/S sources to C_SRCS is a hack; rethink after #18
-                cSrcs   <- getDirectoryFiles (pkgPath package) (map (-/- "*.c") dirs)
+                cSrcs   <- map unifyPath <$>
+                           getDirectoryFiles (pkgPath package) (map (-/- "*.c") dirs)
                 cmmSrcs <- getDirectoryFiles (pkgPath package) ["*.cmm"]
                 buildAdjustor   <- anyTargetArch ["i386", "powerpc", "powerpc64"]
                 buildStgCRunAsm <- anyTargetArch ["powerpc64le"]
index 8037682..9ba4524 100644 (file)
@@ -61,11 +61,11 @@ testMatchVersionedFilePath = do
 testModuleNames :: Action ()
 testModuleNames = do
     putBuild $ "==== Encode/decode module name"
-    test $ encodeModule "Data/Functor/" "Identity.hs" == "Data.Functor.Identity"
-    test $ encodeModule "./" "Prelude"                == "Prelude"
+    test $ encodeModule "Data/Functor" "Identity.hs" == "Data.Functor.Identity"
+    test $ encodeModule "" "Prelude"                 == "Prelude"
 
-    test $ decodeModule "Data.Functor.Identity" == ("Data/Functor/", "Identity")
-    test $ decodeModule "Prelude"               == ("./", "Prelude")
+    test $ decodeModule "Data.Functor.Identity" == ("Data/Functor", "Identity")
+    test $ decodeModule "Prelude"               == ("", "Prelude")
 
     test $ forAll names $ \n -> uncurry encodeModule (decodeModule n) == n
   where