find sandbox from an environment variable #1800

Closed
redneb opened this Issue Apr 21, 2014 · 2 comments

Projects

None yet

3 participants

@redneb
redneb commented Apr 21, 2014

Currently, sandbox aware commands (such as cabal install) look for a sandbox in the current directory. I think it would be nice if there was an environment variable (e.g. CABAL_SANDBOX_PATH) that cabal examines in order to determine the path of the sandbox. This would allow a sandbox to be used while working in a directory different than the one where cabal sandbox init was issued from.

Here's an example scenario:

mkdir -p /tmp/dir1/dir2
cd /tmp/dir1
cabal sandbox init
cabal exec bash
cd dir2
cabal install somepackage

With cabal 1.20, the last command will install the package in ~/.cabal, despite the fact that we are inside a cabal exec environment.

hsenv handles the above situation nicely; once you enter an hsenv environment, you can issue a cabal install from any directory.

@tibbe
Member
tibbe commented Apr 21, 2014

You can set CABAL_SANDBOX_CONFIG to point to a sandbox config located elsewhere. The config points to the package DB.

That being said, this looks like a bug in exec. It is supposed to set an environment variable that makes sure GHC uses the sandbox's package DB for installs.

/cc @benarmston

@benarmston
Contributor

I can't reproduce the bug. Instead of installing cabal prints an error message and exits:

$ cabal install hlint
cabal: Use of GHC's environment variable GHC_PACKAGE_PATH is incompatible with
Cabal. Use the flag --package-db to specify a package database (it can be used
multiple times).

If I unset GHC_PACKAGE_PATH then I get the behaviour described in the bug: installs into the user database. If I then export CABAL_SANDBOX_CONFIG=/tmp/dir1/cabal.sandbox.config the install is into the sandbox.

So it would seem that we have two issues to fix here:

  1. Set the CABAL_SANDBOX_CONFIG variable when running cabal exec.
  2. Allow cabal to install into the sandbox when running under cabal exec. Perhaps instead of failing unconditionally if GHC_PACKAGE_PATH is set, we could check if CABAL_SANDBOX_CONFIG is also set and whether GHC_PACKAGE_PATH has the value that would be set for that sandbox.
@benarmston benarmston added a commit to benarmston/cabal that referenced this issue Dec 13, 2014
@benarmston benarmston cabal install can be used inside a cabal exec environment
Inside a cabal exec environment cabal should be configured to always use the
correct environment. When there is a sandbox this is addressed by setting the
CABAL_SANDBOX_CONFIG environment variable.

However GHC is configured to use the correct package database through setting
the GHC_PACKAGE_PATH environment variable to include the sandbox database. The
Cabal library previously refused to operate when GHC_PACKAGE_PATH is set in
order to avoid having a different view of the package databases to GHC.

In the case of a cabal exec environment being loaded for a cabal sandbox, it
is safe to allow the use of GHC_PACKAGE_PATH as it is being used to ensure
that GHC uses the same package database as cabal does.

A check is made that GHC_PACKAGE_PATH matches the value that cabal exec set it
to. If it does use of GHC through cabal is permitted.

Fixes #1800
462d505
@benarmston benarmston added a commit to benarmston/cabal that referenced this issue Dec 13, 2014
@benarmston benarmston cabal install can be used inside a cabal exec environment
Inside a cabal exec environment cabal should be configured to always use the
correct environment. When there is a sandbox this is addressed by setting the
CABAL_SANDBOX_CONFIG environment variable.

However GHC is configured to use the correct package database through setting
the GHC_PACKAGE_PATH environment variable to include the sandbox database. The
Cabal library previously refused to operate when GHC_PACKAGE_PATH is set in
order to avoid having a different view of the package databases to GHC.

In the case of a cabal exec environment being loaded for a cabal sandbox, it
is safe to allow the use of GHC_PACKAGE_PATH as it is being used to ensure
that GHC uses the same package database as cabal does.

A check is made that GHC_PACKAGE_PATH matches the value that cabal exec set it
to. If it does use of GHC through cabal is permitted.

Fixes #1800
edb3aab
@benarmston benarmston added a commit to benarmston/cabal that referenced this issue Dec 18, 2014
@benarmston benarmston cabal install can be used inside a cabal exec environment
Inside a cabal exec environment cabal should be configured to always use the
correct environment. When there is a sandbox this is addressed by setting the
CABAL_SANDBOX_CONFIG environment variable.

However GHC is configured to use the correct package database through setting
the GHC_PACKAGE_PATH environment variable to include the sandbox database. The
Cabal library previously refused to operate when GHC_PACKAGE_PATH is set in
order to avoid having a different view of the package databases to GHC.

In the case of a cabal exec environment being loaded for a cabal sandbox, it
is safe to allow the use of GHC_PACKAGE_PATH as it is being used to ensure
that GHC uses the same package database as cabal does.

A check is made that GHC_PACKAGE_PATH matches the value that cabal exec set it
to. If it does use of GHC through cabal is permitted.

Fixes #1800
0a4aed4
@tibbe tibbe closed this in #2270 Dec 19, 2014
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment