Add proper default 'nix' prefix to search paths

The search path of Nix contains by default the "nix" prefix that points
to $datadir/nix/corepkgs, where $datadir defaults to $prefix/lib at
installation time, but can be overriden by NIX_DATA_DIR.

We implemented it using `Paths.hnix.getDataDir` and `NIX_DATA_DIR` to
follow Nix behaviour as closely as possible.

A small discrepancy is that we do the lookup on each invocation, where
Nix caches the searchPath at context creation.
This commit is contained in:
Guillaume Maudoux 2019-11-25 16:30:29 +01:00 committed by John Wiegley
parent 21c3c9c938
commit 4ded48a789
6 changed files with 26 additions and 14 deletions

View file

@ -97,7 +97,7 @@ import Nix.Value
import Nix.Value.Equal import Nix.Value.Equal
import Nix.Value.Monad import Nix.Value.Monad
import Nix.XML import Nix.XML
import System.Nix.Base32 as Base32 import System.Nix.Base32 as Base32
import System.FilePath import System.FilePath
import System.Posix.Files ( isRegularFile import System.Posix.Files ( isRegularFile
, isDirectory , isDirectory
@ -322,12 +322,17 @@ foldNixPath f z = do
dirs <- case mres of dirs <- case mres of
Nothing -> return [] Nothing -> return []
Just v -> demand v $ fromValue . Deeper 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 foldrM go z
$ map (fromInclude . principledStringIgnoreContext) dirs $ map (fromInclude . principledStringIgnoreContext) dirs
++ case menv of ++ case mPath of
Nothing -> [] Nothing -> []
Just str -> uriAwareSplit (Text.pack str) Just str -> uriAwareSplit (Text.pack str)
++ [ fromInclude $ Text.pack $ "nix=" ++ dataDir ++ "/nix/corepkgs" ]
where where
fromInclude x | "://" `Text.isInfixOf` x = (x, PathEntryURI) fromInclude x | "://" `Text.isInfixOf` x = (x, PathEntryURI)
| otherwise = (x, PathEntryPath) | otherwise = (x, PathEntryPath)

View file

@ -28,6 +28,7 @@ import Nix.Parser
import Nix.Render import Nix.Render
import Nix.Utils import Nix.Utils
import Nix.Value import Nix.Value
import qualified Paths_hnix
import qualified System.Directory as S import qualified System.Directory as S
import System.Environment import System.Environment
import System.Exit import System.Exit
@ -42,6 +43,7 @@ class (MonadFile m,
MonadPutStr m, MonadPutStr m,
MonadHttp m, MonadHttp m,
MonadEnv m, MonadEnv m,
MonadPaths m,
MonadInstantiate m, MonadInstantiate m,
MonadExec m, MonadExec m,
MonadIntrospect m) => MonadEffects t f m where MonadIntrospect m) => MonadEffects t f m where
@ -166,6 +168,14 @@ instance MonadEnv IO where
"i386" -> "i686" "i386" -> "i686"
arch -> arch 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 class Monad m => MonadHttp m where
getURL :: Text -> m (Either ErrorCall StorePath) getURL :: Text -> m (Either ErrorCall StorePath)
default getURL :: (MonadTrans t, MonadHttp m', m ~ t m') => Text -> m (Either ErrorCall StorePath) default getURL :: (MonadTrans t, MonadHttp m', m ~ t m') => Text -> m (Either ErrorCall StorePath)

View file

@ -24,6 +24,7 @@ instance MonadStore m => MonadStore (StdIdT m) where
instance MonadPutStr m => MonadPutStr (StdIdT m) instance MonadPutStr m => MonadPutStr (StdIdT m)
instance MonadHttp m => MonadHttp (StdIdT m) instance MonadHttp m => MonadHttp (StdIdT m)
instance MonadEnv m => MonadEnv (StdIdT m) instance MonadEnv m => MonadEnv (StdIdT m)
instance MonadPaths m => MonadPaths (StdIdT m)
instance MonadInstantiate m => MonadInstantiate (StdIdT m) instance MonadInstantiate m => MonadInstantiate (StdIdT m)
instance MonadExec m => MonadExec (StdIdT m) instance MonadExec m => MonadExec (StdIdT m)

View file

@ -55,6 +55,7 @@ import System.Console.Haskeline.MonadException hiding(catch)
deriving instance MonadPutStr (t (Fix1 t)) => MonadPutStr (Fix1 t) deriving instance MonadPutStr (t (Fix1 t)) => MonadPutStr (Fix1 t)
deriving instance MonadHttp (t (Fix1 t)) => MonadHttp (Fix1 t) deriving instance MonadHttp (t (Fix1 t)) => MonadHttp (Fix1 t)
deriving instance MonadEnv (t (Fix1 t)) => MonadEnv (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 MonadInstantiate (t (Fix1 t)) => MonadInstantiate (Fix1 t)
deriving instance MonadExec (t (Fix1 t)) => MonadExec (Fix1 t) deriving instance MonadExec (t (Fix1 t)) => MonadExec (Fix1 t)
deriving instance MonadIntrospect (t (Fix1 t)) => MonadIntrospect (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 MonadPutStr (t (Fix1T t m) m) => MonadPutStr (Fix1T t m)
deriving instance MonadHttp (t (Fix1T t m) m) => MonadHttp (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 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 MonadInstantiate (t (Fix1T t m) m) => MonadInstantiate (Fix1T t m)
deriving instance MonadExec (t (Fix1T t m) m) => MonadExec (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) deriving instance MonadIntrospect (t (Fix1T t m) m) => MonadIntrospect (Fix1T t m)
@ -139,6 +141,7 @@ instance ( MonadFix m
, MonadFile m , MonadFile m
, MonadCatch m , MonadCatch m
, MonadEnv m , MonadEnv m
, MonadPaths m
, MonadExec m , MonadExec m
, MonadHttp m , MonadHttp m
, MonadInstantiate m , MonadInstantiate m
@ -224,6 +227,7 @@ instance MonadTrans (StandardTF r) where
instance (MonadPutStr r, MonadPutStr m) => MonadPutStr (StandardTF r m) instance (MonadPutStr r, MonadPutStr m) => MonadPutStr (StandardTF r m)
instance (MonadHttp r, MonadHttp m) => MonadHttp (StandardTF r m) instance (MonadHttp r, MonadHttp m) => MonadHttp (StandardTF r m)
instance (MonadEnv r, MonadEnv m) => MonadEnv (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 (MonadInstantiate r, MonadInstantiate m) => MonadInstantiate (StandardTF r m)
instance (MonadExec r, MonadExec m) => MonadExec (StandardTF r m) instance (MonadExec r, MonadExec m) => MonadExec (StandardTF r m)
instance (MonadIntrospect r, MonadIntrospect m) => MonadIntrospect (StandardTF r m) instance (MonadIntrospect r, MonadIntrospect m) => MonadIntrospect (StandardTF r m)

View file

@ -96,6 +96,7 @@ main = do
pwd <- getCurrentDirectory pwd <- getCurrentDirectory
setEnv "NIX_REMOTE" ("local?root=" ++ pwd ++ "/") setEnv "NIX_REMOTE" ("local?root=" ++ pwd ++ "/")
setEnv "NIX_DATA_DIR" (pwd ++ "/data")
defaultMain $ testGroup "hnix" $ defaultMain $ testGroup "hnix" $
[ ParserTests.tests [ ParserTests.tests

View file

@ -147,7 +147,7 @@ assertEval _opts files = do
[".exp.disabled"] -> return () [".exp.disabled"] -> return ()
[".exp-disabled"] -> return () [".exp-disabled"] -> return ()
[".exp", ".flags"] -> do [".exp", ".flags"] -> do
liftIO $ unsetEnv "NIX_PATH" liftIO $ setEnv "NIX_PATH" "lang/dir4:lang/dir5"
flags <- Text.readFile (name ++ ".flags") flags <- Text.readFile (name ++ ".flags")
let flags' | Text.last flags == '\n' = Text.init flags let flags' | Text.last flags == '\n' = Text.init flags
| otherwise = flags | otherwise = flags
@ -163,16 +163,7 @@ assertEval _opts files = do
++ name ++ name
++ ".flags: " ++ ".flags: "
++ show err ++ show err
Opts.Success opts' -> assertLangOk Opts.Success opts' -> assertLangOk opts' name
(opts'
{ include = include opts'
++ [ "nix=../../../../data/nix/corepkgs"
, "lang/dir4"
, "lang/dir5"
]
}
)
name
Opts.CompletionInvoked _ -> error "unused" Opts.CompletionInvoked _ -> error "unused"
_ -> assertFailure $ "Unknown test type " ++ show files _ -> assertFailure $ "Unknown test type " ++ show files
where where