[commit: ghc] wip/nfs-locking: Adds Oracle (aff54c8)

git at git.haskell.org git at git.haskell.org
Fri Oct 27 00:29:44 UTC 2017


Repository : ssh://git@git.haskell.org/ghc

On branch  : wip/nfs-locking
Link       : http://ghc.haskell.org/trac/ghc/changeset/aff54c850f52d875105564d9ef2ec5662cc6c5b2/ghc

>---------------------------------------------------------------

commit aff54c850f52d875105564d9ef2ec5662cc6c5b2
Author: Moritz Angermann <moritz.angermann at gmail.com>
Date:   Thu Jan 7 18:47:46 2016 +0800

    Adds Oracle


>---------------------------------------------------------------

aff54c850f52d875105564d9ef2ec5662cc6c5b2
 shaking-up-ghc.cabal           |  2 +-
 src/Oracles.hs                 |  2 ++
 src/Oracles/AbsoluteCommand.hs | 40 ++++++++++++++++++++++++++++++++++++++++
 src/Oracles/WindowsRoot.hs     | 13 +------------
 src/Rules/Oracles.hs           | 15 ++++++++-------
 5 files changed, 52 insertions(+), 20 deletions(-)

diff --git a/shaking-up-ghc.cabal b/shaking-up-ghc.cabal
index f9990e9..96efe57 100644
--- a/shaking-up-ghc.cabal
+++ b/shaking-up-ghc.cabal
@@ -22,6 +22,7 @@ executable ghc-shake
                        , Expression
                        , GHC
                        , Oracles
+                       , Oracles.AbsoluteCommand
                        , Oracles.ArgsHash
                        , Oracles.Config
                        , Oracles.Config.Flag
@@ -114,7 +115,6 @@ executable ghc-shake
                        , extra >= 1.4
                        , mtl >= 2.2
                        , shake >= 0.15
-                       , split >= 0.2
                        , transformers >= 0.4
                        , unordered-containers >= 0.2
     default-language:    Haskell2010
diff --git a/src/Oracles.hs b/src/Oracles.hs
index b77a786..07e92f2 100644
--- a/src/Oracles.hs
+++ b/src/Oracles.hs
@@ -1,4 +1,5 @@
 module Oracles (
+    module Oracles.AbsoluteCommand,
     module Oracles.Config,
     module Oracles.Config.Flag,
     module Oracles.Config.Setting,
@@ -8,6 +9,7 @@ module Oracles (
     module Oracles.WindowsRoot
     ) where
 
+import Oracles.AbsoluteCommand
 import Oracles.Config
 import Oracles.Config.Flag
 import Oracles.Config.Setting
diff --git a/src/Oracles/AbsoluteCommand.hs b/src/Oracles/AbsoluteCommand.hs
new file mode 100644
index 0000000..23de6ff
--- /dev/null
+++ b/src/Oracles/AbsoluteCommand.hs
@@ -0,0 +1,40 @@
+{-# LANGUAGE DeriveDataTypeable, GeneralizedNewtypeDeriving #-}
+module Oracles.AbsoluteCommand (
+    lookupInPath, absoluteCommandOracle
+    ) where
+
+import Base
+
+newtype AbsoluteCommand = AbsoluteCommand String
+    deriving (Show, Typeable, Eq, Hashable, Binary, NFData)
+
+absoluteCommand :: String -> Action String
+absoluteCommand = askOracle . AbsoluteCommand
+
+-- | Lookup a @command@ in @PATH@ environment.
+lookupInPath :: FilePath -> Action FilePath
+lookupInPath c
+    | c /= takeFileName c = return c
+    | otherwise           = absoluteCommand c
+
+-- | Split function. Splits a string @s@ into chunks
+-- when the predicate @p@ holds. See: http://stackoverflow.com/a/4981265
+wordsWhen :: (Char -> Bool) -> String -> [String]
+wordsWhen p s =
+    case dropWhile p s of
+        "" -> []
+        s' -> w : wordsWhen p s''
+            where (w, s'') = break p s'
+
+
+absoluteCommandOracle :: Rules ()
+absoluteCommandOracle = do
+    o <- newCache $ \c -> do
+        envPaths <- wordsWhen (== ':') <$> getEnvWithDefault "" "PATH"
+        let candidates = map (-/- c) envPaths
+        -- this will crash if we do not find any valid candidate.
+        fullCommand <- head <$> filterM doesFileExist candidates
+        putOracle $ "Found '" ++ c ++ "' at " ++ "'" ++ fullCommand ++ "'"
+        return fullCommand
+    _ <- addOracle $ \(AbsoluteCommand c) -> o c
+    return ()
diff --git a/src/Oracles/WindowsRoot.hs b/src/Oracles/WindowsRoot.hs
index 4186700..413f289 100644
--- a/src/Oracles/WindowsRoot.hs
+++ b/src/Oracles/WindowsRoot.hs
@@ -1,10 +1,9 @@
 {-# LANGUAGE DeriveDataTypeable, GeneralizedNewtypeDeriving #-}
 module Oracles.WindowsRoot (
-    windowsRoot, fixAbsolutePathOnWindows, lookupInPath, topDirectory, windowsRootOracle
+    windowsRoot, fixAbsolutePathOnWindows, topDirectory, windowsRootOracle
     ) where
 
 import Data.Char (isSpace)
-import Data.List.Split (splitOn)
 import Base
 import Oracles.Config.Setting
 
@@ -39,16 +38,6 @@ fixAbsolutePathOnWindows path = do
     else
         return path
 
--- | Lookup a @command@ in @PATH@ environment.
-lookupInPath :: FilePath -> Action FilePath
-lookupInPath c
-    | c /= takeFileName c = return c
-    | otherwise = do
-        envPaths <- splitOn ":" <$> getEnvWithDefault "" "PATH"
-        let candidates = map (-/- c) envPaths
-        -- this will crash if we do not find any valid candidate.
-        head <$> filterM doesFileExist candidates
-
 -- Oracle for windowsRoot. This operation requires caching as looking up
 -- the root is slow (at least the current implementation).
 windowsRootOracle :: Rules ()
diff --git a/src/Rules/Oracles.hs b/src/Rules/Oracles.hs
index 92e8a40..a4d6c70 100644
--- a/src/Rules/Oracles.hs
+++ b/src/Rules/Oracles.hs
@@ -7,10 +7,11 @@ import Oracles.ModuleFiles
 
 oracleRules :: Rules ()
 oracleRules = do
-    argsHashOracle     -- see Oracles.ArgsHash
-    configOracle       -- see Oracles.Config
-    dependenciesOracle -- see Oracles.Dependencies
-    moduleFilesOracle  -- see Oracles.ModuleFiles
-    packageDataOracle  -- see Oracles.PackageData
-    packageDepsOracle  -- see Oracles.PackageDeps
-    windowsRootOracle  -- see Oracles.WindowsRoot
+    absoluteCommandOracle -- see Oracles.WindowsRoot
+    argsHashOracle        -- see Oracles.ArgsHash
+    configOracle          -- see Oracles.Config
+    dependenciesOracle    -- see Oracles.Dependencies
+    moduleFilesOracle     -- see Oracles.ModuleFiles
+    packageDataOracle     -- see Oracles.PackageData
+    packageDepsOracle     -- see Oracles.PackageDeps
+    windowsRootOracle     -- see Oracles.WindowsRoot



More information about the ghc-commits mailing list