diff --git a/src/Nix/Builtins.hs b/src/Nix/Builtins.hs index 5565872..c25c12e 100644 --- a/src/Nix/Builtins.hs +++ b/src/Nix/Builtins.hs @@ -97,7 +97,7 @@ import Nix.Value import Nix.Value.Equal import Nix.Value.Monad import Nix.XML -import System.Nix.Base32 as Base32 +import System.Nix.Base32 as Base32 import System.FilePath import System.Posix.Files ( isRegularFile , isDirectory @@ -322,12 +322,17 @@ foldNixPath f z = do dirs <- case mres of Nothing -> return [] Just v -> demand v $ fromValue . Deeper - menv <- getEnvVar "NIX_PATH" + mPath <- getEnvVar "NIX_PATH" + mDataDir <- getEnvVar "NIX_DATA_DIR" + dataDir <- case mDataDir of + Nothing -> getDataDir + Just dataDir -> return dataDir foldrM go z $ map (fromInclude . principledStringIgnoreContext) dirs - ++ case menv of + ++ case mPath of Nothing -> [] Just str -> uriAwareSplit (Text.pack str) + ++ [ fromInclude $ Text.pack $ "nix=" ++ dataDir ++ "/nix/corepkgs" ] where fromInclude x | "://" `Text.isInfixOf` x = (x, PathEntryURI) | otherwise = (x, PathEntryPath) diff --git a/src/Nix/Effects.hs b/src/Nix/Effects.hs index f1572cc..f7e737c 100644 --- a/src/Nix/Effects.hs +++ b/src/Nix/Effects.hs @@ -28,6 +28,7 @@ import Nix.Parser import Nix.Render import Nix.Utils import Nix.Value +import qualified Paths_hnix import qualified System.Directory as S import System.Environment import System.Exit @@ -42,6 +43,7 @@ class (MonadFile m, MonadPutStr m, MonadHttp m, MonadEnv m, + MonadPaths m, MonadInstantiate m, MonadExec m, MonadIntrospect m) => MonadEffects t f m where @@ -166,6 +168,14 @@ instance MonadEnv IO where "i386" -> "i686" arch -> arch +class Monad m => MonadPaths m where + getDataDir :: m FilePath + default getDataDir :: (MonadTrans t, MonadPaths m', m ~ t m') => m FilePath + getDataDir = lift getDataDir + +instance MonadPaths IO where + getDataDir = Paths_hnix.getDataDir + class Monad m => MonadHttp m where getURL :: Text -> m (Either ErrorCall StorePath) default getURL :: (MonadTrans t, MonadHttp m', m ~ t m') => Text -> m (Either ErrorCall StorePath) diff --git a/src/Nix/Fresh/Basic.hs b/src/Nix/Fresh/Basic.hs index b1c9d50..33882f3 100644 --- a/src/Nix/Fresh/Basic.hs +++ b/src/Nix/Fresh/Basic.hs @@ -24,6 +24,7 @@ instance MonadStore m => MonadStore (StdIdT m) where instance MonadPutStr m => MonadPutStr (StdIdT m) instance MonadHttp m => MonadHttp (StdIdT m) instance MonadEnv m => MonadEnv (StdIdT m) +instance MonadPaths m => MonadPaths (StdIdT m) instance MonadInstantiate m => MonadInstantiate (StdIdT m) instance MonadExec m => MonadExec (StdIdT m) diff --git a/src/Nix/Standard.hs b/src/Nix/Standard.hs index d1a4c3b..cdd2a71 100644 --- a/src/Nix/Standard.hs +++ b/src/Nix/Standard.hs @@ -55,6 +55,7 @@ import System.Console.Haskeline.MonadException hiding(catch) deriving instance MonadPutStr (t (Fix1 t)) => MonadPutStr (Fix1 t) deriving instance MonadHttp (t (Fix1 t)) => MonadHttp (Fix1 t) deriving instance MonadEnv (t (Fix1 t)) => MonadEnv (Fix1 t) +deriving instance MonadPaths (t (Fix1 t)) => MonadPaths (Fix1 t) deriving instance MonadInstantiate (t (Fix1 t)) => MonadInstantiate (Fix1 t) deriving instance MonadExec (t (Fix1 t)) => MonadExec (Fix1 t) deriving instance MonadIntrospect (t (Fix1 t)) => MonadIntrospect (Fix1 t) @@ -62,6 +63,7 @@ deriving instance MonadIntrospect (t (Fix1 t)) => MonadIntrospect (Fix1 t) deriving instance MonadPutStr (t (Fix1T t m) m) => MonadPutStr (Fix1T t m) deriving instance MonadHttp (t (Fix1T t m) m) => MonadHttp (Fix1T t m) deriving instance MonadEnv (t (Fix1T t m) m) => MonadEnv (Fix1T t m) +deriving instance MonadPaths (t (Fix1T t m) m) => MonadPaths (Fix1T t m) deriving instance MonadInstantiate (t (Fix1T t m) m) => MonadInstantiate (Fix1T t m) deriving instance MonadExec (t (Fix1T t m) m) => MonadExec (Fix1T t m) deriving instance MonadIntrospect (t (Fix1T t m) m) => MonadIntrospect (Fix1T t m) @@ -139,6 +141,7 @@ instance ( MonadFix m , MonadFile m , MonadCatch m , MonadEnv m + , MonadPaths m , MonadExec m , MonadHttp m , MonadInstantiate m @@ -224,6 +227,7 @@ instance MonadTrans (StandardTF r) where instance (MonadPutStr r, MonadPutStr m) => MonadPutStr (StandardTF r m) instance (MonadHttp r, MonadHttp m) => MonadHttp (StandardTF r m) instance (MonadEnv r, MonadEnv m) => MonadEnv (StandardTF r m) +instance (MonadPaths r, MonadPaths m) => MonadPaths (StandardTF r m) instance (MonadInstantiate r, MonadInstantiate m) => MonadInstantiate (StandardTF r m) instance (MonadExec r, MonadExec m) => MonadExec (StandardTF r m) instance (MonadIntrospect r, MonadIntrospect m) => MonadIntrospect (StandardTF r m) diff --git a/tests/Main.hs b/tests/Main.hs index 43b0eaf..206e62d 100644 --- a/tests/Main.hs +++ b/tests/Main.hs @@ -96,6 +96,7 @@ main = do pwd <- getCurrentDirectory setEnv "NIX_REMOTE" ("local?root=" ++ pwd ++ "/") + setEnv "NIX_DATA_DIR" (pwd ++ "/data") defaultMain $ testGroup "hnix" $ [ ParserTests.tests diff --git a/tests/NixLanguageTests.hs b/tests/NixLanguageTests.hs index c6af57d..c38d613 100644 --- a/tests/NixLanguageTests.hs +++ b/tests/NixLanguageTests.hs @@ -147,7 +147,7 @@ assertEval _opts files = do [".exp.disabled"] -> return () [".exp-disabled"] -> return () [".exp", ".flags"] -> do - liftIO $ unsetEnv "NIX_PATH" + liftIO $ setEnv "NIX_PATH" "lang/dir4:lang/dir5" flags <- Text.readFile (name ++ ".flags") let flags' | Text.last flags == '\n' = Text.init flags | otherwise = flags @@ -163,16 +163,7 @@ assertEval _opts files = do ++ name ++ ".flags: " ++ show err - Opts.Success opts' -> assertLangOk - (opts' - { include = include opts' - ++ [ "nix=../../../../data/nix/corepkgs" - , "lang/dir4" - , "lang/dir5" - ] - } - ) - name + Opts.Success opts' -> assertLangOk opts' name Opts.CompletionInvoked _ -> error "unused" _ -> assertFailure $ "Unknown test type " ++ show files where